mahout中kmeans算法和Canopy算法实现原理
本文讲一下mahout中kmeans算法和Canopy算法实现原理。
一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉。虽然算法较为简单,在实际应用中却可以有不错的效果;其算法原理也决定了其比较容易实现并行化。
学习mahout就先从简单的kmeans算法开始学起,就当抛砖引玉了。
1. 首先来简单的回顾一下KMeans算法:
(1) 根据事先给定的k值建立初始划分,得到k个Cluster,比如,可以随机选择k个点作为k个Cluster的重心,又或者用其他算法得到的Cluster作为初始重心;
(2)、计算每个点到各个Cluster重心的距离,将它加入到最近的那个Cluster;
(3)、重新计算每个Cluster的重心;
(4)、重复过程2~3,直到各个Cluster重心在某个精度范围内不变化或者达到最大迭代次数;
其时间复杂度是:O(nkt),其中:n是聚类点个数,k是Cluster个数,t是迭代次数。容易并行化,
kmeans缺点是:对孤立点敏感,K值难以估计
2. kmeans的算法思想决定了其实现并行化还是比较容易的,主要是在迭代中计算某个点属于哪一个新的聚类中心的过程是可以并行化的。
主要分成以下几个步骤:
(1)datanode在map阶段读出位于本地的数据集,并且从HDFS中读到上一次聚类后的聚类中心(从cluster-N-1的目录中),计算并输出每个点及其对应的Cluster;
(2)combiner操作对位于本地包含在相同Cluster中的点进行reduce操作并输出,
(3)reduce操作得到全局Cluster集合并写入HDFS的指定目录(cluster-N)。
Kmeans每一轮迭代会生成新的全局聚类中心,这个聚类中心在下一次迭代的时候是会使用到的,所以每一轮迭代(实际上每一轮迭代是一个新mapreduce job)之后,reduce任务会负责将此次的聚类中心输出到集群中。命名是以cluster加上迭代次数命名的。为:Cluster-N
由于每次迭代是起了一个job,mahout中有一个KMeansDriver的类来对整个过程进行控制。抽象过程。最后,当获得了稳定的全局聚类中心后,简单的想想就能知道,只要用一个Map过程就可以实现对全体数据的分类。具体流程如下图:
二. 在开始的时候说过,Kmeans算法收初始点的影响较大,如果起始点是一个孤立点是一个很麻烦的事情。解决的办法是先对数据集进行一个较为“粗”的聚类算法。目的是对全体数据集进行一个大致的分组过程,然后这些组为单位选取Kmeans的初始聚类中心点,这样初始点的选择就不至于因为随即而偏离的太远。Mahout里面是使用Canopy算法来实现这一初始聚类过程的,当然mahout中也会提供随机选取初始中心点的方法,用的是RandomSeedGenerator类。(运行mahout kMeans时会默认选择Canopy算法作为聚类中心选择的初始算法,但当你提供-k参数,即指明有几个聚类中心时,则会选择随机的方式生成初始中心点)
1. Canopy算法其实本身也可以用于聚类,但它的结果可以为之后代价较高聚类提供帮助,其用在数据预处理上要比单纯拿来聚类更有帮助;
Canopy算法的步骤如下:
(1) 将所有数据放进list中,选择两个距离,T1,T2,T1>T2
(2)While(list不为空)
{
随机选择一个节点做canopy的中心;并从list删除该点;
遍历list:
对于任何一条记录,计算其到各个canopy的距离;
如果距离<T2,则给此数据打上强标记,并从list删除这条记录;
如果距离<T1,则给此数据打上弱标记;
如果到任何canopy中心的聚类都>T1,那么将这条记录作为一个新的canopy的中心,并从list中删除这个元素;
}
同样,Canopy算法的实现也比较简单,其使用T1和T2两个距离来实现对数据集的一个粗略的划分,表现为最终会生成几个Canopy下面举一个例子。
8.1,8.1
7.1,7.1
6.2,6.2
7.1,7.1
2.1,2.1
1.1,1.1
0.1,0.1
3.0,3.0
一共有8个二维的点,为了计算简便,我们选择曼哈顿距离作为距离的量度,即|x1 – x2| + |y1 – y2|。选取T1=8,T2=4。mahout里面是可以为Kmeans算法设置不同的距离计算方法的,如欧式距离,向量夹角,曼哈顿距离,雅克比系数等。
首先选取(8.1, 8.1)作为第一个Canopy的中心,并从list中删除这个点。
然后开始遍历整个list。
第二个点(7.1,7.1)
距离Canopy 1 (8.1,8.1)的距离是2,2<T2,所以第二个点属于Canopy 1,将其加入Canopy 1,并从list中删除该点;
第三个点(6.2,6.2)
距离Canopy 1 (8.1,8.1)的距离是3.8,3.8<T2,所以第三个点也是属于Canopy 1。同样将其加入Canopy 1,并从list删除该点;
第四个点(7.1,7.1)与第一个点是相同的。
第五个点(2.1,2.1)
其余Canopy 1的距离是12,大于T1,所以第五个点不属于任何Canopy,新生成一个Canopy,其中心是(2.1,2.1),并从list中删除该点,因为这个点不会属于其他Canopy了。
第六个点(1.1,1.1)
到Canopy 1 (8.1,8.1)的距离是14,14> T1,到Canopy 2(2.1,2.1)的距离是2,2<T2,所以第六个点属于Canopy 2(2.1,2.1),并从list中删除这个点。
第七个点(0.1,0.1 )
到Canopy 1 (8.1,8.1)的距离是16,16> T1,到Canopy 2(2.1,2.1)的距离是4,4=T2,所以将第七个点打上属于Canopy 2(2.1,2.1)的弱标记,但并不从集群中删除该点;
第八个点(3.0,3.0)
到Canopy 1 (8.1,8.1)的距离是10.2,10.2> T1,到Canopy 2(2.1,2.1)的距离是1.8,1.8<T2,所以将第八个点加入到Canopy 2(2.1,2.1)中。
此时所有Canopy的状态是:
Canopy 1 (8.1,8.1) :[ (8.1,8.1), (7.1,7.1), (6.2,6.2) ,(7.1,7.1) ]
Canopy 2 (2.1,2.1) :[ (2.1,2.1), (1.1,1.1) ,(0.1,0.1), (3.0,3.0) ]
并且算法的第一词While循环已经跑过,此时list中还剩下的元素是(0.1,0.1)
将他自己作为一个新的Canopy,Canopy 3(0.1,0.1),集群中Canopy的最后状态是
Canopy 1 (8.1,8.1) :[ (8.1,8.1), (7.1,7.1), (6.2,6.2) ,(7.1,7.1) ]
Canopy 2 (2.1,2.1) :[ (2.1,2.1), (1.1,1.1) ,(0.1,0.1), (3.0,3.0) ]
Canopy 3 (0.1,0.1) :[ (0.1,0.1)]
所以最终的Canopy聚类中心是(7.125,7.125),(1.575,1.575),(0.1,0.1)
2. Canopy算法的并行化:
Canopy算法的并行点也是比较明显的,即生成Canopy的过程可以并行,
(1) 各个mapper可以依据存储在本地的数据,各自在本地用上述算法生成若干Canopy;(2) reducer将这些Canopy用相同算法汇总后计算出最终的Canopy集合;
下图可以较好的反应并行化的过程:
举个例子,我们只有两个map任务:
第一个map的数据是
8.1,8.1
7.1,7.1
6.2,6.2
7.1,7.1
2.1,2.1
1.1,1.1
0.1,0.1
3.0,3.0
根据上文的计算,我们得到其Canopy中心是(7.125,7.125),(1.575,1.575),(0.1,0.1)
那么第一个map的数据就是(7.125,7.125),(1.575,1.575),(0.1,0.1)
第二个map的数据是
8,8
7,7
6.1,6.1
9,9
2,2
1,1
0,0
2.9,2.9
运用Canopy算法我们可以到,其Canopy中心是(7.525,7.525),(1.475,1.475),(1.45,1.45)
第二个map的输出数据就是(7.525,7.525),(1.475,1.475),(1.45,1.45)
那么Reduce中获得数据就是(7.125,7.125),(1.575,1.575),(0.1,0.1),(7.525,7.525),(1.475,1.475),(1.45,1.45)
Reduce任务会用Canopy算法对这个六个点进行Canopy划分。从而得到全局的Canopy中心。
转载于:https://www.cnblogs.com/yuhan-TB/p/3380153.html
mahout中kmeans算法和Canopy算法实现原理相关推荐
- 游戏中DDA算法和Bresenham算法的应用
在角色扮演或即时战略游戏中,经常会将角色以最佳的方式走到指定地点.游戏场景的地面情况复杂,而且场面大,若采用盲目式搜索,例如盲目穷举法,则几乎要遍历整个场景,效率非常低,造成角色反应速度过慢,实践证明 ...
- K-Means算法和DBSCAN算法
文章目录 一.聚类 二.K-Means算法 1.基本概念 2.工作流程 3.优缺点 三.DBSCAN算法 1.基本概念 2.工作流程 3.参数选择 4.优缺点 四.可视化展示 1.K-Means算法 ...
- Bp神经网络预测中trainlm算法和trainbr算法的应用
BP神经网络是一种常用的人工神经网络,它的训练算法有多种,其中trainlm和trainbr是两种较常用的算法. trainlm算法是Levenberg-Marquardt算法的缩写,是一种常用的优化 ...
- 06 聚类算法 - 代码案例二 - K-Means算法和Mini Batch K-Means算法比较
03 聚类算法 - K-means聚类 04 聚类算法 - 代码案例一 - K-means聚类 05 聚类算法 - 二分K-Means.K-Means++.K-Means||.Canopy.Mini ...
- Widar2.0:SAGE算法和SAGE算法在在无线信道参数估计中的应用
Widar2.0:SAGE算法和SAGE算法在在无线信道参数估计中的应用 C1 本文背景 C2 SAGE算法 C2.1 EM算法 C2.2 SAGE算法 C2.3 SAGE算法和SAGE算法在在无线信 ...
- c语言dfp算法程序,拟牛顿法中的DFP算法和BFGS算法
注明:程序中调用的函数jintuifa.m golddiv.m我在之前的笔记中已贴出 DFP算法和BFGS算法不同在于H矩阵的修正公式不同 DFP算法 %拟牛顿法中DFP算法求解f = x1*x1+2 ...
- BF算法和KMP算法
给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...
- 操作系统之存储管理——FIFO算法和LRU算法
操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...
- Prim算法和Kruskal算法
Prim算法和Kruskal算法都能从连通图找出最小生成树.区别在于Prim算法是以某个顶点出发挨个找,而Kruskal是先排序边,每次选出最短距离的边再找. 一.Prim(普里姆算法)算法: ...
- 基于Huffman算法和LZ77算法的文件压缩的改进方向
基于Huffman算法和LZ77算法的文件压缩(八) 到这里已经简单实现基于Huffman算法和LZ77算法的文件压缩, GitHub源码:点我 根据基于Huffman算法和LZ77算法的文件压缩(七 ...
最新文章
- DevDays2012 开发者日中文版资料下载
- java面试题八 传值传引用
- 广州计算机专业王健,王健-计算机与信息工程学院
- 超简单方法: Intellij Idea 把 java 工程打成可运行的 jar
- python自动生成坐标脚本_用一个简单的python脚本从经纬度坐标获得高程
- 用 Python 计算综合测评中的专业成绩加权平均分
- 持续近40年的战争 X86系列CPU大史记
- 国内B2C 26个经典购物网站商城收集
- 商务部都在努力为直销行业创造良好的发展环境,你还在等什么?
- sharepoint 工作经验与技能总结
- CSS动画和JS动画对比
- 小米6MIUI稳定版安装谷歌相机
- 真实IP收集及其利用方式
- 将远程仓库的项目克隆到本地
- (青龙面板)xdd机器人对接诺兰进行短信提交
- MaxIO智能缓存加速技术
- android singleTask
- 基于ArduinoUNO的LD3320语音识别+SYN6288语音合成的智能分类垃圾桶
- 【博学谷学习记录】超强总结,用心分享丨大数据超神之路(一):Scala基础语法副本
- linux 代码搜索工具,程序员兵器之代码搜索工具
热门文章
- 自定义console.log字体样式
- 转:前端js、jQuery实现日期格式化、字符串格式化
- Spark-Mllib(二)基本统计
- setValuesForKeysWithDictionary:的用途
- NEC学习 ---- 布局 -两列, 右侧定宽,左侧自适应
- 习题:交换一组数据的位置
- 【Prufer Sequence +简单排列组合】bzoj 1005: [HNOI2008]明明的烦恼
- 庆祝我的第一本书出版
- 无人自助便利店采用射频识别技术 30秒钟就能完成付款
- centos-7 charpter one