密度聚类,也被称为CFDP(Clustering by fast search and find of density peaksd)。

密度聚类的作用和Kmeans聚类差不多,可以将一堆数据分成若干类。“密度聚类”,顾名思义其实就是根据点的密度进行归类,比如说某一处点特别密集,那么这一块会偏向归为一类。这篇文章就具体整理一下密度聚类的原理与实现。

1.密度聚类实现过程

假设在一个二维平面中有若干个点,我们想要对这些点进行聚类,那么密度聚类的过程如下:

对于每一个点,我们需要计算这个点的“局部密度”与“局部距离”这两个变量。

局部密度:

局部密度取决于dc值,dc值是在密度聚类前人为指定的一个超参数,它是一个范围距离,那么某一个点的局部密度就是这个点周围dc范围内(即以这一点为圆心,dc为半径的圆)邻居点的个数。

关于dc值的选取,一般是选取一个值——该值使得所有数据点的平均邻居个数为总数据点的1-2%。

局部距离:

局部距离理解起来比局部密度要抽象一些,不能靠它的名称来理解。假设现在我们已经得到了所有点的局部密度,对于每一个点的局部距离来说:

1.对于局部密度最大的点(就只有那一个点),它的局部距离是该点和其他所有点距离的最大值。即到距离它最远点的距离。

2.对于非局部密度最大的点(剩下的所有的点),它的局部距离是:在比它局部密度高的所有点中,至离它最近的点的距离。

总距离:

至此,每个点的总距离=局部密度+局部距离。如果最终要将数据分成3类,那么总距离最大的前三个点,就是三个中心点,其余的点离哪一个点近,就归为哪一类。(所以其实“总距离”也可以说成是“总权重”,总权重越大就越有资格成为一个聚类中心。)密度聚类的实现过程就整理完毕了。

2.密度聚类原理分析与理解

接下来讲一下密度聚类这样做的原理是什么,为什么这样做就可以较好的实现出聚类的效果。这部分需要一些理解。

(其实理解密度聚类的精髓就是理解“总距离”尤其是“局部距离”的计算逻辑

一、对于局部密度最大的点,它必然是要成为一个中心的,因此我们直接赋予它最大的局部距离即可;这样会毫无疑问算出一个最大的总距离,毫无疑问出第一个中心。

二、而对于局部密度也很大但不是最大的点来说,一般有两种情况:

1.一种是它紧挨着局部密度最大点,此时我们肯定是希望这种点不要自成一个中心,而是附属于旁边那个局部密度最大点。为了实现这个要求,就让它后面的局部距离不要太大即可(这样总距离就不会太大),因此局部距离就选“在比它局部密度高的所有点中离它最近的点的距离”,这个距离必然是很小的。

2. 另一种情况就是它离局部密度最大点较远,此时它自己可能成为某一块的中心,此时易知它的局部距离按照给定的计算方法来说是很可观的(较大的),因此剩下的中心也基本上来自于这种点。

三、 对于局部密度比较少的点,这种点基本上最后的总距离不会很大,很难成为中心。但如果它离任何一个比它局部密度高的点都特别远,即局部距离很大,那么它也能算出很大的总距离,也会成为中心。

可见,对于种种情况,密度聚类算法通过局部密度和局部距离的计算,都可以自适应实现挑选聚类中心点的功能。既避免了在一处很密集的地方有多个中心,又赋予了偏远处点中出现中心的可能。)

3.密度聚类代码实现

密度聚类的原理讲完了,下面是我自己用python代码实现的简单密度聚类,并且可视化其聚类效果。在代码中,我在一个二维坐标平面上随机成500个数,并对这500个数进行CFDP聚类。

