layout | title | categories | tags | keywords | description | order |
---|---|---|---|---|---|---|
post |
【DBSCAN】理论与实现 |
0x32_聚类 |
304 |
密度聚类 是一种聚类模型,其思想是,只要样本点的密度大于某个阈值,则将该样本添加到最近的簇中。
优点:
- 可以处理形状和大小的簇
- 对噪音不敏感
缺点:
- 计算复杂度大
- 如果簇的密度变化太大时,会有麻烦
- 对于高维问题,密度定义是个比较麻烦的问题
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
核心点(core point) : 半径Eps内含有超过MinPts数目的点
边界点(border point) : 半径Eps内的点的数量少于MinPts,但是 核心点 的邻居
噪音点 : 不是核心点或边界点的点
直接密度可达 : p在q的Eps-邻域内,q是核心点,叫做$q \to p$直接密度可达
密度可达
:
密度相连 : 如果对于$p,q$, 存在$o$, 使得$o \to p,o\to q$密度可达,那么叫做$p,q$密度相连
数据准备
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()