机器学习15:聚类DBSCAN

旧城冷巷雨未停 提交于 2020-02-07 00:44:02

聚类DBSCAN

原理

𝛆邻域:给定对象半径𝜀内的区域称为该对象的𝜀邻域。
核心对象:如果给定 𝜀 邻域内的样本点数大于等于Minpoints,则该对象为核心对象。
直接密度可达:给定一个对象集合D,如果p在q的𝜀邻域内,且q是一个核心对象,则我们说对象p从q触发是直接密度可达的(directly density-reachable)。
密度可达:集合D,存在一个对象链p1,p2…pn,p1=q,pn=p,pi+1是从pi关于𝜀和Minpoints直接密度可达,则称点p是从q关于𝜀和Minpoints密度可达的。
密度相连:集合D存在点o,使得点p、q是从o关于𝜀和Minpoints密度可达的,那么点p、q是关于𝜀和Minpoints密度相连的。

DBSCAN算法思想
1.指定合适的𝜀和Minpoints。
2.计算所有的样本点,如果点p的𝜀邻域里有超过Minpoints个点,则创建一个以p为核心点的新族。
3.反复寻找这些核心点直接密度可达(之后可能是密度可达)的点,将其加入到相应的簇,对于核心点发生“密度相连”状况的簇,给予合并。
4.当没有新的点可以被添加到任何簇时,算法结束。

缺点
• 当数据量增大时,要求较大的内存支持I/O消耗也很大。
• 当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差。

DBSCAN和K-MEANS比较
• DBSCAN不需要输入聚类个数。
• 聚类簇的形状没有要求。
• 可以在需要时输入过滤噪声的参数。

算法实现

from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt

# 载入数据
data = np.genfromtxt("kmeans.txt", delimiter=" ")

# 训练模型
# eps距离阈值,min_samples核心对象在eps领域的样本数阈值
model = DBSCAN(eps=1.5, min_samples=4)
model.fit(data)

result = model.fit_predict(data)
result

array([ 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, -1, 2, 0,
1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1,
2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2,
3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64)

# 画出各个数据点,用不同颜色表示分类
mark = ['or', 'ob', 'og', 'oy', 'ok', 'om']
for i,d in enumerate(data):
    plt.plot(d[0], d[1], mark[result[i]])
    
plt.show()

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!