密度聚类

本文详细介绍了DBSCAN聚类算法的原理和步骤,包括计算欧几里德距离、k-距离、确定半径Eps和最小点数量MinPts。通过绘制k-距离曲线来寻找合适的Eps,然后计算核心点并连通生成簇。文章还讨论了不同Eps和MinPts值对聚类效果的影响,指出DBSCAN算法适用于发现任意形状的簇,并需要根据实际情况调整参数。
摘要由CSDN通过智能技术生成

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚类算法,它是一种基于高密度连通区域的、基于密度的聚类算法,能够将具有足够高密度的区域划分为簇,并在具有噪声的数据中发现任意形状的簇。我们总结一下DBSCAN聚类算法原理的基本要点:

  • DBSCAN算法需要选择一种距离度量,对于待聚类的数据集中,任意两个点之间的距离,反映了点之间的密度,说明了点与点是否能够聚到同一类中。由于DBSCAN算法对高维数据定义密度很困难,所以对于二维空间中的点,可以使用欧几里德距离来进行度量。
  • DBSCAN算法需要用户输入2个参数:一个参数是半径(Eps),表示以给定点P为中心的圆形邻域的范围;另一个参数是以点P为中心的邻域内最少点的数量(MinPts)。如果满足:以点P为中心、半径为Eps的邻域内的点的个数不少于MinPts,则称点P为核心点。
  • DBSCAN聚类使用到一个k-距离的概念,k-距离是指:给定数据集P={p(i); i=0,1,…n},对于任意点P(i),计算点P(i)到集合D的子集S={p(1), p(2), …, p(i-1), p(i+1), …, p(n)}中所有点之间的距离,距离按照从小到大的顺序排序,假设排序后的距离集合为D={d(1), d(2), …, d(k-1), d(k), d(k+1), …,d(n)},则d(k)就被称为k-距离。也就是说,k-距离是点p(i)到所有点(除了p(i)点)之间距离第k近的距离。对待聚类集合中每个点p(i)都计算k-距离,最后得到所有点的k-距离集合E={e(1), e(2), …, e(n)}。
  • 根据经验计算半径Eps:根据得到的所有点的k-距离集合E,对集合E进行升序排序后得到k-距离集合E’,需要拟合一条排序后的E’集合中k-距离的变化曲线图,然后绘出曲线,通过观察,将急剧发生变化的位置所对应的k-距离的值,确定为半径Eps的值。
  • 根据经验计算最少点的数量MinPts:确定MinPts的大小,实际上也是确定k-距离中k的值,DBSCAN算法取k=4,则MinPts=4。
  • 另外,如果觉得经验值聚类的结果不满意,可以适当调整Eps和MinPts的值,经过多次迭代计算对比,选择最合适的参数值。可以看出,如果MinPts不变,Eps取得值过大,会导致大多数点都聚到同一个簇中,Eps过小,会导致已一个簇的分裂;如果Eps不变,MinPts的值取得过大,会导致同一个簇中点被标记为噪声点,MinPts过小,会导致发现大量的核心点。

我们需要知道的是,DBSCAN算法,需要输入2个参数,这两个参数的计算都来自经验知识。半径Eps的计算依赖于计算k-距离,DBSCAN取k=4,也就是设置MinPts=4,然后需要根据k-距离曲线,根据经验观察找到合适的半径Eps的值,下面的算法实现过程中,我们会详细说明。对于算法的实现,首先我们概要地描述一下实现的过程:

  1. 解析样本数据文件
  2. 计算每个点与其他所有点之间的欧几里德距离
  3. 计算每个点的k-距离值,并对所有点的k-距离集合进行升序排序,输出的排序后的k-距离值
  4. 将所有点的k-距离值,在Excel中用散点图显示k-距离变化趋势
  5. 根据散点图确定半径Eps的值
  6. 根据给定MinPts=4,以及半径Eps的值,计算所有核心点,并建立核心点与到核心点距离小于半径Eps的点的映射
  7. 根据得到的核心点集合,以及半径Eps的值,计算能够连通的核心点,得到噪声点
  8. 将能够连通的每一组核心点,以及到核心点距离小于半径Eps的点,都放到一起,形成一个簇
  9. 选择不同的半径Eps,使用DBSCAN算法聚类得到的一组簇及其噪声点,使用散点图对比聚类效果

然后,再详细描述聚类过程的具体实现。

计算欧几里德距离

我们使用的样本数据,来自一组经纬度坐标数据,数据文件格式类似如下所示:

116.389463     39.87194
116.389463     39.874577
116.312984     39.887419
116.382798     39.853576
116.496648     39.872999
116.436246     39.911165
116.622074     40.061037
116.599267     40.062485
116.441824     39.940168
116.599267     40.062485
116.402096     39.942057
116.37319     39.93428
116.327812     39.899396
116.374739     39.898751
116.287195     39.959335
116.513574     39.878222
116.474355     39.962825
116.400651     40.008559
... ...

我们需要做的首先就是,解析样本数据文件,将其转换成我们需要的表示形式,我们定义了Point2D类,代码如下所示:

package org.shirdrn.dm.clustering.common;
public class Point2D {
	protected final Double x;
	protected final Double y;
	public Point2D(
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值