Mahout 模糊kmeans

本文详细介绍了Mahout中的模糊KMeans算法原理及其MapReduce实现方式。阐述了模糊C均值聚类(FCM)的基本概念,包括算法流程、价值函数及收敛条件,并通过实例展示了如何使用Mahout API进行聚类分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 pointw为权重,对该算法

 private Vector s2 ;  s2= x pointw为权重,对该算法

(三)寻找中心点

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

转载于:https://www.cnblogs.com/cl1024cl/p/6205087.html

<think>我们正在处理用户关于在Hadoop上使用Mahout运行KMeans聚类算法的问题。根据提供的引用,我们可以整理出以下步骤:1.环境准备:安装和配置Hadoop、Mahout以及Java环境。2.数据准备:将输入数据转换成MahoutKMeans算法要求的格式(通常是SequenceFile格式)。3.生成初始聚类中心:可以使用Mahout提供的kmeans聚类算法生成初始中心点,或者随机生成。4.运行KMeans算法:通过命令行调用Mahoutkmeans命令。5.查看结果:Mahout输出的聚类结果需要转换回可读格式。具体步骤:**1.环境配置**根据引用[4],需要配置Java、Hadoop和Mahout的环境变量。确保在/etc/profile中设置JAVA_HOME、HADOOP_HOME、MAHOUT_HOME等,并将它们的bin目录加入PATH。**2.数据准备**MahoutKMeans算法要求输入数据为SequenceFile格式,其中键为文本(通常可以忽略),值为向量(VectorWritable)。用户需要将原始数据转换成这种格式。例如,如果原始数据是文本文件,每行是一个用空格分隔的数值向量,可以使用Mahout提供的`seqdirectory`和`seq2sparse`工具进行转换,或者自己编写程序转换。**3.生成初始聚类中心**可以使用Mahout的`kmeans`命令的`-c`参数指定初始聚类中心路径。如果该路径不存在,Mahout会随机选择输入数据中的点作为初始中心。也可以使用`org.apache.mahout.clustering.kmeans.RandomSeedGenerator`生成随机中心点。**4.运行KMeans算法**命令行示例(引用[2]):```mahoutkmeans-i<inputvectors>-c<initialclusters>-o<outputdirectory>-k<numberofclusters>-x<maxiterations>-ow--clustering```参数说明:-`-i`:输入向量路径(HDFS路径)-`-c`:初始聚类中心路径-`-o`:输出目录-`-k`:聚类数目-`-x`:最大迭代次数-`-ow`:如果输出目录存在则覆盖-`--clustering`:在迭代结束后运行聚类分配步骤,将每个点分配到最终的聚类中**5.结果转换**Mahout的输出结果也是SequenceFile格式,可以使用`clusterdump`工具转换成可读文本:```mahoutclusterdump-i<clusters-*-final>-o<outputtextfile>-p<clusteredPointsdirectory>-d<dictionaryfile>-dtsequencefile-b100-n20--evaluate-dmorg.apache.mahout.common.distance.EuclideanDistanceMeasure-sp0```其中:-`-i`:聚类中心路径(如输出目录下的`clusters-*-final`)-`-p`:包含聚类点的路径(通常为输出目录下的`clusteredPoints`)-`-o`:输出的文本文件-`-d`:字典文件(如果数据是文本形式的向量,可能需要字典来映射特征索引到实际词)-`-dt`:字典文件格式(如`sequencefile`或`text`)注意:在运行Mahout命令前,确保Hadoop集群已经启动。**常见错误**:-输入路径不存在(如引用[3]中的错误):确保输入路径在HDFS上存在,并且路径正确。-环境变量配置错误:确保Mahout、Hadoop等环境变量配置正确,并且可以在命令行中调用。根据上述步骤,我们可以为用户提供一个详细的教程。由于用户要求生成相关问题,我们在回答后添加相关问题。现在,我们按照用户要求的结构化方式回答。</think>### 在Hadoop上使用Mahout实现KMeans聚类算法的步骤 #### 1. **环境准备** - **安装配置**: - 安装Java(JDK 1.7+)、Hadoop(1.x或2.x)、Mahout(0.6+)[^4] - 配置环境变量(示例配置): ```bash export JAVA_HOME=/usr/java/jdk1.8.0_301 export HADOOP_HOME=/usr/lib/hadoop export MAHOUT_HOME=/opt/mahout export PATH=$PATH:$HADOOP_HOME/bin:$MAHOUT_HOME/bin ``` - **验证安装**: ```bash hadoop version # 验证Hadoop mahout --help # 验证Mahout ``` #### 2. **数据预处理** - **格式转换**:将原始数据转换为Mahout支持的SequenceFile格式(键值对存储) ```bash mahout seqdirectory -i /input/raw_data -o /output/seq_data -c UTF-8 ``` - **向量化**:将文本数据转换为数值向量(TF-IDF等) ```bash mahout seq2sparse -i /output/seq_data -o /output/tfidf-vectors ``` #### 3. **运行KMeans算法** - **命令行执行**(关键参数说明)[^2]: ```bash mahout kmeans \ -i /output/tfidf-vectors \ # 输入向量路径 -c /output/initial-clusters \ # 初始聚类中心路径 -o /output/kmeans-result \ # 输出目录 -k 10 \ # 聚类数量 -x 100 \ # 最大迭代次数 -ow \ # 覆盖输出目录 --clustering # 执行聚类分配 ``` - **参数细节**: - 若未提供初始中心点(`-c`),Mahout会随机选择$k$个点作为初始中心 - 使用`-dm`指定距离度量(默认为欧氏距离) #### 4. **结果解析** - **转换可读格式**: ```bash mahout clusterdump \ -i /output/kmeans-result/clusters-*-final \ # 最终聚类中心 -o ./clusters.txt \ # 文本输出路径 -d /output/tfidf-vectors/dictionary.file-0 \ # 字典文件 -dt sequencefile # 字典格式 ``` #### 5. **常见问题解决** - **路径错误**:确保所有路径在HDFS中存在(避免`Input path does not exist`错误)[^3] - **内存不足**:在`mahout-env.sh`中调整JVM堆大小: ```bash export MAHOUT_HEAPSIZE=4096 ``` - **版本兼容**:Mahout 0.9+需显式调用Spark/H2O后端: ```bash mahout spark-kmeans -i ... # Spark模式 ``` > **关键提示**:完整流程依赖HDFS数据存储,所有输入/输出路径需为HDFS路径(如`hdfs://namenode:8020/path`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值