DBSCAN 具有噪声的基于密度的聚类算法简述 附Python代码
程序员文章站
2022-07-14 11:40:22
...
DBSCAN
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法。
基本概念:
所需参数:
半径:Eps
Eps半径内指定的数目(阈值):MinPts
数据点分为三:
1. 核心点:在半径Eps内含有超过MinPts数目的点
2. 边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
3. 噪音点:既不是核心点也不是边界点的点
2. 边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
3. 噪音点:既不是核心点也不是边界点的点
概念:
1. Eps领域:半径Eps之内所有点的合集
2. 直接密度可达(密度直达):核心点X1对Eps领域内的任意点都是直接密度可达
3. 密度可达:设数据点点序列p(1),p(2),p(3),…,p(n),其中p(1)是核心对象,p(2)是从p(1)出发直接密度可达,p(n)从p(1)出发是密度可达的
基本步骤:
算法优点:
1. 不需要如同K-means一样设置初始类别个数
2. 可以对任意形状的稠密数据集进行聚类
3. 对噪点有抗性
4. 结果不会有偏倚(不是指每次结果完全一样,而是大部分相同,不排除个别点)
算法缺点:
1. 数据密度不均匀时难以使用
2. 样本集越大,收敛时间越长,可用K-D树进行优化
3. Eps,MinPts阈值难以界定,可用绘制k-距离曲线等方法界定
Python代码:
from sklearn.datasets.samples_generator import make_moons
import matplotlib.pyplot as plt
import time
from sklearn.cluster import KMeans
from sklearn.cluster import DBSCAN
X,y_true = make_moons(n_samples=1000,noise=0.15)
plt.scatter(X[:,0],X[:,1],c=y_true)
plt.show()
#Kmeans
t0 = time.time()
kmeans = KMeans(init = 'k-means++',n_clusters=2, random_state=8).fit(X)
t = time.time() - t0
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.title('time : %f'%t)
plt.show()
#DBSCAN
t0 = time.time()
dbscan = DBSCAN(eps=.1,min_samples=6).fit(X)
t = time.time()-t0
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_)
plt.title('time : %f'%t)
plt.show()
随机数据:
K-means聚类:
DBSCAN聚类:
上一篇: 失误—倒数352天
下一篇: MarkDown基本操作