DBSCAN聚类算法

本文深入解析DBSCAN密度聚类算法,介绍其通过邻域参数刻画样本分布,发现任意形状聚类的能力。阐述算法思想及实现过程,对比K-means在非凸数据集上的表现,展示参数选择对聚类效果的影响。

相关概念

是一种密度聚类算法,它基于一组"邻域" (neighborhood) 参数来刻画样本分布的紧密程度.。可在噪声的空间数据库中发现任意形状的聚类。

给定数据集D={x_{1}x_{2}...x_{m}},定义下面几个概念:

如下图: 

故DBSCAN "簇"定义为:由密度可达关系导出的最大的 密度相连样本集合。

那么如何找这个“簇”呢?

====》即是由 x 密度可达的所有样本组成的集合。

 

算法思想

DBSCAN 算法先任选数据集中的一个核心对象为"种子" (seed)再由此出发确定相应的聚类簇。如下描述:

(1)Repeat

(2)从数据库中抽出一个未处理的点;

(3)IF抽出的点是核心点 THEN 找出所有从该点密度可达的对象,形成一个簇;

(4)ELSE 抽出的点是边缘点(非核心对象),跳出本次循环,寻找下一个点;

(5)UNTIL 所有的点都被处理。

详细过程如下: 

聚类生成过程如下图: 

优缺点

缺点:

  1. DBSCAN对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数(如邻域半径,核心对象邻域内最小样本数等)的选择无规律可循,只能靠经验确定。

优点:

  1. 对于非凸数据集的聚类表现好

 

实现

from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
#准备数据
X1, y1=datasets.make_circles(n_samples=5000, factor=.6, noise=.05)
X2, y2 = datasets.make_blobs(n_samples=1000, n_features=2, centers=[[1.2,1.2]], cluster_std=[[.1]], random_state=9)
X = np.concatenate((X1, X2))
#开始聚类
y_pred = DBSCAN(eps = 0.1, min_samples = 10).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

 DBSCAN函数:eps是邻域半径,min_samples是该邻域内应有的最小样本数。其余参数时默认值就好。

DBSCAN效果

 

但是如果邻域半径和核心对象邻域内最小样本数等参数选取不好的话,则聚类效果会不一样,比如出现下面这种情况:

对于非凸数据集的聚类表现好,同样的数据如果采用k-means的话则是:

 

 


参考

  1. https://blog.csdn.net/u010670689/article/details/74936338(对比了DBSCAN和K-mean算法在处理特殊分布数据上的差异)

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值