0

我已经尝试了几个小时,但我找不到解决方案。

我有“两个甜甜圈”数据样本(变量“X”)

您可以在下面的链接下载文件

甜甜圈数据集(rings.mat)

扩展到如下图所示的 2D 形状

前 250 点位于甜甜圈内,后 750 点位于甜甜圈外。

2 甜甜圈 2D 样本

我需要执行光谱聚类。

我用高斯相似距离制作(相似矩阵“W”)。

我通过每个原始“W”的总和制作度矩阵

然后我计算了特征值(E)和特征向量(V)

而且“V”字形不好。

我的审判有什么问题???

我想不通。

load rings.mat
[D, N] = size(X); % data stored in X
%initial plot data
figure; hold on; 
for i=1:N,
    plot(X(1,i), X(2,i),'o');
end
% perform spectral clustering
W = zeros(N,N); 
D = zeros(N,N);

sigma = 1;
for i=1:N,
    for j=1:N,
        xixj2 = (X(1,i)-X(1,j))^2 + (X(2,i)-X(2,j))^2 ;
        W(i,j) =  exp(  -1*xixj2 / (2*sigma^2) ) ;   % compute weight here
%          if (i==j)
%              W(i,j)=0;
%          end;
    end;
     D(i,i) = sum(W(i,:))    ;
end;

L = D - W ;
normL = D^-0.5*L*D^-0.5;
[u,s,v] = svd(normL);

图片

4

1 回答 1

1

如果您像在代码中一样使用拉普拉斯算子(“真正的”拉普拉斯算子),那么要将您的点聚类成两组,您将需要与第二小的特征值相对应的特征向量。

直观的想法是用弹簧将所有点相互连接,如果点彼此靠近,弹簧会更硬,而远离点的点则不会那么硬。如果您用锤子敲击弹簧网络并观察其振荡,拉普拉斯算子的特征向量就是振动模式 - 较小的特征值对应于较低频率的“体”模式,较大的特征值对应于较高频率的振荡。您想要与第二小的特征值相对应的特征值,这就像鼓中的第二个模式,正聚集在一起,负部分聚集在一起。

现在,关于是否使用最大或最小特征值的评论有些混乱,这是因为 dave 链接的论文中的拉普拉斯算子略有不同,即恒等式减去您的拉普拉斯算子。所以他们想要最大的,而你想要最小的。论文中的聚类也更高级,更好,但实现起来并不容易。

这是您的代码,修改后可以工作:

load rings.mat
[D, N] = size(X); % data stored in X
%initial plot data
figure; hold on; 
for i=1:N,
    plot(X(1,i), X(2,i),'o');
end
% perform spectral clustering
W = zeros(N,N); 
D = zeros(N,N);

sigma = 0.3; % <--- Changed to be smaller
for i=1:N,
    for j=1:N,
        xixj2 = (X(1,i)-X(1,j))^2 + (X(2,i)-X(2,j))^2 ;
        W(i,j) =  exp(  -1*xixj2 / (2*sigma^2) ) ;   % compute weight here
%          if (i==j)
%              W(i,j)=0;
%          end;
end;
     D(i,i) = sum(W(i,:))    ;
end;

L = D - W ;
normL = D^-0.5*L*D^-0.5;
[u,s,v] = svd(normL);

% New code below this point
cluster1 = find(u(:,end-1) >= 0);
cluster2 = find(u(:,end-1) < 0);

figure
plot(X(1,cluster1),X(2,cluster1),'.b')
hold on
plot(X(1,cluster2),X(2,cluster2),'.r')
hold off
title(sprintf('sigma=%d',sigma))

结果如下:

在此处输入图像描述

现在请注意,我将 sigma 更改为更小 - 从 1.0 到 0.3。当我把它留在 1.0 时,我得到了以下结果:

在此处输入图像描述

我认为这是因为在 sigma=1 的情况下,内部集群中的点能够足够“拉”到外部集群(距离它们大约为 1),因此将两个圆分成两半更有利于能量就像一个实心的振动鼓,而不是有两个不同的圆圈。

于 2015-11-20T09:43:41.237 回答