DBSCAN聚类算法的原理及sklearn的演示

概念:基于密度的带有噪声点的聚类方法。
内部概念理解
1.核心对象:若某个点的密度达到算法设定的阈值则称为核心点。
2.距离阈值:设定的半径r。
3.直接密度可达:若某点p在点q的r邻域内,且q是核心密度点,则pq直接密度可达。
4.密度可达:直接密度可达的相互传播。
5.密度相连:若从某核心点q出发,点p和k都能与q核心密度可达,则p和k是密度相连的。
6.边界点:属于某个类的非核心点,不能发展下线。
7.噪声点:不属于任何一个类簇的点,从任何一个点出发都不可能密度可达
DBSCAN聚类算法的原理及sklearn的演示_第1张图片

工作流程如下:

  1. 标记所有对象是unvisited
  2. 随机选择一个unvisited的对象p,把他变成visited
  3. 如果p某个半径长度r的邻域内至少有m个对象。
  4. 创建新簇C,然后把p加入到C中;
  5. 令N为p的半径r的邻域内的所有对象集合。
  6. 对N中的每个点s,如果s是unvisted的,把它变为visited,如果s的r邻域内至少有m个对象,把这些对象添加到N,如果s不是任何簇的成员,将其添加到C,然后输出C
  7. 如果第三步没有那么多对象,将其变成噪声点。
  8. 然后不断循环。
    程序中需要选择的参数:
    半径,和半径中的最少对象m数。
    DBSCAN的优势:
    不需要指定簇个数,可以发现任意形状的簇,擅长找到离群点
    DBSCAN的缺点:
    高维度的数据计算慢(可以做降维,和数据消减),参数难以选择
    DBSCAN聚类算法的原理及sklearn的演示_第2张图片
    python代码实现:
    分类鸢尾花数。
from sklearn import datasets  
import pandas  as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import DBSCAN
iris=datasets.load_iris()
iris_x=iris.data[:,2:4]#z只取后两个维度

构造聚类器

estimator = DBSCAN(eps=0.5,min_samples=3)#构造聚类器,一个参数是半径,一个是密度
estimator.fit(iris_x)
label_pred = estimator.labels_ #获取聚类标签
#绘制k-means结果
x0 = iris_x[label_pred == 0]
x1 = iris_x[label_pred == 1]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')  
plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='*', label='label1')   
plt.show()  

画图:
DBSCAN聚类算法的原理及sklearn的演示_第3张图片
对于不规则样本分类DBSCAN效果更好,但是对于一般有规则便于区分的样本,有时候可能不如kmeans

你可能感兴趣的:(DBSCAN)