from matplotlib import pyplot as plt
import randomclass Dot():#定义一个点类def __init__(self,x,y):self.x = xself.y = yself.cut_off = 0 #邻居数,也就是局部密度self.distance = 0#距离self._class = Nonedef distance(x1,y1,x2,y2): #计算两点间距离的函数,直接用欧氏距离就好return (x1-x2)**2+(y1-y2)**2
dot_list=[] #用于存放所有点的列表
for i in range(500):    #随机生成500个点x = random.randint(1,200)y = random.randint(1,200)dot_list.append(Dot(x,y))#通过下面这一段来找到合适的dc值
# sum1 = 0
# for dot in dot_list:
#     sum1+=dot.cut_off
# print(sum1/500/500)#让每个数据点的平均邻居个数为总数居点的1%-2%#计算密度
dc = 120 #通过上面调试,dc值设定为120
for dot1 in dot_list:for dot2 in dot_list:if distance(dot1.x,dot2.x,dot1.y,dot2.y)==0:passelse:if distance(dot1.x,dot2.x,dot1.y,dot2.y)-dc<0:#增加dot1的局部密度dot1.cut_off+=1#计算距离
for dot1 in dot_list:#对于每一个点flag = 0#先假设是局部密度最大点min_distance=[]for dot2 in dot_list:if dot1.cut_off<dot2.cut_off:flag=1#不是局部密度最大点了min_distance.append(distance(dot1.x,dot2.x,dot1.y,dot2.y))#先暂存这个距离if flag==1:#不是局部密度最大点,dot1.distance=min(min_distance)#找出最近的那个点else:#仍然是局部密度最大点for dot2 in dot_list:if distance(dot1.x,dot2.x,dot1.y,dot2.y)>dot1.distance:
#更新dot1.distance到最大dot1.distance=distance(dot1.x,dot2.x,dot1.y,dot2.y)
dot_list.sort(key=lambda x:x.cut_off+x.distance,reverse=True)#按照总距离进行排序
# for dot in dot_list:
#     print(dot.cut_off)
class_num = 3 #假设我们要分成3类
dot_list[0]._class = 1#前三个分别就是三个中心
dot_list[1]._class = 2
dot_list[2]._class = 3
for dot in dot_list[3:]:#对于其他的点,离谁近就是哪一类if distance(dot.x,dot.y,dot_list[0].x,dot_list[0].y) == min(distance(dot.x,dot.y,dot_list[0].x,dot_list[0].y),distance(dot.x,dot.y,dot_list[1].x,dot_list[1].y),distance(dot.x,dot.y,dot_list[2].x,dot_list[2].y)):dot._class=1elif distance(dot.x,dot.y,dot_list[1].x,dot_list[1].y) == min(distance(dot.x,dot.y,dot_list[0].x,dot_list[0].y),distance(dot.x,dot.y,dot_list[1].x,dot_list[1].y),distance(dot.x,dot.y,dot_list[2].x,dot_list[2].y)):dot._class=2else:dot._class=3
for dot in dot_list:#一些上色和可视化操作if dot._class==1:plt.plot(dot.x,dot.y,'x',color = 'blue')elif dot._class==2:plt.plot(dot.x,dot.y,'d',color = 'green')elif dot._class==3:plt.plot(dot.x,dot.y,'^',color = 'black')
plt.show()

上面的代码可以直接复制去运行,因为每次的随机生成的数据点,因此每次的结果也会稍有不同。

聚类效果:

上面左图是密度聚类的实现结果。可见密度聚类算法大致成功地将数据集划分为了三部分。

(值得一提的是,假如对于同样的500个数据点,我使用Kmeans聚类,分出的三种数据类会呈现“块状”(如右图);而使用密度聚类,则会呈现左图所示的“层状”,或许从这里能体现出两种算法的不同之处和侧重点。)

小结:

这篇文章主要梳理了密度聚类CFDP的算法原理,以及对密度聚类进行了实现和效果展示。

