Mahout  模糊KMeans

一、算法流程

模糊 C 均值聚类(FCM),即众所周知的模糊 ISODATA,是用隶属度确定每个数据点属于某个聚类的程度的一种聚类算法。1973 年,Bezdek 提出了该算法,作为早期硬 C 均值聚类(HCM)方法的一种改进。 FCM 把 n 个向量 xi(i=1,2,...,n)分为 c 个模糊组,并求每组的聚类中心,使得非相似性指标的价值函数达到最小。FCM 使得每个给定数据点用值在
0,1 间的隶属度来确定其属于各个组的程度。与引入模糊划分相适应,隶属矩阵 U 允许有取值在 0,1 间的元素。不过,加上归一化规定,一个数据集的隶属度的和总等于 1:

那么,FCM 的价值函数(或目标函数)就是下式一般化形式:

这里 uij 介于 0,1 间;ci 为模糊组 i 的聚类中心,dij=||ci-xj||为第 i 个聚类中心与第 j 个数据点间的欧几里德距离;且 m (属于1到无穷)是一个加权指数。

    构造如下新的目标函数,可求得使下式达到最小值的必要条件:其实就是拉格朗日乘子法

对上式所有输入参量求导,使上式达到最小的必要条件为:

由上述两个必要条件,模糊 C 均值聚类算法是一个简单的迭代过程。在批处理方式运行时,FCM 用下面步骤确定聚类中心 ci 和隶属矩阵 U:

    步骤 1:用值在 0,1 间的随机数初始化隶属矩阵 U。

    步骤 2:用式(3)计算 c 个聚类中心ci,i=1,...,c。

    步骤 3:根据式(1)计算价值函数。如果它小于某个确定的阀值,或它相对上次价

        值函数值的改变量小于某个阀值,则算法停止。

    步骤 4:用(4)计算新的 U 矩阵和。返回步骤 2。

    上述算法也可以先初始化聚类中心,然后再执行迭代过程。由于不能确保 FCM 收敛于一个最优解。算法的性能依赖于初始聚类中心。因此,我们要么用另外的快速算法确定初始聚类中心,要么每次用不同的初始聚类中心启动该算法,多次运行 FCM。

二、MapReduce实现

(一)初始化中心

RandomSeedGenerator 将输入的向量随机选择K个输出到HDFS作为Fuzzy Kmeans 聚类的初始中心点。

(二) 簇定义

簇Cluster是一个实体,保存该簇的关键信息。

 private int id;
簇编号

核心参数:计算完数据后最终的簇属性

private long numPoints;
簇中点的个数

private Vector center;
中心向量 center=

private Vector radius;
半径向量 radius =

调整参数:簇中加入一个点后调整的参数

private double s0; s0= 权重和。对该算法

private Vector s1;  s1=  x
为point,w为权重,对该算法。

private Vector s2 ;  s2= x
为point,w为权重,对该算法。

(三)寻找中心点

FCM算法用一个Job寻找cluster的中心点。在map的初始化节点,加载初始化(或上一轮迭代的结果)中心点。在map中计算point 和每一个簇的亲和度。在combiner计算同一个cluster的参数,该过程只能计算同一cluster的局部信息。在reduce中首先计算同一个cluster的全局参数,然后计算该cluster是否收敛,输出cluster。

在HDFS中读取所有cluster,只要有一个cluster没有收敛,或者没有达到设定的迭代次数,则继续执行Job。直到符合以上两个条件。

 Map:

List<SoftCluster>clusters = new ArrayList<SoftCluster>()

setUp(){

加载初始化cluster中心或者上一轮cluster中心点,填充clusters。

}

Map(WritableComparable<?>key, VectorWritable point){

For(cluster :clusters){

计算point和每一个cluster的亲和度。

S0=

S1=point

S2=

}

}

 Combier:

合并同一簇局部参数,其中。s0=  , s1=,s2=。

 Reduce:

1. 合并同一簇的全局参数,其中。s0= , s1=,s2=。计算中心点等参数。

2.计算簇是否收敛。当前的中心点和之前cluster的中心点的距离<=收敛值,则收敛,否则为不收敛。

3.计算参数,点个数,中心向量,半径等。计算公式参看上文。

(四)划分数据

上面的Job收敛之后,得到了k个cluster的中心,划分数据就是把向量划分到cluster中。过程相对简单。

1. 计算point和所有cluster的距离,计算亲和向量。

2. 将点归属到cluster中,这里面有两个策略,一个是划分到亲和度最大的簇中,另外一个是划分到大于阈值的所有簇中。

3. 输出key: 簇id ,value :WeightedVectorWritable(pdf,point) 。Pdf为亲和度。

三、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)

最大迭代次数

--m(-m)

>1的值

--emitMostLikely (-e)

是否提交最大似然

--overwrite(-ow)

是否覆盖上次操作

--clustering(-cl)

