Мне нужна спектральная кластеризация для набора данных формы двух пончиков. (Matlab)

Я пробовал часы, но не могу найти решение.

У меня есть образец данных "два пончика" (переменная "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);

Изображение


person MJ.Shin    schedule 20.11.2015    source источник
comment
Форма буквы V не подходит — что это значит? В чем ошибка?   -  person dave    schedule 20.11.2015
comment
не ошибка. но я не могу найти четкую форму от V. вы можете попробовать мой код? Я тоже загрузил набор данных.   -  person MJ.Shin    schedule 20.11.2015
comment
Итак, вслед за Ng и соавт. у вас есть пара проблем: 1) вы не нормализовали лапласиан. 2) Вы никогда не выполняете кластеризацию... Вы, конечно, можете использовать SVD, если хотите, но, вероятно, проще просто применить k-средних с k=2. Почему бы вам не просмотреть раздел 2 этого: ai.stanford.edu /~ang/papers/nips01-spectral.pdf   -  person dave    schedule 20.11.2015
comment
Исходный шаблон имел код SVD для матрицы сходства (W). И я получил доступ к этому документу. Но я не могу понять. Если я смогу это понять, я не буду загружать этот вопрос. в любом случае, что я должен сделать, это рассчитать D^-0,5 * W * D^-0,5 ???. А что такое нормализация лапласиана?   -  person MJ.Shin    schedule 20.11.2015
comment
Итак, раздел 2 довольно ясен, т.е. Вы успешно создали матрицу подобия. Теперь вам нужно: 1) взять нормализованный лапласиан вместо ненормализованного, 2) взять верхние собственные векторы, затем 3) применить k-средние, чтобы получить обозначения кластеров.   -  person dave    schedule 20.11.2015
comment
Нет. Нормализованный лапласиан равен D^(-1/2)*L*D^(-1/2) (en.wikipedia.org/wiki/Laplacian_matrix)   -  person dave    schedule 20.11.2015
comment
Я знаю, что есть две версии лапласиана. \n 1. один L = D-W. два L=D^-0,5*W*D^-0,5. что правильно? какая нормализация? 3. верхний собственный вектор должен быть из второго минимального собственного значения? или максимальное значение?   -  person MJ.Shin    schedule 20.11.2015
comment
1) Нормализация определяется лапласианом L, не W.   -  person dave    schedule 20.11.2015
comment
2) Возьмите собственные векторы, соответствующие наибольшим собственным значениям   -  person dave    schedule 20.11.2015
comment
вы имеете в виду (L = DW) и (нормализованный L = D^(-1/2)*L*D^(-1/2)) ???   -  person MJ.Shin    schedule 20.11.2015
comment
Я рассчитал SVD для нормализованного лапласиана. и применил нормL к СВД. особенно, большая часть собственного значения от SVD была 1. некоторый хвост был меньше 1. Что я могу найти от SVD?   -  person MJ.Shin    schedule 20.11.2015
comment
здорово. теперь просто возьмите верхние собственные векторы и запустите k-средних.   -  person dave    schedule 20.11.2015
comment
[u,s,v] = svd(normL) выводит собственное значение s. и более 90% собственного значения равно 1. что не так?   -  person MJ.Shin    schedule 20.11.2015
comment
Я использовал [u,s,v] = svd(W) и проанализировал первый столбец матрицы u и обнаружил, что он явно сгруппирован.   -  person MJ.Shin    schedule 20.11.2015
comment
Если вы используете лапласиан $D^{-1/2}(D-W)D^{-1/2} = I - D^{-1/2}WD^{-1/2}$, вам понадобится собственные векторы, соответствующие наименьшим собственным значениям. В связанной статье они предлагают отказаться от термина идентичности и знака минус и использовать $D^{-1/2}WD^{-1/2}$. В этом случае вам понадобятся собственные векторы, соответствующие наибольшим собственным значениям.   -  person Nick Alger    schedule 20.11.2015


Ответы (1)


Если вы используете лапласиан, как в своем коде («настоящий» лапласиан), то для группировки ваших точек в два набора вам понадобится собственный вектор, соответствующий второму наименьшему собственному значению.

Интуитивная идея состоит в том, чтобы соединить все ваши точки друг с другом с помощью пружин, где пружины становятся более жесткими, если точки находятся рядом друг с другом, и менее жесткими, если точки находятся далеко. Собственные векторы лапласиана — это режимы вибрации, если вы ударяете молотком по пружинной сети и наблюдаете, как она колеблется: меньшие собственные значения соответствуют низкочастотным «объемным» модам, а большие собственные значения соответствуют более высокочастотным колебаниям. Вы хотите, чтобы собственное значение соответствовало второму наименьшему собственному значению, которое будет похоже на вторую моду в барабане, с положительной сгруппированной вместе и отрицательной частью сгруппированной вместе.

Теперь в комментариях возникает некоторая путаница по поводу того, следует ли использовать наибольшее или наименьшее собственное значение, и это связано с тем, что лапласиан в статье, на которую ссылается Дэйв, немного отличается, будучи тождеством минус ваш лапласиан. Так что там они хотят самые большие, а вы хотите самые маленькие. Кластеризация в документе также немного более продвинута и лучше, но не так проста в реализации.

Вот ваш код, модифицированный для работы:

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))

Вот результат:

введите здесь описание изображения

Теперь обратите внимание, что я изменил сигму на меньшую — с 1,0 до 0,3. Когда я оставил его на 1.0, я получил следующий результат:

введите здесь описание изображения

что, как я предполагаю, связано с тем, что при сигме = 1 точки во внутреннем кластере могли «притягивать» внешний кластер (от которого они находятся примерно на расстоянии 1) достаточно, чтобы было энергетически выгоднее разделить оба круга пополам. как твердый вибрирующий барабан, а не два разных круга.

person Nick Alger    schedule 20.11.2015
comment
Спасибо за ваш ответ. Я заменяю способ использования svd (W) и получаю первый/второй собственный векторный график. А затем кластеризовать эти собственные вектора. использование svd(L) кажется лучше, потому что порог просто 0. - person MJ.Shin; 24.11.2015