spectral clustering

参考这篇:

http://blog.csdn.net/liu1194397014/article/details/52990015

自己的改动:

 

% for kmeans function
pkg load statistics

A = load('Gaussian.txt');
%A = load('ringData.txt');
[m, n] = size(A);
data=A(:,:);
% markersize default is 6
%plot(data(:,1),data(:,2),'.', 'markersize', 10);
% col sum. x^2 + y^2
squareData = sum(data.*data,2);
transitData = data*data';
% repmat means repeat matrix to 1*m
xi = repmat(squareData,1,m);
xj = repmat(squareData',m,1);
E = 2*transitData-xi-xj;
sig = 1;
W = exp(E / (2 * sig * sig));
% set diagnoal to zeros
W = W - diag(diag(W));
D = diag(sum(W,2));
%L = D-W;
L =D^(-.5)*W*D^(-.5);

K = 3;
[X, di] = eig(L);
[Xsort, Dsort] = eigsort(X, di);
%Xsort = sort(X);
Xuse = Xsort(:, 1:K);

Xsq = Xuse.*Xuse;
divmat=repmat(sqrt(sum(Xsq')'),1,K);
Y=Xuse./divmat;

[c, Dsum, z] = kmeans(Y, K);
kk = c;
c1 = find(kk == 1);
c2 = find(kk == 2);
c3 = find(kk == 3);

plot(data(c1,1),data(c1,2),'.','marker', '+');
hold on;
plot(data(c2,1),data(c2,2),'.','marker', '*');
hold on;
plot(data(c3,1),data(c3,2),'.','marker', '+');

function [Vsort, Dsort] = eigsort (V, D)
  eigvals = diag(D);
  [lohival,lohiindex] = sort(eigvals);
  lambda = flipud(lohival);
  index = flipud(lohiindex);
  Dsort = diag(lambda);
% Sort eigenvectors to correspond to the ordered eigenvalues. Store sorted
% eigenvectors as columns of the matrix vsort.
  M = length(lambda);
  Vsort = zeros(M,M);
for i=1:M
  Vsort(:,i) = V(:,index(i));
end;

分别使用两个文件测试,结果如下图:

 

 

  

posted @ 2017-03-06 10:18  陆离可  阅读(232)  评论(0编辑  收藏  举报