密度聚类(CFDP)原理与实现相关推荐

  1. 【数据挖掘】基于密度的聚类方法 - DBSCAN 方法 ( K-Means 方法缺陷 | 基于密度聚类原理及概念 | ε-邻域 | 核心对象 | 直接密度可达 | 密度可达 | 密度连接 )

    文章目录 I . K-Means 算法在实际应用中的缺陷 II . K-Means 初始中心点选择不恰当 III . K-Means 优点 与 弊端 IV . 基于密度的聚类方法 V . 基于密度的聚 ...

  2. 密度聚类之DBSCAN算法原理

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

  3. DPC密度峰值聚类算法原理详解二

    DPC密度峰值聚类算法原理详解二 1.计算数据点两两之间的距离 1.使用 Numpy 模块查找两点之间的欧几里得距离: 2.使用 distance.euclidean() 函数查找两点之间的欧式距离: ...

  4. 密度聚类算法DBSCAN实战及可视化分析

    密度聚类算法DBSCAN实战及可视化分析 目录 密度聚类算法DBSCAN实战及可视化分析 DBSCAN实战及聚类效果可视化 构建分类算法获得预测推理能力 DBSCAN实战及聚类效果可视化 DBSCAN ...

  5. 两种三维点云密度聚类方法的研究与对比

    转载请说明出处: http://blog.csdn.net/zhubaohua_bupt/article/details/70194047 基于密度的点云聚类算法可以识别三维点云物体,也可以对三维点云 ...

  6. 密度聚类dbscan_DBSCAN —基于密度的聚类方法的演练

    密度聚类dbscan The idea of having newer algorithms come into the picture doesn't make the older ones 'co ...

  7. R语言聚类算法之密度聚类(Density-based Methods)

    1.原理解析: 1.从数据集中选择一个未处理的样本点 2.以1为圆心,做半径为E的圆,由于圆内圈入点的个数为3,满足密度阈值Minpts,因此称点1为核心对象(黑色实心圆点),且将圈内的4个点形成一个 ...

  8. (十八)密度聚类DBSCAN

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

  9. 聚类算法_层次聚类_密度聚类(dbscan,meanshift)_划分聚类(Kmeans)详解

    注: 两整天的成果,谬误之处勿喷 1 聚类概述 样本 没有训练的样本 没有标注的样本 1.1 相似度度量 1.1.1 距离相似度度量 距离度量 dist(oi,oj)dist(o_{i},o_{j}) ...

最新文章

  1. mysql temporary_MySQL中的两种临时表
  2. 认识top的显示结果
  3. NYOJ 420 p次方求和 大数的幂
  4. Spring中基于Java的配置@Configuration和@Bean用法
  5. Natasha 4.0 探索之路系列(二) 「域」与插件
  6. 运用HTML5+CSS3和CSS滤镜做的精美的登录界面
  7. 解决git关联的的文件颜色、小图标
  8. 23 SD配置-主数据-定义销售地区
  9. 谈谈金融行业的开源风险管理
  10. java springmvc是什么意思_springmvc的简单理解与使用
  11. vc2008对话框中mschart控件应用
  12. Oracle基础视频教程
  13. 最常见的社会工程攻击
  14. win7没有语音识别怎么办|win7系统语音识别设置方法
  15. CodeForces - 1538G Gift Set - ( 二分 )
  16. vm时序数据库-导入数据
  17. 网页龙虎游戏有服务器吗,完美《梦幻诛仙2》今日公测 首开五大新服
  18. Windows下Python的安装
  19. 魔百盒CM211-2系列(ZG/CH/YS)海思MV300H/310芯片-刷机固件及教程
  20. JAVA布局管理器导包_在 Java 中,要使用布局管理器,必须导入下列( )包。_计算机网络基础答案_学小易找答案...

热门文章

  1. python提取数据指定列_Python:提取特定列数据并将其存储到变量中
  2. RK3568平台开发系列讲解(内核篇)挂载文件系统介绍
  3. 3d打印利器FreeCAD入门教程之三----3d文字雕刻篇
  4. 【技术解析】数通是什么?
  5. C语言--函数习题篇
  6. 【解决方案】智慧工地AI视频远程集中监控解决方案是如何通过EasyCVR视频平台实现的?
  7. C语言——求100以内素数
  8. Python3,os模块还可以这样玩,自动删除磁盘文件,非必要切勿操作。
  9. 吊打面试官系列之:什么是 认证、鉴权、授权、权限控制,这一篇必须安排的明明白白。
  10. 数据建模java_数据建模及常见分类算法