Во-первых, я должен сказать, что я новичок в Matlab (и на этом сайте...), поэтому, пожалуйста, извините мое невежество.
Я пытаюсь написать функцию в Matlab, которая будет использовать Spectral Clustering для разделения набора точек на два кластера.
мой код выглядит следующим образом
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-й член 2-го собственного вектора положителен, 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.
Интересно, что я делаю неправильно?
Примечание. Я работаю над вышеперечисленным как часть домашнего задания.
Заранее спасибо!