Hadoop实现Clustering by fast search and find of density peaks (2)

本篇博客参考:Clustering by fast search and find of density peaks论文以及http://www.cnblogs.com/peghoty/p/3945653.html

使用版本:

Hadoop版本:2.6.0,Myeclipse:10.0

本地集群情况:

node101  (主节点,namenode,datanode,ResourceManager,NodeManager,SecondaryNamenode,3.7G,2核)

node102  (数据/计算节点,datanode,NodeManager,1G,1核)

上面两个机器是虚拟机,本机是windows7系统4核8G内存;

代码可在https://github.com/fansy1990/fast_cluster下载。

此篇是Hadoop实现Clustering by fast search and find of density peaks的改版,同时此篇只描述了聚类中心点的寻找,代码与Hadoop Web项目--Friend Find系统 里面的聚类实现代码类似,这里使用不同的数据来进行测试而已。

1. 数据格式

本篇测试使用的数据集来自https://www.kaggle.com/c/digit-recognizer/data 中的train.csv ,原始数据是一个数字识别的数据,即把一个数字图片(图片中含有一个手写的数字)转换为784个像素点表示的向量。

测试数据截取了前面的5975条记录,同时针对每条数据,插入了一个id,id从1到5975,数据截图如下:

每行数据的第一列为id,第二列为类别,第3到最后一列为这行记录的所有属性列,一共有784个属性;

2. 本篇用意

2.1. 使用fast cluster(题目的聚类算法),对这份截取后的数据求聚类中心点,然后根据求得的聚类中心点来对原始数据进行分类,在和原始数据做对比,看下正确率,来看下这个聚类算法是否对这个数据有很好的分区性;

2.2. 这样验证之一就是使用fast cluster得到聚类中心后,可以从原始数据中找到该条记录,看到其原始类别,所以这里可以取聚类中心10个点(数字从0~9一共有10组),然后看这10个点是否是“唯一”的(这里的唯一是指原始的类别没有重复);验证之二就是1.里面的争取率了;

2. 3. 此篇在做到求解出聚类中心点后就没有往下继续做了,因为求解出聚类中心点后,发现其不是“唯一”的,里面重复了很多,即聚类中心就是不合理的了,所以就没有往下继续做了。

3. 本篇聚类中心寻找的算法参考:Hadoop Web项目--Friend Find系统 的4.3节1.“执行聚类”一节,具体原理可以参考此篇博客。

4. 运行及实验结果

4.1 原始数据

原始数据截取后的csv文件有10m左右,一共有5975条记录;经过序列化,得到了一个36M的文件(HDFS上)

使用命令:

hadoop jar /opt/fast_cluster.jar fz.fast_cluster.ToSeqJob digit_train.csv seq_out ,

其中,fast_cluster.jar是源码打包得到的文件;

4.2 计算距离

这一步计算距离是比较耗时的,距离计算即计算原始数据中两两之间的距离,原始数据一共有5975条记录,那么这里的输出即是5975*(5975-1)/2条记录,运行命令如下:

hadoop jar /opt/fast_cluster.jar fz.fast_cluster.CalDistanceJob seq_out cal_distance_out

得到的距离文件为400多M,此MR耗时24分钟(可以想象如果使用70M的数据,那么其耗时和输出是多大!)如下:

4.3 根据距离数据求解每个向量的最小距离和局部密度,并画决策图

命令为:

hadoop jar /opt/fast_cluster.jar fz.fast_cluster.CalDiffDCFindVec cal_distance_out/part-r-00000 17847325 0.02 0.02 1 2 2 /opt/picandlog 500

参数对应的变量为<path> <numRecords> <from> <to> <howMany> <localDensityNumReducer> <deltaDistanceNumReducer> <localSavePath> <numPoints> ,每个参数的意思为:

<path> 距离的文件所在路径;

<numRecords> 输出的距离数据的记录数;

<from> 阈值开始的百分比;

<to>阈值结束的百分比;

<howMany> 阈值的个数; 因为在求解局部密度的时候需要输入一个距离阈值,根据论文说可以选择全部距离的前面1~2%的记录的距离作为此参数值,所以这里的意思是可以使用不同的阈值来画出最后的决策图,看哪个决策图表现最好,就选择那个阈值;但是lz使用虚拟机资源有限,所以这里就没有循环,即开始从2%,结束也是2%,阈值的个数为1个,来完成;

<localDensityNumReducer> 局部密度的MR的reducer个数;(我有两个节点,所以这里设置为2)

<deltaDistanceNumReducer> 最小距离MR的reducer个数;

<localSavePath> 这里会把生成的决策图以及按照局部密度和最小距离乘积的值从大到小排序取<numPoints>个值的<向量id,局部密度,最小距离>数据写入本地的路径;

<numPoints> 上面使用的numPoints即是;

这里得到的决策图为:

这里黑色框里面的数据及可以作为聚类中心向量(这里的阈值为局部密度>500,最小距离>1000),因为局部密度最大以及最小距离最大的点没有画出来,所以这里取9个点(一共要取10个点);

4.4 根据距离和密度阈值求得聚类中心并写入本地

运行的命令为:

hadoop jar /opt/fast_cluster.jar fz.fast_cluster.FindWriteCenter /opt/picandlog/log_center_0.dat 500 1000 digit_train.csv center_out /opt/picandlog/center.dat

查看/opt/picandlog/center.dat文件,可以得到下面的数据:

