模型介绍
密度聚类 是一种聚类模型,其思想是,只要样本点的密度大于某个阈值,则将该样本添加到最近的簇中。
优点:
- 可以处理形状和大小的簇
- 对噪音不敏感
缺点:
- 计算复杂度大
- 如果簇的密度变化太大时,会有麻烦
- 对于高维问题,密度定义是个比较麻烦的问题
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()