是否执行聚类

--method(-xm)

默认”mapreduce”,或”sequential”

 

示例

String  [] args ={"--input","vector/tfidf-vectors",

"--output","fkmeans",

"--distanceMeasure","org.apache.mahout.common.distance.

CosineDistanceMeasure",

"--clusters","fkmeans",

"--numClusters","3",

"--convergenceDelta","0.1",

"--maxIter","5",

"--overwrite",

"-m","3",

"--clustering",

"--emitMostLikely"

};

FuzzyKMeansDriver.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

四、参考文献

1.《web 数据挖掘》

2.《模式分类》

3.博客 http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/cmeans.html

4.博客http://www.cs.princeton.edu/courses/archive/fall08/cos436/Duda/C/fk_means.htm

Mahout 模糊kmeans的更多相关文章

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

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

  2. Matalab之模糊KMeans实现

    这节继续上节的KMeans进行介绍,上节主要是对模糊KMeans方法的原理做了介绍,没有实践印象总是不深刻,前段时间有个师姐让我帮着写了个模糊KMeans的算法,今天就拿她给出的例子来对这个方法做个实 ...

  3. (转)mahout中k-means例子的运行

           首先简单说明下,mahout下处理的文件必须是SequenceFile格式的,所以需要把txtfile转换成sequenceFile.SequenceFile是hadoop中的一个类,允 ...

  4. mahout中KMeans算法

    本博文主要内容有   1.kmeans算法简介 2.kmeans执行过程  3.关于查看mahout中聚类结果的一些注意事项 4.kmeans算法图解      5.mahout的kmeans算法实现 ...

  5. 初学Mahout测试kmeans算法

    预备工作: 启动hadoop集群 准备数据 Synthetic_control.data数据集下载地址http://archive.ics.uci.edu/ml/databases/synthetic ...

  6. Matalab之模糊KMeans原理

    对Kmeans方法相信大家都会不陌生,这是一种广泛被应用的基于划分的聚类算法.首先对它的核心思想做一个简单的介绍: 算法把n个向量xj(1,2…,n)分为c个组Gi(i=1,2,…,c),并求每组的聚 ...

  7. mahout 查看kmeans结果的命令

    $mahout seqdumper -i  output/clusters-1/part-r-00000 直接在控制台上显示,要写入文件可以在后面加上-o <输出路径> mahout中的k ...

  8. 转】Mahout分步式程序开发 聚类Kmeans

    原博文出自于: http://blog.fens.me/hadoop-mahout-kmeans/ 感谢! Mahout分步式程序开发 聚类Kmeans Hadoop家族系列文章,主要介绍Hadoop ...

  9. Mahout分步式程序开发 聚类Kmeans(转)

    Posted: Oct 14, 2013 Tags: clusterHadoopkmeansMahoutR聚类 Comments: 13 Comments Mahout分步式程序开发 聚类Kmeans ...

随机推荐

  1. Linux(十七)动态监控进程

    17.1 介绍 top与ps命令很相似.它们都用来显示正在执行的进程.top与ps最大的不同之处,在于top在执行一段时间可以更新正在运行的进程 17.2 语法 top    [选项] 常用选项   ...

  2. Winform DevExpress控件库(三) 使用NavBarControl控件定制导航栏

    NavBarControl控件:主要作用是制作包含多个选项组并且每个组里包含多个子选项的导航栏: 位于 工具箱 -> Navigation & Layout(导航栏与布局类控件) 目录下 ...

  3. 关于bitmap你不知道的一些事

    1.计算机表示图形的几种方式 1)BMP :几乎不进行压缩 占用空间比较大 2)JPG : 在BMP的基础上对相邻的像素进行压缩,占用空间比BMP小 3) PNG : 在JPG的基础上进一步压缩 占用 ...

  4. 用reg文件把便携版sublime text 3添加到右键菜单

    假设sublime文件夹在C:\\Users\\T430i\\Downloads\\Sublime Text Build 3059 x64\\ 则: Windows Registry Editor V ...

  5. JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

    JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...

  6. 【java多线程系列】java中的volatile的内存语义

    在java的多线程编程中,synchronized和volatile都扮演着重要的 角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性,可见性指的是当一 ...

  7. 1081. Rational Sum (20) -最大公约数

    题目如下: Given N rational numbers in the form "numerator/denominator", you are supposed to ca ...

  8. Maven2插件开发入门

    一.创建Maven项目 首先创建一个Maven插件项目,可以手动或使用mvn archetype:create从原型创建.pom.xml配置如下: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  9. Cocos2D iOS之旅:如何写一个敲地鼠游戏(二):Cocos2D中的高清支持

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  10. 头部——MimeHeaders

    http协议的请求头部更像一个键值对,例如Content-Length : 123,前面为键后面为值,表示文本长度为123.对于若干个头部在请求对象中被封装成MimeHeaders对象,MimeHea ...