这里可以看到的确是有10个聚类中心向量,但是可以看到参考原始数据的类型值,发现其中9、1、3是重复的,即聚类中心本身就存在问题。得到这样的结果可以推测原因如下:

1). 原始数据的聚类特征不明显,从而得到的结果效果不好;

2.) 聚类的阈值选择,在计算局部密度时,阈值选择的不同,其结果可能也是大相径庭的;

5. 总结

1)该算法首先要计算距离,但是距离的计算所需的资源很大;

2)聚类时阈值的选择,没有定量的分析,需要在一定经验上选择;

3)从聚类决策图 中选择聚类中心点也是人工的经验,很多不确定性;

由于使用该数据在得到聚类中心后和原始数据对比没有得到比较理想的结果,所以这里就不往下做了!

分享,成长,快乐

脚踏实地,专注

转载请注明blog地址:http://blog.csdn.net/fansy1990

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 10:30:43

Hadoop实现Clustering by fast search and find of density peaks (2)的相关文章

Hadoop实现Clustering by fast search and find of density peaks

Hadoop实现Clustering by fast search and find of density peaks 本篇博客参考:Clustering by fast search and find of density peaks论文以及http://www.cnblogs.com/peghoty/p/3945653.html. Hadoop版本:2.6.0,Myeclipse:10.0 代码可在https://github.com/fansy1990/fast_cluster下载. 1.

Science14年的聚类论文——Clustering by fast search and find of density peaks

这是一个比较新的聚类方法(文章中没看见作者对其取名,在这里我姑且称该方法为local density clustering,LDC),在聚类这个古老的主题上似乎最近一些年的突破不大,这篇文章算是很好的了,方法让人很有启发(醍醐灌顶),并且是发表在Science上,受到的关注自然非常大. 本文的核心亮点:1是用比较新颖的方法来确定聚类中心,2是采用距离的local density来进行聚类的划分.在这两点中,常见的Kmeans算法采用的方法是:用每一类的均值作为中点,用距离的最近的点来确定聚类划分

Science论文&quot;Clustering by fast search and find of density peaks&quot;学习笔记

"Clustering by fast search and find of density peaks"是今年6月份在<Science>期刊上发表的的一篇论文,论文中提出了一种非常巧妙的聚类算法.经过几天的努力,终于用python实现了文中的算法,下面与大家分享一下自己对算法的理解及实现过程中遇到的问题和解决办法. 首先,该算法是基于这样的假设:类簇中心被具有较低局部密度的邻居点包围,且与具有更高密度的任何点有相对较大的距离.对于每一个数据点,要计算两个量:点的局部密度和

Clustering by fast search and find of density peaks

"Clustering by fast search and find of density peaks"是20114年6月份在<Science>期刊上发表的的一篇论文,论文中提出了一种非常巧妙的聚类算法. 首先,该算法是基于这样的假设: (1)聚类中心密度要高 (2)高密度中心点之间的距离应该相对远一些. 异常点都会被排除,同时也和形状无关. 首先,这种方法不像原先的Kmeans那样随机初始种子点然后迭代,它是根据样本的密度峰值来确定聚类中心的,当然聚类中心确定之后,后面

Clustering by fast search and find of density peaks代码详解

 发表在2014年Science上的聚类方法Clustering by fast search and find of density peaks,不在这赘述介绍了,其matlab代码详细注释下面给出,如果想看该方法的详细解释说明,推荐在阅读原文的基础上,参考这位博主的博文 http://blog.csdn.net/itplus/article/details/38926837 本文版权所有  转载请注明出处 http://blog.csdn.net/mxlmhgzw 无法看清的,请见我博客

笔记Clustering by fast search and find of density peaks

We propose an approach based on the idea that cluster centers are characterizedby a higher density than their neighbors and by a relatively large distance from points withhigher densities. This idea forms the basis of a clustering procedure in which

Clustering by fast search and find of desity peaks(基于快速搜索与寻找密度峰值的聚类)

基于快速搜索与寻找密度峰值的聚类(Alex Rodriguez and Alessandro Laio) 摘要:聚类分析目的是基于元素之间的相似度对其进行分类,应用范围从天文学到生物信息学.文献计量学到模式识别.我们提出一种方法,思想基于簇中心具有比其邻居更大密度的特点以及与更大密度点之间有一个相对较大的距离(1.簇中心点有相对高的密度 2.簇中心点之间距离一般较大,即不同类别之间一般距离较远),这种思想形成了簇数目直观出现的聚类机制的基础,自动发现和排除异常点,同时在识别簇时,不用关心其形状和

一种新型聚类算法(Clustering by fast search and find of density peaksd)

最近在学习论文的时候发现了在science上发表的关于新型的基于密度的聚类算法 Kmean算法有很多不足的地方,比如k值的确定,初始结点选择,而且还不能检测费球面类别的数据分布,对于第二个问题,提出了Kmean++,而其他不足还没有解决,dbscan虽然可以对任意形状分布的进行聚类,但是必须指定一个密度阈值,从而去除低于此密度阈值的噪音点,这篇文章解决了这些不足. 本文提出的聚类算法的核心思想在于,对聚类中心的刻画上,而且认为聚类中心同时具有以下两种特点: 本身的密度大,即它被密度均不超过它的邻

cluster by fast search and find of density peaks

This paper proposed a new cluster idea. The idea is that the cluster center is characterrized by a higher density than their neighbors and by a relatively large distance from points with highter density(1.一个类中的聚类中心的点的密度较高,2.不同聚类中心的距离较大). Based on thi