谱聚类

时间:2013-03-18 15:31:56

标签: matlab cluster-analysis linear-algebra eigenvector

首先我必须说我是matlab的新手(以及这个网站......),所以请原谅我的无知。

我正在尝试在matlab中编写一个函数,它将使用光谱聚类将一组点分成两个聚类。

我的代码如下

function Groups = TrySpectralClustering(data)
dist_mat = squareform(pdist(data));

W=  zeros(length(data),length(data));

for i=1:length(data),
    for j=(i+1):length(data),
    W(i,j)=10^(-dist_mat(i,j));
    W(j,i)=W(i,j);
    end
end
D = zeros(length(data),length(data));
for i=1:length(W),
D(i,i)=sum(W(i,:));
end
L=D-W;
L=D^(-0.5)*L*D^(-0.5);
[ V E ] = eig(L);
disp ('V:');
disp (V);

如果我理解正确,那么通过使用第二个最小的特征向量,我应该能够将数据分区为两个簇 - 如果第二个特征向量的第i个成员是正的,那么第i个数据点将在一个群集,否则它将在另一个群集中。

但是,当我尝试以下

f=[1,1;0,0;1,0;0,1;100,100;100,101;101,101;101,100]
TrySpectralClustering(f)

我希望前四个点会形成一个群集,最后四个会形成另一个群集。

但是,我收到了

V:
   -0.0000   -0.5000    0.0000   -0.5777    0.0000    0.4078   -0.0000    0.5000
   -0.0000   -0.5000    0.0000    0.5777    0.0000   -0.4078   -0.0000    0.5000
   -0.0000   -0.5000    0.0000    0.4078    0.0000    0.5777   -0.0000   -0.5000
   -0.0000   -0.5000    0.0000   -0.4078    0.0000   -0.5777   -0.0000   -0.5000
   -0.5000   -0.0000   -0.0000   -0.0000   -0.7071   -0.0000    0.5000   -0.0000
   -0.5000   -0.0000    0.7071    0.0000   -0.0000   -0.0000   -0.5000   -0.0000
   -0.5000    0.0000   -0.0000    0.0000    0.7071    0.0000    0.5000    0.0000
   -0.5000         0   -0.7071         0         0         0   -0.5000         0

采取第二个特征向量

  -0.0000   -0.5000    0.0000    0.5777    0.0000   -0.4078   -0.0000    0.5000

我发现一个簇包括点1,0; 0,1; 100,100; 101,100 另一个簇由点1,1; 0,0; ​​100,101; 101,101

组成

我想知道我做错了什么。

注意:我正在将上述工作作为家庭作业项目的一部分。

提前致谢!

3 个答案:

答案 0 :(得分:3)

你得到的是正确的。设U是包含如上所示的特征向量的矩阵,并且将它们排列成使得第1列对应于最小特征值,而渐进列对应于递增特征值。然后,通过保留对应于较小特征值的特征向量来获取U的列的子集。现在,将这些列逐行读入一组新的向量,称之为Y. Cluster Y得到谱簇。所以,让我们假设我们的子集只是第一列。我们清楚地看到,如果你要聚集第一列,你会得到前4个到1个簇,接下来4个到另一个簇,这就是你想要的。

答案 1 :(得分:3)

查看实施on Prof. J. Shi's webpage。密切关注discretisation.m功能。

此外,您的代码效率非常低。您需要更多地利用Matlab的矢量化:

W = 10.^( - dist_mat ); % single liner of nested loop for comuting W
% computing the symmetric laplacian
d = sum( W, 2 ); % sum each row
d( d == 0 ) = 1; % avoid division by zero
d_half = 1./sqrt( d );
L = eye( n ) - bsxfun( @times, bsxfun( @times, W, d_half' ),  d_half );

答案 2 :(得分:2)

两个观察结果:

  1. L=D-W; L=D^(-0.5)*L*D^(-0.5); 你为什么让他计算单位矩阵?只需使用单位矩阵eye(n)并从中减去D ^( - 0.5)* W * D ^( - 0.5)来计算拉普拉斯算子

  2. eig将特征向量作为列返回,为什么要取行?您是否检查了E中相应特征值的值,因此可以确定您正在查看对应于第二个最小特征值的特征值?