спектральная кластеризация
во-первых, я должен сказать, что я новичок в 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 в другой кластер, который вы хотите.
взгляните на реализацию на веб-странице профессора Дж. Ши. Обратите пристальное внимание на
два замечания:
L=D-W; L=D^(-0.5)*L*D^(-0.5);
Почему ты позволяешь ему вычислять идентификационную матрицу? Просто используйте матрицу тождества eye (n) и вычитайте D^(-0.5) * W * D^(-0.5) из этого, чтобы вычислить лапласиан Leig возвращает собственные векторы в виде столбцов, почему вы берете строку? Вы проверили значения соответствующих собственных значений в E, поэтому вы можете быть уверены, что смотрите на собственный век, соответствующий 2-му наименьшему eigenval?