Science14年的聚类论文——Clustering by fast search and find of density peaks
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld。
这是一个比较新的聚类方法(文章中没看见作者对其取名,在这里我姑且称该方法为local density clustering,LDC),在聚类这个古老的主题上似乎最近一些年的突破不大,这篇文章算是很好的了,方法让人很有启发(醍醐灌顶),并且是发表在Science上,受到的关注自然非常大。
本文的核心亮点:1是用比较新颖的方法来确定聚类中心,2是采用距离的local density来进行聚类的划分。在这两点中,常见的Kmeans算法采用的方法是:用每一类的均值作为中点,用距离的最近的点来确定聚类划分。下面对LDC方法进行描述。
首先来讲一下聚类中心,什么样的点才是好的聚类中心呢?作者认为需要满足下面两点:
1、样本点本身的密度大,即它周围点的密度应该小于它;
2、和比它密度更大的点之间的距离应该尽可能的大;
定义每个样本点的(1)局部密度函数,采用cut-off kernel:
其中
dc是截断距离(cutoff distance),是预先设定的一个值,dij表示点i和j之间的距离,可以用任意距离计算公式计算;IS表示数据集中所有样本点的标号集合;很明显,这个局部密度函数是一个离散的函数,它的含义是所有样本点中(不含i点)和i点距离在dc之内的样本点的数量。当然也可以采用连续的函数来定义局部密度,如采用Gaussian Kernel:
Ok,不管采用离散的还是连续的,我们已经得到了局部密度;再定义每个样本点的距离δi,为了避免和距离计算的混淆,我这里称之为(2)距离偏量:
很明显,i点的距离偏量的含义是,所有局部密度大于i点的样本点到i点的距离的最小值;单是对密度最大的那个点单独处理一下,其距离偏量为所有两两点之间距离的最大值(其实这个最大值的数值本身并不重要,只是为了使得这个密度最大点的距离偏量也是最大的,使得它会被选为聚类中心之一)。上面的定义有一个小处定义的不是很周到,就是对于密度相同的点,距离到底是计算还是不计算?因此可以在计算完局部密度以后,可以对所有点的局部密度进行降序排序,这样相同密度的点也会有个先后顺序,而对于i点来说,密度比它大的点就是那些排序在它前面的点,包括了和它密度相同的点[2]。
好,接下来看paper中的这个例子,下面左图是数据样本的分布,其中样本点的标号是根据局部密度降序排序的。右图是将每个点的局部密度和距离偏移绘制出来的结果,可以看到1和10号点脱颖而出,因此聚类的时候把他们作为两类聚类的中心。
这种聚类中心的判断主要还是通过人眼来看的,这一点有一些麻烦,也不是很普适。在文献[1]作者提到,可以用一种综合性的指标γi=ρi×δi来判断,γi大的点被选为中心点,因此对所有的γi降序排序取前K个点作为聚类中心点,具体取多大的K,可以观察下图找到分割点(具体内容需要参看文献[1]的补充资料):
OK,介绍完如何选取聚类中心,接下来记录一下如何做聚类的过程。前面我们提到,已经有一个关于样本点局部密度的降序排列,在确定完中心点后,对余下的点,我们依次做下面的操作:
对于未标记聚类类别的点a,找到密度比它大的点中和它距离最近的那个点c,把c点的类别标号赋给a点。根据局部密度的降序依次给所有样本点进行类别赋值,就可以一遍得到所有样本点的聚类结果。下图(来自于[3])简单说明了这个过程,先确定了点1和2为中心,然后点3(找到点1)标记为聚类1,点4(找到点3)也标记为聚类1。可以看到,聚类这个过程是一个扫描一遍的过程,是线性的。
当然,本方法还有一点是有区别于其他聚类方法的,它还做了outlier的过滤。在前面第一幅图中,26-28三个点被认为是outlier。具体的思路是这样的,首先对每一个cluster中的点,分为cluster core点和cluster halo点,halo点是最终要被排除的。需要先确定每个cluster的边界区域,边界区域由cluster中这样性质的数据点构成——它们的距离为dc的邻域内,存在着其他cluster的点。计算这样跨cluster的点对(记为i和j,i为本cluster内部的点)的平均局部密度ρ¯=12(ρi+ρj),并取一个cluster的所有存在的跨cluster点对的平均局部密度的最大值作为该cluster的平均局部密度上界;然后对所有样本点进行一次标记,如果一个样本点的局部密度小于它所在类别的平均局部密度上界,则被标记为halo点,否则标记为core点;halo点是被抛弃的离群点。看下面这个示意图[3]:
一开始点1,3,6,7都被标记为cluster 1,点6确定了cluster 1的边界区域,并计算出了该类的平均局部密度上界(通过6-5和6-4),由于点7的局部密度小于该平均局部密度上界,被标记为halo点,排除在cluster 1之外。
OK,到这里就讲完了聚类过程的核心过程思想了,但是整个程序的执行还有很多小的细节点,比如如何确定dc?作者提出的方法是经验性的,设定为所有点的相互距离中由小到大排列占总数2%位置的距离数值。当然,这个2%也是经验性质的,事实上该数值的选取是非常影响算法最终的结果的,太大太小都不行,大概2%在作者测试的data set里面还算不错。这样通过data depended的方法来选取dc相对来说比直接设定一个具体的数值来的鲁棒性更好一些。
下面来看一下实验结果(看起来肯定是很棒的啦,所有的聚类paper都号称自己方法可以做到很好的效果,不过实际上最重要的是鲁棒性以及参数调节难度低,对用户来说参数调节最好自动或者没有/很少参数,这也是为什么kmeans算法依然在实际应用中使用的最多的原因——使用方便)
下图是一个非球形类分布图,同时加入黑色噪音点后,A图为类的概率分布,B、C图为4000个和1000个样本点,E和F生成的每个点对应的ρ和δ的函数图,可以明显看出类别中心及个数。F图为随着样本点的增加,错误指派点的比率[3]。
以下是使用该算法在其他数据集上进行聚类的效果图
下面是算法执行流程,在这里收录一下[2],:
参考资料
[1] Alex Rodriguez and Alessandro Laio. Clustering by fast search and find of density peaks, Science 344, 1492 (2014);
[2] http://blog.csdn.net/itplus/article/details/38926837
[3] http://blog.csdn.net/lvxiong1990/article/details/40540065
Science14年的聚类论文——Clustering by fast search and find of density peaks的更多相关文章
- Science论文"Clustering by fast search and find of density peaks"学习笔记
"Clustering by fast search and find of density peaks"是今年6月份在<Science>期刊上发表的的一篇论文,论文中 ...
- 一种新型聚类算法(Clustering by fast search and find of density peaksd)
最近在学习论文的时候发现了在science上发表的关于新型的基于密度的聚类算法 Kmean算法有很多不足的地方,比如k值的确定,初始结点选择,而且还不能检测费球面类别的数据分布,对于第二个问题,提出了 ...
- Clustering by fast search and find of density peaks
参考:http://www.52ml.net/16296.html 这个算法的优点就在于,它首先一步就能找到聚类中心,然后划分类别.而其他算法需要反复迭代才能找到中心聚类. 就是不知道代码该怎么写.. ...
- 处理输入为非对角阵的Clustering by fast search and find of density peak代码
Clustering by fast search and find of density peak. Alex Rodriguez, Alessandro Laio 是发表在Science上的一篇很 ...
- 各类聚类(clustering)算法初探
1. 聚类简介 0x1:聚类是什么? 聚类是一种运用广泛的探索性数据分析技术,人们对数据产生的第一直觉往往是通过对数据进行有意义的分组.很自然,首先要弄清楚聚类是什么? 直观上讲,聚类是将对象进行分组 ...
- Clustering by density peaks and distance
这次介绍的是Alex和Alessandro于2014年发表在的Science上的一篇关于聚类的文章[13],该文章的基本思想很简单,但是其聚类效果却兼具了谱聚类(Spectral Clustering ...
- [论文阅读笔记] Fast Network Embedding Enhancement via High Order Proximity Approximati
[论文阅读笔记] Fast Network Embedding Enhancement via High Order Proximity Approximation 本文结构 解决问题 主要贡献 主要 ...
- 基于图嵌入的高斯混合变分自编码器的深度聚类(Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedding, DGG)
基于图嵌入的高斯混合变分自编码器的深度聚类 Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedd ...
- 解读论文《Agglomerative clustering of a search engine query log》,以解决搜索推荐相关问题
<Agglomerative clustering of a search engine query log> 论文作者:Doug Beeferman 本文将解读此篇论文,此论文利用搜索日 ...
随机推荐
- java里的 懒汉和恶汉模式-----讲解
------------java中的恶汉模式 public void Test{ private static Test inte = new Test(); // 内部自己创建好实例,私有属性(不建 ...
- JSP页面中的Meta标签详解
Meta标签详解 相信大家在平时开发中最常接触的页面就是html和jsp了,可在这两个页面中有一个Meta标签你天天都会看见,可是你真的了解这个标签的一些其他用处吗?今天给大家介绍一些该标签的其他应用 ...
- 【极值问题】【CF1063B】 Labyrinth
传送门 Description 给你一个\(n~\times~m\)的矩阵,一开始你在第\(r\)行第\(c\)列.你的上下移动不受限制,向左最多移动\(x\)次,向右最多移动\(y\)次.求你最多能 ...
- SQL_MODE
一 声明 标红部分为重点了解 原文:https://segmentfault.com/a/1190000005936172 二 SQL_MODE参数值 官方手册专门有一节介绍 https://dev. ...
- Javascript让你的网页标题飘动起来
如果你有使用WebQQ,你也许会发现,每次收到信息的时候,就会看到title提示哪个网友或群来信息,然后网页的title就会开始飘动,挺人性化,蛮有意思的.而这个效果其实也不难,这里实现了这个效果,演 ...
- 后端日期类属性date 不接受string类型日期,都是没找到解决的方法,所有前端传回的string字符串都一一转化为java定义的类型
1.比如日期 我们可以是yyyy-MM-dd 亦可以是 yyyy-MM-dd HH:mm:ss 方法1在java代码中需要的字段上加上注解 写上日期类型,不过这样很麻烦,每个人写了日期类型的接收前端的 ...
- PhoneGap API介绍:File
本文将介绍PhoneGap API——File:通过JavaScript截获本地文件系统.File是用于读取.写入和浏览文件系统层次结构的PhoneGap API. 对象: DirectoryEntr ...
- vijos 1066 弱弱的战壕 树状数组
描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...
- 2015/9/2 Python基础(7):元组
为什么要创造一个和列表差别不大的容器类型?元组和列表看起来不同的一点是元组用圆括号而列表用方括号.而最重要的是,元组是不可变类型.这就保证了元组的安全性.创造元组给它赋值和列表完全一样.除了一个元素的 ...
- K-近邻(KNN)算法
1,KNN算法对未知类别属性的数据集中的每个点依次执行以下操作: 计算已知类别数据集中的点与当前点之间的距离; 按照距离递增排序; 选取与当前点距离最小的k个点; 确定前k个点所在类别的出现频率; 返 ...