譜聚類Ng演算法的Matlab簡單實現
阿新 • • 發佈:2019-02-03
請編寫一個譜聚類演算法,實現“Normalized Spectral Clustering—Algorithm 3 (Ng 演算法)”
結果如下
譜聚類演算法核心步驟都是相同的:
•利用點對之間的相似性,構建親和度矩陣;
•構建拉普拉斯矩陣;
•求解拉普拉斯矩陣最小的特徵值對應的特徵向量(通常捨棄零特徵所對應的分量全相等的特徵向量);
•由這些特徵向量構成樣本點的新特徵,採用K-means等聚類方法完成最後的聚類。
採用K-means等聚類方法完成最後的聚類 意思是,對特徵向量構成的矩陣T,每一行作為一個樣本點,進行K均值聚類。
(1)利用點對之間的相似性,構建親和度矩陣,
構建圖時,頂點的度為 simK=10,分兩類kNearNum=2
(2) 構建Laplace MatrixsimK=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
首先需要個對角陣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詳見下面連結