Mahout kmeans聚类
Mahout K-means聚类
一、Kmeans 聚类原理
K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
假设要把样本集分为c个类别,算法描述如下:
(1)适当选择c个类的初始中心;
(2)在第k次迭代中,对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的中心所在的类;
(3)利用均值等方法更新该类的中心值;
(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。
该算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式
二、Mahout kmeans实现
Mahout kmeans MapReduce实现的原理和上述的一致,值得注意的是,Mahout将数据存储在HDFS,用MapReduce做批量并行的计算。在做kmeans之前,需要将文本用Mahout向量化模块工具做向量化。计算过程主要分为三个步骤:初始中心选取,寻找簇中心,划分数据。
(一) 簇定义
簇Cluster是一个实体,保存该簇的关键信息。
privateint id;
簇编号
核心参数:计算完数据后最终的簇属性
private long numPoints;
簇中点的个数
private Vector center;
中心向量 center=
private Vector radius;
半径向量 radius =
调整参数:簇中加入一个点后调整的参数
private double s0; s0= 权重和。对于Kmeans,w=1
,所有s0=numPoints
private Vector s1; s1= x
为point,w为权重。对kmeansw =1
private Vector s2 ; s2= x
为point,w为权重。对kmeansw =1
(二) 初始中心点选择
(1)RandomSeedGenerator 将输入的向量随机选择K个输出到HDFS作为Kmeans 聚类的初始中心点。
(2)另一种将Canopy计算出的簇中心作为kmeans聚类的初始中心点。
(三) 迭代更新中心
通过不断的迭代,移动簇中心。该过程划分为两个部分,一个是簇划分Job,一个是控制迭代循环。
1.簇划分Job过程:
Map:
Collection<Cluster> clusters = newArrayList<Cluster>()
setUp(){
读入上一次输出的全部中心点,填充cluster。
}
Map(WritableComparable<?> key, VectorWritable point){
用KMeansClustererclusterer 将point 划分到cluster中距离最近的一个cluster中。
输出: key clusterID ,value ClusterObservations
}
}
Combiner:
Reduce(key clusterID ,value Iterator<ClusterObservations> it ){
计算同一个cluster的局部参数。
}
Reduce:
Reduce(key clusterID ,value ClusterObservations){
计算同一cluster的全局参数。
计算cluster的新中心。
对比之前的中心,计算是否收敛。
替换新的中心点作为cluster的中心。
输出 keyclusterID,value Cluster
}
2.循环过程
while(!收敛||没有达到相应的迭代次数){
1.执行迭代Job,输入全部数据,输出新的簇中心;
2.判断是否有簇没有收敛。只要有一个簇没有收敛,则断定为全局不收敛。
}
(四) 划分数据
划分数据过程是对简单的,只需要计算向量和所有簇的距离,将其划分到距离最小的一个簇中。由一个map完成。
Map:
Collection<Cluster> clusters = new ArrayList<Cluster>()
setUp(){
读取最终收敛的簇,填充clusters。
}
Map(WritableComparable<?> key, VectorWritable point){
Double min = 0 ;
String clusterID ;
While(cluster :clusters){
计算min;
得到最小距离的clusterID;
}
输出:clusterID ,point
}
三、API说明
API
|
KMeansDriver.main(args); |
|
|
--input(-i) |
输入路径 |
|
--outpu(-o) |
输出路径 |
|
--distanceMeasure(-dm) |
距离类权限命名,如“org.apache.mahout.common.distance.Cosine DistanceMeasure” |
|
--clusters(-c) |
中心点存储路径,如果该路径下没有中心点,则随机生成并写入该目录 |
|
--numClusters(-k) |
簇个数 |
|
--convergenceDelta(-cd) |
收敛值 |
|
--maxIter(-x) |
最大迭代次数 |
|
--overwrite(-ow) |
是否覆盖上次操作 |
|
--clustering(-cl) |
是否执行聚类 |
|
--method(-xm) |
默认”mapreduce”,或”sequential” |
示例
|
String [] arg= {"-x","10", "-c","kmeans_center", "-i","vector\tfidf-vectors", "-o","kmeans", "-dm","org.apache.mahout.common.distance. EuclideanDistanceMeasure", "-k","3", "-cd","0.01", "-ow", "-cl", "-xm","mapreduce"}; KMeansDriver.main(arg); |
输出
|
结果文件 |
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
四、参考文献
1.《web数据挖掘》
Mahout kmeans聚类的更多相关文章
- Mahout系列之----kmeans 聚类
Kmeans是最经典的聚类算法之一,它的优美简单.快速高效被广泛使用. Kmeans算法描述 输入:簇的数目k:包含n个对象的数据集D. 输出:k个簇的集合. 方法: 从D中任意选择k个对象作为初始簇 ...
- mahout in Action2.2-聚类介绍-K-means聚类算法
聚类介绍 本章包含 1 实战操作了解聚类 2.了解相似性概念 3 使用mahout执行一个简单的聚类实例 4.用于聚类的各种不同的距离測算方法 作为人类,我们倾向于与志同道合的人合作-"鸟的 ...
- K-Means 聚类算法
K-Means 概念定义: K-Means 是一种基于距离的排他的聚类划分方法. 上面的 K-Means 描述中包含了几个概念: 聚类(Clustering):K-Means 是一种聚类分析(Clus ...
- k-means聚类JAVA实例
<mahout in action>第六章. datafile/cluster/simple_k-means.txt数据集例如以下: 1 1 2 1 1 2 2 2 3 3 8 8 8 9 ...
- (转)Mahout Kmeans Clustering 学习
一.Mahout命令使用 合成控制的数据集 synthetic_control.data 可以从 此处下载,总共由600行X60列double型的数据组成, 意思是有600个元组,每个元组是一个时间序 ...
- Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解
Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解 在Hadoop分布式环境下实现K-Means聚类算法的伪代码如下: 输入:参数0--存储样本数据的文本文件inpu ...
- 改用MyAnalyzer的KMeans聚类算法
<strong><span style="font-size:18px;">/*** * @author YangXin * @info 改用MyAnaly ...
- 用scikit-learn学习K-Means聚类
在K-Means聚类算法原理中,我们对K-Means的原理做了总结,本文我们就来讨论用scikit-learn来学习K-Means聚类.重点讲述如何选择合适的k值. 1. K-Means类概述 在sc ...
- K-Means聚类算法原理
K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体 ...
随机推荐
- PHP XML 函数
PHP XML Parser 简介 XML 函数允许您解析 XML 文档,但无法对其进行验证. XML 是一种用于标准结构化文档交换的数据格式.您可以在我们的 XML 教程 中找到更多有关 XML 的 ...
- sql server 的osql 使用例子
一次性执行一个语句并输出到文件: osql -Usa -dSCGWYDJ2012 -P -S192.168.56.1 -Q "exit( SELECT top 1 * FROM A08)&q ...
- NLP系列(3)_用朴素贝叶斯进行文本分类(下)
作者: 龙心尘 && 寒小阳 时间:2016年2月. 出处: http://blog.csdn.net/longxinchen_ml/article/details/50629110 ...
- postgresql跨服务器复制数据库
假设名为dbname数据库需要从A服务器拷贝到B服务器 接收服务器B postgres用户 需先重置B服务器postgres系统用户的密码,使之与数据库用户postgres一致: passwd -d ...
- Ruby 连接MySQL数据库
使用Ruby连接数据库的过程还真的是坎坷,于是写点文字记录一下. 简介 Ruby简介 RubyGems简介 包管理之道 比较著名的包管理举例 细说gem 常用的命令 准备 驱动下载 dbi mysql ...
- python 3 黑色魔法元类初探
最近读django源码,发现必须了解元类才能理解一些很神奇的行为. 发现元类实际上是控制class的创建过程.比如类B继承某个看似平淡无奇的类A之后,你在类B中定义的属性或方法可能会遭到彻底改变. 假 ...
- lucene查询索引库、分页、过滤、排序、高亮
2.查询索引库 插入测试数据 xx.xx. index. ArticleIndex @Test public void testCreateIndexBatch() throws Exception{ ...
- redhat7 上安装dummynet
更多请访问 http://www.webpersonaldeveloper.cn 摘要: 在redhat 上部署dummynet 需要将ipfw 编译为内核模块,而ipfw需要调用linux kern ...
- 5、Android Service测试
如果你在应用中使用了Service,你应该来测试这个Service来确保它正常工作.你可以创建仪表测试来验证Service的行为是否正确:比如,service保存和返回有效的数值并正常的处理数据. A ...
- 【环境配置】配置maven
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的缺 ...