【DBSCAN】理论与实现



2017年11月28日    Author:Guofei

文章归类: 0x32_聚类    文章编号: 304

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2017/11/28/dbscan.html


模型介绍

密度聚类 是一种聚类模型,其思想是,只要样本点的密度大于某个阈值,则将该样本添加到最近的簇中。

优点:

  • 可以处理形状和大小的簇
  • 对噪音不敏感

缺点:

  • 计算复杂度大
  • 如果簇的密度变化太大时,会有麻烦
  • 对于高维问题,密度定义是个比较麻烦的问题

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)

DBSCAN

核心点(core point) : 半径Eps内含有超过MinPts数目的点

边界点(border point)
半径Eps内的点的数量少于MinPts,但是 核心点 的邻居
噪音点
不是核心点或边界点的点
直接密度可达
p在q的Eps-邻域内,q是核心点,叫做$q \to p$直接密度可达
密度可达
$p_1p_2…p_n$,度过$p_i \to p_{i+1}$直接密度可达,那么叫做$p_1 \to p_n$密度可达
密度相连
如果对于$p,q$, 存在$o$, 使得$o \to p,o\to q$密度可达,那么叫做$p,q$密度相连

Python实现

数据准备

import sklearn.datasets
data,target=sklearn.datasets.make_moons(n_samples=500,noise=0.04,shuffle=True)

建模

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.3, min_samples=6)
dbscan.fit(data)

DBSCAN(algorithm=’auto’, eps=0.3, leaf_size=30, metric=’euclidean’, metric_params=None, min_samples=6, n_jobs=1, p=None)

结果

dbscan.labels_ # 有lable=-1的情况,这是噪音点
import matplotlib.pyplot as plt
label=dbscan.labels_
for i in [0,1]:
    plt.plot(data[label==i,0],data[label==i,1],'.')
plt.show()

dbscan.png

参考资料


您的支持将鼓励我继续创作!