DBSCAN_dbscan聚类

(3) 2024-05-24 16:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说DBSCAN_dbscan聚类,希望能够帮助你!!!。

DBSCAN

算法将具有足够高密度的区域划分为簇,并可 以发现任何形状的聚类

DBSCAN_dbscan聚类_https://bianchenghao6.com/blog__第1张

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_dbscan聚类_https://bianchenghao6.com/blog__第2张

形象来说,我们可以认为这是系统在众多样本点中随机选中一个,围绕这个被选中的样本点画一个圆,规定这个圆的半径以及圆内最少包含的样本点,如果在指定半径内有足够多的样本点在内,那么这个圆圈的圆心就转移到这个内部样本点,继续去圈附近其它的样本点,类似传销一样,继续去发展下线。等到这个滚来滚去的圈发现所圈住的样本点数量少于预先指定的值,就停止了。那么我们称最开始那个点为核心点,如A,停下来的那个点为边界点,如B、C,没得滚的那个点为离群点,如N

DBSCAN算法可视化

https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/

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

缺点:

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

DBSCAN和K-MEANS比较:

  • DBSCAN不需要输入聚类个数。
  • 聚类簇的形状没有要求。
  • 可以在需要时输入过滤噪声的参数。
DBSCAN算法sklearn实现

示例一

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)

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

DBSCAN_dbscan聚类_https://bianchenghao6.com/blog__第3张

示例二

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

x1, y1 = datasets.make_circles(n_samples=2000, factor=0.5, noise=0.05)
x2, y2 = datasets.make_blobs(n_samples=1000, centers=[[1.2,1.2]], cluster_std=[[.1]])

x = np.concatenate((x1, x2))
plt.scatter(x[:, 0], x[:, 1], marker='o')
plt.show()

DBSCAN_dbscan聚类_https://bianchenghao6.com/blog__第4张
使用K-Means算法时不能很好的聚类

from sklearn.cluster import KMeans
y_pred = KMeans(n_clusters=3).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()

DBSCAN_dbscan聚类_https://bianchenghao6.com/blog__第5张

而使用DBSCAN能很好的聚类

from sklearn.cluster import DBSCAN

y_pred = DBSCAN(eps = 0.2, min_samples=50).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()

DBSCAN_dbscan聚类_https://bianchenghao6.com/blog__第6张

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复