DBSCAN 具有噪声的基于密度的聚类算法简述 附Python代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jerry81333/article/details/75640140

DBSCAN 

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法。

基本概念:

所需参数:
半径:Eps
Eps半径内指定的数目(阈值):MinPts

数据点分为三:
1. 核心点:在半径Eps内含有超过MinPts数目的点
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聚类:


猜你喜欢

转载自blog.csdn.net/jerry81333/article/details/75640140