譜聚類Ng算法的Matlab簡單實現



請編寫一個譜聚類算法,實現“Normalized Spectral Clustering—Algorithm 3 (Ng 算法)”

結果如下


譜聚類算法核心步驟都是相同的:
•利用點對之間的相似性,構建親和度矩陣;
•構建拉普拉斯矩陣;
•求解拉普拉斯矩陣最小的特征值對應的特征向量(通常舍棄零特征所對應的分量全相等的特征向量);
•由這些特征向量構成樣本點的新特征,采用K-means等聚類方法完成最后的聚類。

采用K-means等聚類方法完成最后的聚類  意思是,對特征向量構成的矩陣T,每一行作為一個樣本點,進行K均值聚類。

(1)利用點對之間的相似性,構建親和度矩陣

構建圖時,頂點的度為 simK=10,分兩類kNearNum=2

simK=10;
Wij=zeros(r,r);% weight
% calculate the weight Matrix
for k=1:r  
    for n=1:r
         Wij(k,n)=exp(-norm(X(k,:)-X(n,:))^2/2/sigma);% 計算權重
    end
end

% find the Knear  for W
Wsort=zeros(r,r);
index=zeros(r,r);
for k=1:r
%  對每一行權重排序
   [Wsort(k,:),index(k,:)]=sort(Wij(k,:));  %這句話經常不會用,記住了。   
end

W=Wij


(2) 構建Laplace Matrix

首先需要個對角陣D,其對角元素是親和度矩陣的每行的和,這里也就是simK*eye(r)

% D
D=simK.*eye(r);
% Laplace Matrix
L=eye(r)-D^(-0.5)*W*D^(-0.5);
% L=D-W

(3) 求解拉普拉斯矩陣最小的特征值(lamda)對應的特征向量)(通常舍棄零特征所對應的分量全相等的特征向量);

把特征向量 Vect里最小的kNearNum(聚類的個數)個用u來存儲。

[Vect,lamdaMat]=eig(L);
lamda=zeros(k,1);
u=zeros(r,kNearNum);
% lamda是特征值
for k=1:r
    lamda(k)=lamdaMat(k,k);
end
% lamda
%  對lamda排序,找出最小的K個lamda對應的特征向量組成u
[sortLamda,indexLamda]=sort(lamda); 
countu=0;
for k=1:kNearNum
    countu=countu+1;
    u(:,countu)=Vect(:,indexLamda(k));  
end
% % T
T=zeros(r,kNearNum);% 歸一化后的u
sumU=zeros(1,kNearNum);% 為了歸一化u,對每列求了平方和sumU
for n=1:kNearNum
    for k=1:r
        sumU(1,n)=sumU(1,n)+u(k,n)^2;
    end
end

for k=1:r
    for n=1:kNearNum
        T(k,n)=u(k,n)./sqrt(sumU(1,n));
    end
end

(4)由這些特征向量構成樣本點的新特征, 采用K-means等聚類方法完成最后的聚類

意思是,對特征向量構成的矩陣T,每一行作為一個樣本點聚類

A=Kmeans(T)  % key words

Kmeans詳見下面鏈接







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM