mahout spectral聚类1

本文介绍了一种高级聚类算法——谱聚类。该算法通过构建相似度矩阵并将其稀疏化,随后计算拉普拉斯矩阵的特征向量,实现降维效果。文中详细解释了从输入数据到最终聚类结果的全过程,包括数据格式、任务提交方式及结果查看方法。

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

转载:http://blog.youkuaiyun.com/xyilu/article/details/9883701#0-tsina-1-75972-397232819ff9a47a7b7e80a40613cfe1

谱聚类(spectral clustering)对样本空间的形状无限制,并收敛于全局最优解。什么意思呢?我们知道,kmeans聚类要求样本来自欧式空间,从而可以计算欧氏距离,进而根据欧式距离来决定 一个样本点归属于哪一个类,但显示总是残酷的,我们研究的对象往往病来来源于欧式空间,举个例子,如果有个集,比方说是一群人,每个人具有身高、年龄、等难以统一的属性。这样欧氏距离就难以计算。不仅如此,k-means还可能 因为初始中心点选取不当从而陷入局部最优解中。

其实谱聚类最大的价值并不是对空间形状无要求,而是在于他针对海量样本进行聚类的高性能表现,而这一成就,是用过相似度矩阵稀疏化、拉布拉斯矩阵降为来达到的。

我们同样先关注如下问题:
谱聚类时什么?
输入数据的格式是什么?
如何提交程序执行聚类?
输出结果如何查看?

谱聚类是什么?
起框架性流程如下:
构建样本集的相似度矩阵W
对相似度矩阵W进行稀疏化,形成新的相似度矩阵A
构建相似度矩阵A的拉布拉斯矩阵L,L=D-W,其中D是degree matrix
计算拉普拉斯矩阵L的前K个特征值和特征向量,构建特征向量空间
将前K个特征向量组合成N*K的矩阵,每一行看成K维空间的一个向量,利用K-means或其他讲点聚类算法对该矩阵进行聚类

所以谱聚类并不神秘,他是降维后做K-means

数据格式:
谱聚类要求直接输入相似度矩阵,而且要以(i,j,value)的形式输入,其中i,j是矩阵元素的行标签和列标签,以0开始,value是对应矩阵元素的值,我们这次实验准备的数据如图所示,他是已经计算好的相似度矩阵,是一个对称矩阵,并且对角线是行都是零。
这里写图片描述

mahout spectral clustering 任务提交
准备好数据后,我们需要把数据文件上传到hdfs

hadoop fs -put ...

然后执行以下命令行提交任务进行k-means聚类:

mahout spectralkmeans \
-i $hadoop_mahout/data\
-o $hadoop_mahout/\
-k 2\
-d 6\
--maxIter 100
-d是相似度矩阵的维度
--maxiter限制最大迭代次数

输出结果查看
Spectral Clustering的输出结果就保存在$HADOOP_MAHOUT文件夹下,包含5个子文件:
../calculations
../clusteredPoints
../clusters-0
../clusters-1
../clusters-2

calculations 存放计算过程产生的数据
clusteredPoints 是最后的聚类结果,里面记录了每个向量及其对应所分的类
clusters-0至cluster-2是程序 最后执行k-means聚类,经过两次迭代所产生的数据文件,cluster-2是最后聚类结果

同样的,以上数据文件都是sequence file的形式,不能直接查看。我们使用下面的命令,将数据转化为可阅读的文本:
mahout seqdumper \
-s HADOOPMAHOUT/clusteredPoints/partm00000 o LOCAL/clusteredPoints

mahout seqdumper \
-s HADOOPMAHOUT/clusters0/partrandomSeed o LOCAL/clusters-0

mahout seqdumper \
-s HADOOPMAHOUT/clusters1/partr00000 o LOCAL/clusters-1

mahout seqdumper \
-s HADOOPMAHOUT/clusters2/partr00000 o LOCAL/clusters-2
clusteredPoints展示了每个样本分别属于哪个类别,其中key后面的值是类别编号,value后面的值是数据点,不过光看value的数据我们已经看不出它跟初始的相似度矩阵的联系了,好在它是按样本的顺序排列的。以下是实例的clusteredPoints数据文件内容:
Key: 1: Value: 1.0: [0.188, -0.982]
Key: 1: Value: 1.0: [0.915, 0.404]
Key: 4: Value: 1.0: [-0.902, 0.432]
Key: 1: Value: 1.0: [0.465, -0.885]
Key: 4: Value: 1.0: [0.748, 0.664]
Key: 4: Value: 1.0: [-0.994, 0.112]
clusters-0至clusters-2是K-means聚类的生成结果,我们的问题是,K-means操作的数据集是什么?这涉及calculations这个文件夹。它的子文件如下:
../diagonal
../eigenvectors-192
../eigenverifier
../laplacian-0
../seqfile-168
../unitvectors-80
../vector
注意eigenvectors-、laplacian-、seqfile-、unitvectors-后面的数字是随机生成的。K-means聚类的对象就存放在unitvectors-80的数据文件中,用vectordump可以把数据转换成可阅读的形式查看:
mahout vectordump \
-s HADOOPMAHOUT/calculations/unitvectors80/partm00000 o LOCAL/calculations-unitvectors
其内容如下:
{1:-0.9821410024116984,0:0.18814635628080645}
{1:0.40378499159750353,0:0.9148539121414981}
{1:0.43206003606297805,0:-0.9018448454347666}
{1:-0.8853509357734358,0:0.46492334908574123}
{1:0.6639814955737503,0:0.747749004369545}
{1:0.11218035585847443,0:-0.9936878623388062}
所代表的矩阵是:

图2
这里写图片描述

回过头去看clusteredPoints的内容,是不是对上号了?

clusters-0给出了每个类别的初始中心点,如下所示:
Key: 1: Value: CL-1{n=0 c=[0.915, 0.404] r=[]}
Key: 4: Value: CL-4{n=0 c=[0.748, 0.664] r=[]}

我们还可以使用clusterdump将clusteredPoints和clusters-0至clusters-2的结果整合在一起,由于clusters-2代表了最后的聚类结果,我们来查看这个文件代表的类别。命令行如下:
mahout clusterdump \
-s HADOOPMAHOUT/clusters2 p HADOOP_MAHOUT/clusteredPoints \
-o $LOCAL/clusters-2-dump

样例为:
VL-1{n=3 c=[0.523, -0.488] r=[0.299, 0.632]}
Weight: Point:
1.0: [0.188, -0.982]
1.0: [0.915, 0.404]
1.0: [0.465, -0.885]
VL-4{n=3 c=[-0.383, 0.403] r=[0.800, 0.226]}
Weight: Point:
1.0: [-0.902, 0.432]
1.0: [0.748, 0.664]
1.0: [-0.994, 0.112]
其中,
VL-1代表这是一个cluster
n=3代表该cluster有3个点
c=[…]代表该cluster的中心点
r=[…]代表cluster的半径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值