Mahout 模糊kmeans

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

时间: 2025-01-01 10:57:49

Mahout 模糊kmeans的相关文章

初学Mahout测试kmeans算法

预备工作: 启动hadoop集群 准备数据 Synthetic_control.data数据集下载地址http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data 在集群中创建 /user/root/testdata 目录,必须是这个目录,不能改变,若是改变的话,得对应的去改变源码. 将准备好的数据上传到集群的/user/root/testdata下. 预备工作结束. 正式测试: 运行:[[ema

Mahout分步式程序开发 聚类Kmeans

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

Mahout简介

Mahout简介 一.mahout是什么 Apache Mahout是ApacheSoftware Foundation (ASF)旗下的一个开源项目,提供了一些经典的机器学习的算法,皆在帮助开发人员更加方便快捷地创建智能应用程序.目前已经有了三个公共发型版本,通过ApacheMahout库,Mahout可以有效地扩展到云中.Mahout包括许多实现,包括聚类.分类.推荐引擎.频繁子项挖掘. Apache Mahout的主要目标是建立可伸缩的机器学习算法.这种可伸缩性是针对大规模的数据集而言的.

K-Means 聚类算法

K-Means 概念定义: K-Means 是一种基于距离的排他的聚类划分方法. 上面的 K-Means 描述中包含了几个概念: 聚类(Clustering):K-Means 是一种聚类分析(Cluster Analysis)方法.聚类就是将数据对象分组成为多个类或者簇 (Cluster),使得在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大. 划分(Partitioning):聚类可以基于划分,也可以基于分层.划分即将对象划分成不同的簇,而分层是将对象分等级. 排他(Exclu

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学习路线图-张丹老师

前言 Mahout是Hadoop家族中与众不同的一个成员,是基于一个Hadoop的机器学习和数据挖掘的分布式计算框架.Mahout是一个跨学科产品,同时也是我认为Hadoop家族中,最有竞争力,最难掌握,最值得学习的一个项目之一. Mahout为数据分析人员,解决了大数据的门槛:为算法工程师,提供基础的算法库:为Hadoop开发人员,提供了数据建模的标准:为运维人员,打通了和Hadoop连接. Mahout就是训象人,在Hadoop上创造新的智慧! 目录 Mahout介绍 Mahout学习路线图

用Maven构建Mahout项目实现协同过滤userCF--单机版

本文来自:http://blog.fens.me/hadoop-mahout-maven-eclipse/ 前言 基于Hadoop的项目,不管是MapReduce开发,还是Mahout的开发都是在一个复杂的编程环境中开发.Java的环境问题,是困扰着每个程序员的噩梦.Java程序员,不仅要会写Java程序,还要会调linux,会配hadoop,启动hadoop,还要会自己运维.所以,新手想玩起 Hadoop真不是件简单的事. 不过,我们可以尽可能的简化环境问题,让程序员只关注于写程序.特别是像算

用Maven构建Mahout项目实现协同过滤ItemCF--集群版

本文来自于:http://blog.fens.me/hadoop-mahout-mapreduce-itemcf/ 前言 Mahout是Hadoop家族一员,从血缘就继承了Hadoop程序的特点,支持HDFS访问和MapReduce分步式算法.随着Mahout 的发展,从0.7版本开始,Mahout做了重大的升级.移除了部分算法的单机内存计算,只支持基于Hadoop的MapReduce平行计算. 从这点上,我们能看出Mahout走向大数据,坚持并行化的决心!相信在Hadoop的大框架下,Maho

Mahout学习路线图

前言 Mahout是Hadoop家族中与众不同的一个成员,是基于一个Hadoop的机器学习和数据挖掘的分布式计算框架.Mahout是一个跨学科产品,同时也是我认为Hadoop家族中,最有竞争力,最难掌握,最值得学习的一个项目之一. Mahout为数据分析人员,解决了大数据的门槛:为算法工程师,提供基础的算法库:为Hadoop开发人员,提供了数据建模的标准:为运维人员,打通了和Hadoop连接. Mahout就是训象人,在Hadoop上创造新的智慧! 目录 Mahout介绍 Mahout学习路线图