спектральная кластеризация

во-первых, я должен сказать, что я новичок в 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-й член 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

принимая 2-й собственный вектор

  -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 ответов


то, что вы получаете правильный. Пусть U-матрица, содержащая собственные векторы, как показано выше, и пусть они расположены так, что 1-й столбец соответствует наименьшему собственному значению, а прогрессивные столбцы-восходящим собственным значениям. Затем возьмите подмножество столбцов U, сохранив собственные векторы, соответствующие меньшим собственным значениям. Теперь прочитайте эти столбцы по строкам в новый набор векторов, назовите его Y. кластер Y, чтобы получить спектральные кластеры. Итак, предположим наше подмножество-это только первый столбец. Мы ясно видим, что если бы u кластеризовал первый столбец, u получил бы первые 4 в 1 кластер, а следующие 4 в другой кластер, который вы хотите.


взгляните на реализацию на веб-странице профессора Дж. Ши. Обратите пристальное внимание на


два замечания:

  1. L=D-W; L=D^(-0.5)*L*D^(-0.5); Почему ты позволяешь ему вычислять идентификационную матрицу? Просто используйте матрицу тождества eye (n) и вычитайте D^(-0.5) * W * D^(-0.5) из этого, чтобы вычислить лапласиан L

  2. eig возвращает собственные векторы в виде столбцов, почему вы берете строку? Вы проверили значения соответствующих собственных значений в E, поэтому вы можете быть уверены, что смотрите на собственный век, соответствующий 2-му наименьшему eigenval?