【Python】sklearn机器学习之DBSCAN聚类_dbscan聚类算法 sklearn

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

基本原理

DBSCAN算法是比较经典的聚类算法了除了sklearn之外open3d这种常用的点云模块也提供了DBSCAN算法的实现例如Open3d数据滤波和点云分割

和其他聚类算法相比DBSCAN存在一种去中心化的特性即不存在一聚类中心这样做的好处是在面对不规则的数据时有着更好的聚类效果。

在DBSCAN算法中将数据点分为三类

  1. 核心点若样本 x i x_i xi ε \varepsilon ε邻域内至少包含了 M M M个点则为核心点
  2. 边界点若样本 x i x_i xi ε \varepsilon ε邻域内包含的点数小于 M M M但在其他核心点的 ε \varepsilon ε邻域内则为边界点
  3. 噪声既非核心点也非边界点则为噪声

常规的测试数据是体现不出DBSCAN的威力的为了测试DBSCAN比那种更关注全局数值的算法更优秀可以采用同心圆作为测试数据。下面对比DBSCAN和KMeans对这种数据的作用。

测试

from sklearn import datasets
from sklearn.cluster import DBSCAN, KMeans
import matplotlib.pyplot as plt
X, y = datasets.make_circles(n_samples=10000, factor=0.5, noise=0.05)
# 此为DBSCAN
dbModel = DBSCAN(eps = 0.1, min_samples = 2).fit(X)
kmModel = KMeans(2).fit(X)

fig = plt.figure()
ax = fig.add_subplot(121)
ax.scatter(X[:,0], X[:,1], c=dbModel.labels_, marker='.')

ax = fig.add_subplot(122)
ax.scatter(X[:,0], X[:,1], c=kmModel.labels_, marker='.')


plt.show()

效果如下可见DBSCAN将数据按照我们希望的方式进行聚类了。

在这里插入图片描述

构造函数

DBSCAN在sklearn中的构造函数为

DBSCAN(eps=0.5, *, min_samples=5, metric='euclidean', metric_params=None, algorithm='auto', leaf_size=30, p=None, n_jobs=None)

其各项参数含义如下

  • eps 即前面原理部分提到的 ε \varepsilon ε默认0.5。如果 ε \varepsilon ε过大会导致更多的点会落在核心对象的 ε \varepsilon ε-邻域导致最终得到的聚类簇较少。在上面的案例中如将eps设为0.5则无法完成上图那样的聚类。
  • min_samples 样本点要成为核心对象所需要的 ε \varepsilon ε-邻域的样本数阈值即前面原理部分中的 M M M默认为5。
  • metric最近邻距离度量参数默认欧式距离见后面的距离表
  • algorithm最近邻搜索算法参数其中brute为暴力搜索kd_tree为kd树实现ball_tree通过球树实现。默认auto为自动选择
  • leaf_size当使用kd_treeball_tree为最邻近算法时停止建子树的叶子节点数量的阈值。
  • p: 表示闵氏距离的p值p=1为曼哈顿距离p=2为欧式距离。

常见距离的定义

距离参数备注表达式
chebyshev切比雪夫距离 max ⁡ ( u ⃗ − v ⃗ ) \max(\vec u-\vec v) max(u v )
minkowski闵氏距离 ∥ u − v ∥ p \Vert u-v\Vert_p uvp
manhattan曼哈顿距离 ∑ ∣ u i − v i ∣ \sum\vert u_i-v_i\vert uivi
euclidean欧氏距离 ∥ u − v ∥ 2 \Vert u-v\Vert_2 uv2
seuclidean归一化欧式距离各特征纬度均值为0方差为1
mahalanobis马氏距离 ( x − y ) T S − 1 ( x − y ) \sqrt{(x-y)^TS^{-1}(x-y)} (xy)TS1(xy)
wminkowski加权闵氏距离 ∑ i = 1 n ( w ∣ x i − y i ∣ ) p p \sqrt[p]{\sum_{i=1}^n(w\vert x_i-y_i\vert)^p} pi=1n(wxiyi)p
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6