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聚类的更多相关文章

  1. Mahout kmeans聚类

    Mahout  K-means聚类 一.Kmeans 聚类原理 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚 ...

  2. Canopy聚类算法(经典,看图就明白)

    只有这个算法思想比较对,其他 的都没有一开始的remove: 原网址:http://www.shahuwang.com/?p=1021 Canopy Clustering 这个算法是2000年提出来的 ...

  3. Canopy聚类算法分析

          原文链接:http://blog.csdn.net/yclzh0522/article/details/6839643 Canopy聚类算法是可以并行运行的算法,数据并行意味着可以多线程进 ...

  4. Mahout LDA 聚类

    Mahout LDA 聚类 一.LDA简介   (一)主题模型 在主题模型中,主题表示一个概念.一个方面,表现为一系列相关的单词,是这些单词的条件概率.形象来说,主题就是一个桶,里面装了出现概率较高的 ...

  5. Canopy聚类算法

    Canopy聚类算法(经典,看图就明白) 聚类算法. 这个算法获得的并不是最终结果,它是为其他算法服务的,比如k-means算法.它能有效地降低k-means算法中计算点之间距离的复杂度. 图中有一个 ...

  6. canopy聚类算法的MATLAB程序

    canopy聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. canopy聚类算法简介 Canopy聚类算法是一个将对象分组到 ...

  7. Mahout 系列之--canopy 算法

    Canopy 算法,流程简单,容易实现,一下是算法 (1)设样本集合为S,确定两个阈值t1和t2,且t1>t2. (2)任取一个样本点p属于S,作为一个Canopy,记为C,从S中移除p. (3 ...

  8. Canopy算法聚类

    Canopy一般用在Kmeans之前的粗聚类.考虑到Kmeans在使用上必须要确定K的大小,而往往数据集预先不能确定K的值大小的,这样如果 K取的不合理会带来K均值的误差很大(也就是说K均值对噪声的抗 ...

  9. mahout中kmeans算法和Canopy算法实现原理

    本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...

随机推荐

  1. Unity使用UGUI进行VR游戏的界面开发

    原文链接:http://gad.qq.com/article/detail/7181505 本文首发腾讯GAD开发者平台,未经允许,不得转载 我不知道有多少同学是跟我一样,在开发VR游戏中,是使用的面 ...

  2. RDO Stack:VMs cannot access external network.

    Issue: There are many root causes to make your openstack vm instances cannot be reached from externa ...

  3. 20160209.CCPP体系详解(0019天)

    程序片段(01):01.字符串.c 内容概要:字符串 #include <stdio.h> #include <stdlib.h> #include <locale.h& ...

  4. 干货!Android Studio快捷键VS Eclipse快捷键~亲测!

    eclipse as 英文描述 中文描述 ctrl+shift+r ctrl+shift+r Navigate->File 找工作空间的文件 ctrl+shift+t ctrl+shift+t ...

  5. 说一说关于破解支付宝AR红包的事

    当朋友圈的你们才开始分享支付宝AR红包的消息的时候,我已经对它动了一二三四次歪脑筋了,虽然事实证明并不是那么顺利,至今我也只在电脑前识别出5个不知道在哪里的红包,其中一个还因为定位信息不符开不了. 昨 ...

  6. Angularjs + Bootstrap 制作的一个TODO List

    看了一个关于Angularjs的视频,视频内容讲解的是如何制作一款TODO list形式的SPA(Simple Page Application,单页面应用).为了增强理解,下面写了一篇文章,用以复习 ...

  7. EBS业务学习之应付管理

    应付款系统是供应链管理的最后一个环节,它使公司能够支付供应商提供的货物和服务的费用.供应链管理的目标是保持低库存量但又有充足的存货以满足要求,仓库中的库存就等于钱,因此,应付款管理的目标是尽可能地推迟 ...

  8. Xcode的playground中对于SpriteKit物理对象的更新为何无效

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 为了便于SpriteKit中物理行为的调试,我们可以借助于Xc ...

  9. [Mysql]由Data truncated for column联想到的sql_mode配置

    系统日志中出现了 ata truncated for column 'agent' at row 1 mysql出现这个问题的原因,无非就是字符集设置 或者是 字段过长导致的. mysql在初始化的时 ...

  10. 3-sum问题

    给定一个整数数组,判断能否从中找出3个数a.b.c,使得他们的和为0,如果能,请找出所有满足和为0个3个数对. #define SIZE 10 void judgeAndPut(int* arr, i ...