DBSCAN:Density-Based Spatial Clustering of Applications with Noise,基于密度和带有噪声点的聚类。
DBSCAN算法与K-MEANS算法一样,没有数学原理上的推导,理解起来比较容易。K-MEANS算法可以处理简单的数据集,对于复杂数据集的分类效果并不好,DBSCAN则可以处理更为复杂的数据集。
1.DBSCAN基本概念
1.核心对象:若某个点的密度达到算法设定的阈值则其为核心点。(即r邻域内点的数量不小于minPts)。假设r = 10,minPts = 4,如果a点的r范围内的点的数量>=4,则a点可以称之为核心点。
2.直接密度可达:若某点p在q的r邻域内,且q是核心点,则p-q为直接密度可达。
3.密度可达:若有一个点的序列q0、q1......qk,对任意qi - qi-1是直接密度可达的,则称q0 - qk是密度可达。
4.密度相连:若从某核心点出发,点q和k是密度可达的,则称点q和点k是密度相连的。
5.边界点:属于某一个类的非核心点,它的r邻域内点的数量小于minPts。
6.噪音点:不属于任何一个类簇的点,从任何一个核心点出发都是密度不可达的。
下图中,A为核心点,B,C为边界点,N为离群点(噪音点)。
2.DBSCAN算法的工作流程
先找到第一个核心点A(符合r邻域minPts的要求),然后查找A的r邻域中的其他点是不是核心点,如果是继续向外扩散,直到所有点都无法向外扩散,则这组数据就为同一类。
3.DBSCAN API文档
sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric='euclidean', algorithm='auto',
leaf_size=30, p=None, random_state=None)
关键参数说明:
eps:浮点型数值,默认为0.5,eps就是我们所说的r邻域(r半径)。
min_samples:整型,默认为5,样本点个数。
4.DBSCAN 算法样例演示
from numpy as np
from sklearn.cluster import DBSCAN
#随机创建一些样本点
X = np.array([[1,6],[2,4],[7,2],[8,5],[9,3],[5,3]])
db = DBSCAN(eps=3,min_samples=5).fit(X)
db.labels_
[0, 0, 1, 1, 1, 1]
#使用db算法对未知数据进行分类
db.fit_predict([[1,4]])
[-1]
5.聚类算法的模型评估
轮廓系数:
代码实现:
from sklearn.metrics import silhouette_score
#labels为分类的结果
score = silhouette_score(X,labels)