谱聚类(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/part−m−00000 −o
LOCAL/clusteredPoints
mahout seqdumper \
-s
HADOOPMAHOUT/clusters−0/part−randomSeed −o
LOCAL/clusters-0
mahout seqdumper \
-s
HADOOPMAHOUT/clusters−1/part−r−00000 −o
LOCAL/clusters-1
mahout seqdumper \
-s
HADOOPMAHOUT/clusters−2/part−r−00000 −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/unitvectors−80/part−m−00000 −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/clusters−2 −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的半径