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聚类

时间: 2024-10-10 20:32:44

Mahout canopy聚类的相关文章

Canopy聚类算法

一.概念 与传统的聚类算法(比如K-means)不同,Canopy聚类最大的特点是不需要事先指定k值(即clustering的个数),因此具有很大的实际应用价值.与其他聚类算法相比,Canopy聚类虽然精度较低,但其在速度上有很大优势,因此可以使用Canopy聚类先对数据进行"粗"聚类,得到k值后再使用K-means进行进一步"细"聚类.这种Canopy+K-means的混合聚类方式分为以下两步: Step1.聚类最耗费计算的地方是计算对象相似性的时候,Canopy

Mahout kmeans聚类

求n*m网格内矩形的数目Mahout kmeans聚类

mahout k-means聚类的入门操作步骤重点:

1.把文本文件变为sequence file: mahout seqdirectory -i file://$(pwd)/news/ -o file://$(pwd)/news-seq/ -c UTF-8 -chunk 64 -xm sequential mahout seqdirectory -i file://$(pwd)/1/ -o file://$(pwd)/1-seq/ -c UTF-8 -chunk 64 -xm sequential 2.把本地的seqence file传到hado

Mahout机器学习平台之聚类算法详细剖析(含实例分析)

第一部分: 学习Mahout必须要知道的资料查找技能: 学会查官方帮助文档: 解压用于安装文件(mahout-distribution-0.6.tar.gz),找到如下位置,我将该文件解压到win7的G盘mahout文件夹下,路径如下所示: G:\mahout\mahout-distribution-0.6\docs 学会查源代码的注释文档: 方案一:用maven创建一个mahout的开发环境(我用的是win7,eclipse作为集成开发环境,之后在Maven Dependencies中找到相应

mahout 实现canopy

环境: mahout-0.8 hadoop-1.1.2 ubuntu-12.04 理论这里就不说了,直接上实例: 下面举一个例子. 数据准备: canopy.dat文件,COPY到HDFS上,文件内容如下: 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 算法简单说明,步骤如下: (1) 将所有数据放进list中,选择两个距离,T1,T2,T1>T2 (2)While(list不为空) { 随机选择一个节点做cano

Mahout分步式程序开发 聚类Kmeans

阅读导读: 1.什么是聚类分析? 2.Mahout中的kmeans算法,默认的分融符是什么? 3.用kmeans算法得到的结果有什么特点? 1. 聚类算法kmeans 聚类分析是数据挖掘及机器学习领域内的重点问题之一,在数据挖掘.模式识别.决策支持.机器学习及图像分割等领域有广泛的应用,是最重要的数据分析方法之一.聚类是在给定的数据集合中寻找同类的数据子集合,每一个子集合形成一个类簇,同类簇中的数据具有更大的相似性.聚类算法大体上可分为基于划分的方法.基于层次的方法.基于密度的方法.基于网格的方

Mahout初步认识

Apache Mahout项目主要包括以下五个部分: 频繁模式挖掘:挖掘数据中频繁出现的项集. 聚类:将诸如文本.文档之类的数据分成局部相关的组. 分类:利用已经存在的分类文档训练分类器,对未分类的文档进行分类. 推荐引擎(协同过滤):获得用户的行为并从中发现用户可能喜欢的事务. 频繁子项挖掘:利用一个项集(查询记录或购物目录)去识别经常一起出现的项目. 在Mahout实现的机器学习算法: 算法类 算法名 中文名 分类算法 Logistic Regression 逻辑回归 Bayesian 贝叶

Mahout学习之Mahout简介、安装、配置、入门程序测试

一.Mahout简介 查了Mahout的中文意思--驭象的人,再看看Mahout的logo,好吧,想和小黄象happy地玩耍,得顺便陪陪这位驭象人耍耍了... 附logo: (就是他,骑在象头上的那个Mahout) 步入正文啦: Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现.分类.聚类等.Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的

数据挖掘-Mahout-Canopy聚类实践

1.原理解释 (1)原始数据集合List按照一定的规则进行排序,初始距离阈值设置为T1.T2,T1>T2. (2)在List中随机挑选一个数据向量A,使用一个粗糙距离计算方式计算A与List中其它样本数据向量之间的距离d. (3)根据2中的距离d,把d小于T1的样本数据向量划到一个canopy中,同时把d小于T2的样本数据向量从List中移除. (4)重复2.3,直至List为空 2.下载测试数据 cd /tmp hadoop dfs -mkdir /input wget http://arch