Mahout canopy聚类
Canopy 聚类
一、Canopy算法流程
Canopy 算法,流程简单,容易实现,一下是算法
(1)设样本集合为S,确定两个阈值t1和t2,且t1>t2。
(2)任取一个样本点p,作为一个Canopy,记为C,从S中移除p。
(3)计算S中所有点到p的距离dist
(4)若dist<t1,则将相应点归到C,作为弱关联。
(5)若dist<t2,则将相应点移出S,作为强关联。
(6)重复(2)~(5),直至S为空。
上面的过程可以看出,dist<t2的点属于有且仅有一个簇,t2<dist<t1 的点可能属于多个簇。可见Canopy是一种软聚类。
数据集合划分完后:
Canopy有消除孤立点的作用,而K-means在这方面却无能为力。建立canopies之后,可以删除那些包含数据点数目较少的canopy,往往这些canopy是包含孤立点的。根据canopy内点的数目,来决定聚类中心数目k,这样效果比较好。
当T1过大时,会使许多点属于多个Canopy,可能会造成各个簇的中心点间距离较近,各簇间区别不明显;当T2过大时,增加强标记数据点的数量,会减少簇个个数;T2过小,会增加簇的个数,同时增加计算时间。
二、MapReduce实现
在执行Canopy之前需要用将文本合并,然后用Mahout文本向量化模块计算TFIDF,作为文本向量。向量化之后再用Canopy算法聚类。
(一)簇定义
簇Cluster是一个实体,保存该簇的关键信息,canopy 就是一个cluster。
privateint id;
簇编号
核心参数:计算完数据后最终的簇属性
private long numPoints;
簇中点的个数
private Vector center;
中心向量 center=
private Vector radius;
半径向量 radius =
调整参数:簇中加入一个点后调整的参数
private double s0; s0= 权重和。对于canopy,w=1
,所有s0=numPoints
private Vector s1; s1= x
为point,w为权重。对canopyw =1
private Vector s2 ; s2= x
为point,w为权重。对canopyw =1
(二)发现中心点
该Job 通过多个Map 寻找局部Canopy ,用1个reduce将map计算的canopy合并,最终输出全局的中心。
输入数据:SequenceFile 格式,key 文件路径,value TFIDF向量。
Map: key 文件路径 , value TFIDF 向量
Collection<Canopy> canopies = new ArrayList<Canopy>()
Map(WritableComparable<?> key, VectorWritable point){
CanopyClusterer 将Point 加入到canopies 集合中。加入集合的过程中计算T1,T2.加入到相应的Canopy中。
}
Close(){
遍历canopies 集合,计算每一个Canopy的中心点。
For(canopy :canopies){
计算每一个Canopy的中心点。
输出 key :Text(“centroid”)value: Canopy中心点向量。
}
}
Reduce:key Text(“centroid”) value VectorWritable
用1个reduce 将所有map 计算的canopy 中心合并。
Reduce中执行的代码和map的一样。
最终输出canopy 。
For(canopy c :canopys ){
输出:key c.getIdentifier() ,Value c
}
(三)划分数据
通过上一步找到中心点后,划分数据的过程就比较容易了。输入数据为向量化后的TFIDF向量。该过程只需用Map 就行。
输入格式:key 文档路径 value TFIDF向量
Map:
Collection<Canopy>canopies = new ArrayList<Canopy>()
Map(WritableComparable<?> key, VectorWritable point){
计算point 和所有中心点的距离,将其划分到距离最近的canopy中
CanopyClusterer.emitPointToClosestCanopy(point,canopyes)
输出 key: canopyid ,value:point
}
setup(){
读Canopy ,到 canopies
}
三、API说明
API
CanopyDriver.main(args); |
|
--input (-i) |
输入路径 |
--output(-o) |
输出路径 |
--distanceMeasure(-dm) |
距离度量类的权限命名,如:”org.apache.mahout.common.distance.CosineDistanceMeasure” |
--t1 (-t1) |
t1值 (t1>t2) |
--t2 (-t2) |
t2值 |
--t3 (-t3) |
t3值,默认t3=t1 |
--t4(-t4) |
t4值,默认t4=t2 |
--overwrite (-ow) |
是否覆盖上次操作的结果 |
--clustering (-cl) |
是否执行聚类操作,即划分数据 |
--method (-method) |
默认,mapreduce。还可选sequential,执行单机模式 |
示例
String [] args ={“--input”,“vector/tfidf-vectors”, “--output”, “cluster/canopy”, “--method”, “mapreduce”, “--distanceMeasure”, “org.apache.mahout.common.distance .CosineDistanceMeasure”, “--t1”, “0.45”, “--t2”, 0.38”, “--overwrite”, “--clustering”} CanopyDriver.main(args); |
输出
结果文件 |
Key类型 |
Value类型 |
说明 |
clusters-* |
类id (org.apache.hadoop.io.Text) |
类中心 (org.apache.mahout. clustering.kmeans.Cluster) |
每条记录以类id和类中心表示一个类别 |
clusteredPoints |
类id (org.apache.hadoop.io.IntWritable) |
文档向量 (org.apache. mahout.clustering.WeightedVectorWritable) |
每条记录中,文档向量代表文档,类id代表该文档所属类别 |
注:clusters-*中*代表数字,第i次迭代产生的类信息即为clusters-i
四、参考文献
Mahout canopy聚类的更多相关文章
- Mahout kmeans聚类
Mahout K-means聚类 一.Kmeans 聚类原理 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚 ...
- Canopy聚类算法(经典,看图就明白)
只有这个算法思想比较对,其他 的都没有一开始的remove: 原网址:http://www.shahuwang.com/?p=1021 Canopy Clustering 这个算法是2000年提出来的 ...
- Canopy聚类算法分析
原文链接:http://blog.csdn.net/yclzh0522/article/details/6839643 Canopy聚类算法是可以并行运行的算法,数据并行意味着可以多线程进 ...
- Mahout LDA 聚类
Mahout LDA 聚类 一.LDA简介 (一)主题模型 在主题模型中,主题表示一个概念.一个方面,表现为一系列相关的单词,是这些单词的条件概率.形象来说,主题就是一个桶,里面装了出现概率较高的 ...
- Canopy聚类算法
Canopy聚类算法(经典,看图就明白) 聚类算法. 这个算法获得的并不是最终结果,它是为其他算法服务的,比如k-means算法.它能有效地降低k-means算法中计算点之间距离的复杂度. 图中有一个 ...
- canopy聚类算法的MATLAB程序
canopy聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. canopy聚类算法简介 Canopy聚类算法是一个将对象分组到 ...
- Mahout 系列之--canopy 算法
Canopy 算法,流程简单,容易实现,一下是算法 (1)设样本集合为S,确定两个阈值t1和t2,且t1>t2. (2)任取一个样本点p属于S,作为一个Canopy,记为C,从S中移除p. (3 ...
- Canopy算法聚类
Canopy一般用在Kmeans之前的粗聚类.考虑到Kmeans在使用上必须要确定K的大小,而往往数据集预先不能确定K的值大小的,这样如果 K取的不合理会带来K均值的误差很大(也就是说K均值对噪声的抗 ...
- mahout中kmeans算法和Canopy算法实现原理
本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...
随机推荐
- Java第4次实验提纲(面向对象2-继承、多态、抽象类与接口与Swing)
PTA 题集面向对象2-进阶-多态接口内部类 第1次实验 1.1 题集5-1(Comparable) 难点:如果传入对象为null,或者传入对象的某个属性为null,怎么处理? 1.2 题集5-2(C ...
- 安卓高级1 -----Xutil3 和Picasso使用
Xutils3 Xutils由于内部使用httpclient然而在安卓5.0谷歌发现httpclient出现不稳定的情况.于6.0完全弃用,所以作者升级到Xutils3替换原本网络模块 配置环境(St ...
- Dynamics CRM2016 Web Api之根据时间查询数据
我的博文里已经有多次提到CRM中的时间处理问题了,本篇继续探讨在web api的场景下时间字段如何处理,本篇只涉及查询,针对2016中新增的时间行为"用户当地时间"和"无 ...
- nginx+tomcat负载均衡和session复制
本文介绍下传统的tomcat负载均衡和session复制. session复制是基于JVM内存的,当然在当今的互联网大数据时代,有更好的替代方案,如将session数据保存在Redis中. 1.安装n ...
- Android Multimedia框架总结(二十三)MediaCodec补充及MediaMuxer引入(附案例)
请尊重分享成果,转载请注明出处,本文来自逆流的鱼yuiop,原文链接:http://blog.csdn.net/hejjunlin/article/details/53729575 前言:前面几章都是 ...
- SQLite 删除表(http://www.w3cschool.cc/sqlite/sqlite-drop-table.html)
SQLite 删除表 SQLite 的 DROP TABLE 语句用来删除表定义及其所有相关数据.索引.触发器.约束和该表的权限规范. 使用此命令时要特别注意,因为一旦一个表被删除,表中所有信息也将永 ...
- DOM4J生成、解析XML实例
import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Iterato ...
- GDAL库扩展Landsat系列MTL文件格式支持
Landsat系列卫星提供的数据,一般都是每个波段一个tif文件,然后外加一个MTL.txt的元数据文件,使用gdal可以直接打开每个波段的tif文件,但是有时候想在打开tif数据的同时能够自动读取M ...
- 什么时候App委托会收到App进程被结束的消息
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们在Xcode建立的新项目后,在AppDelegate类会发 ...
- Dynamics CRM 窗体Javascript获取时间字段值的准确转换
本篇延续上篇博文继续时间字段的转化实验,本篇讲的是在窗体Javascript中获取及更新时间字段的具体写法,是否需要进行时制的转化,先看下通过ODATA取到的时间字段值 当然取出来看格式就知道是不能直 ...