DBSCAN:具有噪声的基于密度的聚类方法。从名字中就可以看出来,簇划分是根据样本密度来决定的。
ϵ ϵ ϵ-邻域:样本 x x x以 ϵ ϵ ϵ为半径的范围内包含的所有样本的集合,这个集合称为 x x x的 ϵ ϵ ϵ-邻域。
核心对象:样本 x x x的ϵ-领域内样本数大于阈值MinPts,则 x x x为核心对象。
直接密度可达:若某点 p p p在点 q q q的 ϵ ϵ ϵ-邻域内,且 q q q是核心对象,则 p p p由 q q q直接密度可达。
密度可达:有序列点 q 1 , q 2 , q 3 , . . . , q k q_{1},q_{2},q_{3},...,q_{k} q1,q2,q3,...,qk,其中, q t q_{t} qt由 q t − 1 q_{t-1} qt−1直接密度可达,则称 q k q_{k} qk由 q 0 q_{0} q0密度可达。
密度相连:若从某核心点 p p p出发,点 q q q和点 k k k都是和 p p p密度可达的 ,则称点 q q q和点 k k k是密度相连的。
明白了以上概念,就明白了DBSCAN的基本思想:由密度可达导出的最大密度相连的集合作为一个簇。
(1)将所有的样本标记为未访问状态。
(2)随机选择一个未访问对象 p p p,将其标记为已访问。
(3)如果 p p p为核心对象,创建一个新簇 C C C,将 p p p的 ϵ ϵ ϵ-邻域添加到 C C C中。
(4)对于 C C C中的每一个样本 q q q,如果 q q q为核心对象,遍历其 ϵ ϵ ϵ-邻域内的所有样本 x x x:
a.如果 x x x未被访问,则标记为已访问,将 x x x添加到 C C C中。
b.如果 x x x已被访问但是不属于任何一个簇,将 x x x添加到 C C C中。
c.对 C C C中的每个元素重复步骤a、b。
(5)重复(2)到(4),直到没有未被访问的样本。
(6)输出所有簇划分。
生成数据。3000个样本,内外比例为0.3,高斯噪声为0.05。
from sklearn.datasets import make_circles
import matplotlib.pylab as plt
x,y=make_circles(n_samples=3000,factor=0.3,noise=0.05)
plt.scatter(x[:,0],x[:,1])
plt.show()
使用2个质心的kmeans算法
from sklearn.cluster import KMeans
model1 = KMeans(n_clusters=2)
y_pred = model1.fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=y_pred)
plt.show()
使用邻域为0.2的DBSCAN算法
使用邻域为0.2的DBSCAN算法
from sklearn.cluster import DBSCAN
y_pred2 = DBSCAN(eps=0.2).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=y_pred2)
plt.show()