非負矩陣分解(4):NMF算法和聚類算法的聯系與區別


作者:桂。

時間:2017-04-14   06:22:26

鏈接:http://www.cnblogs.com/xingshansi/p/6685811.html

聲明:歡迎被轉載,不過記得注明出處哦~


前言

之前梳理了一下非負矩陣分解(Nonnegative matrix factorization, NMF),主要有:

  1)准則函數及KL散度

  2)NMF算法推導與實現

  3)拉格朗日乘子法求解NMF(將含限定NMF的求解 一般化)

譜聚類可以參考之前的文章:

  1)拉普拉斯矩陣(Laplace Matrix)與瑞利熵(Rayleigh quotient)

  2)譜聚類(Spectral clustering)(1):RatioCut

  3)譜聚類(Spectral clustering)(2):NCut

總感覺NMF跟聚類有聯系,這里試着從聚類角度分析一下非負矩陣分解,主要包括:

  1)Kmeans與譜聚類

  2)對稱非負矩陣分解(symmetric NMF,SyNMF);

  3)非對稱非負矩陣分解;

內容為自己的學習總結,如果有不對的地方,還請幫忙指出。文中多有借鑒他人的地方,最后一並給出鏈接。

 

一、Kmeans與譜聚類

  A-Kmeans定義

,准則函數為:

可以重寫為:

定義h:

$n_k$為第k類樣本的個數,則准則函數變為:

從而Kmeans的優化問題,等價於:

  B-Kmeans與譜聚類(Spectral clustering)的聯系

上文給出了h的定義:

回顧譜聚類中RatioCut定義h的思路:

 

回顧RatioCut求解問題:

可以看出求解的思路完全一致,不同的是RatioCut是拉普拉斯矩陣L,而Kmeans是矩陣$X^TX$。正因為這點不同,Kmeans在利用譜聚類的思路求解時,略有差別。利用Kmeans的思想求Kmeans,聽着這不是欠揍嗎? 這里只是為了分析譜聚類一般方法(L)與譜聚類對應的Kmeans($X^TX$)二者的不同。

再次寫出RatioCut的步驟:

步驟一:求解拉普拉斯矩陣L

步驟二:對L進行特征值分解,並取K個最小特征值對應的特征向量(K為類別數目)

步驟三:將求解的K個特征向量(並分別歸一化),構成新的矩陣,對該矩陣進行kmeans處理

kmeans得到的類別標簽,就是原數據的類別標簽,至此完成RatioCut聚類。

對應Kmeans呢?是不是把$X^TX$換成L就等價於對原數據Kmeans?

步驟一:求解$X^TX$

步驟二:對$X^TX$進行特征值分解,並取K個最大特征值對應的特征向量(K為類別數目)

步驟三:將求解的K個特征向量(並分別歸一化),構成新的矩陣,對該矩陣進行kmeans處理

kmeans得到的類別標簽,就是原數據的類別標簽,至此完成RatioCut聚類。

對應測試code:

L = X'*X;% matrix
%%Step2:Eigenvalues decomposition
K = 3;
[Qini,V] = eig(L);
%%Step3:New matrix Q
[~,pos] = sort(diag(V),'ascend');
Q = Qini(:,pos(1:K));
Q = Q./repmat(sqrt(diag(Q'*Q)'),N,1);
[idx,ctrs] = kmeans(Q,K);

我們可以利用數據測試一下:

再來看看直接對原數據Kmeans的結果:

利用譜聚類的思想求解,得出了錯誤的分類結果,而直接Kmeans效果是理想的。

原因何在?問題就出在矩陣L上。回顧之前提到的拉普拉斯矩陣L特性:

它表示的是不同數據點特征的差距,而$X^TX$呢?

更像是一種余弦距離的測度,普通的Kmeans自然不能很好解決聚類。其實對$X^TX$利用譜聚類,特征向量子空間是嚴謹的,以三類為例,將特征子空間投影到二維,如下圖中間所示,很容易看出子空間特征是分成三類的,但聚類之后呢?如右圖所示,就出現了判別錯誤。這也是為什么上面兩種結果不一致。

總而言之:Kmeans是與譜聚類的思想一致,但由於中間矩陣不同,二者思路略有差異。

   C-Kernel Kmeans與譜聚類

這里就再啰嗦一下,數據分類效果不理想,映射到高維呢?也就是核函數(Kernel function)的思想。

重新寫出譜聚類框架下的Kmeans:

對X進行映射:,得出核函數下的Kmeans(Kernel Kmeans)

重新給出code(以kernel 取gaussian為例):

%Kmeans
sigma2 = .02;
L = exp(-dist(X,X').^2*sigma2);
[Qini,V] = eig(L);
%%Step3:New matrix Q
[~,pos] = sort(diag(V),'descend');
Q = Qini(:,pos(1:K));
for i =1:K
    Q(:,i) = Q(:,i)-min(Q(:,i));
end
Q = Q./repmat(sqrt(diag(Q'*Q)'),K*N,1);
[idx,ctrs] = kmeans(Q,K);

  對應分類結果:

這個時候分類就理想了。

 

二、對稱非負矩陣分解(SyNMF)

  A-原理介紹

Kmeans與RatioCut的理論框架是統一的,其實准則函數等價為:

現在將$H^TH = I$的約束去掉,泛化后的求解問題為:

這就是對稱非負矩陣分解(SyNMF)的思路。

  B-算法求解

求解思路還是利用拉格朗日乘子+KKT,不再細說,給出結果:

 泛化后:

得到H之后,如何實現數據的label判別?

可以看出得到的H分為三類,對應三種label, 即可實現數據分離。

給出SymNMF與譜聚類的對比:

對應的code可以點擊這里

給出一個測試結果圖,測試數據為三類:

 

三、非對稱非負矩陣分解

SymNMF是Spectral clustering的泛化推廣。

上文分析的是對稱的譜聚類問題:

  • Spectral clustering

  • SymNMF

同樣的方式,分析非對稱的譜聚類問題:

  •  Spectral clustering

該問題可以轉化為:

同樣的,對於:

進行泛化:

這就是NMF的准則函數,即:

  • NMF

 現在來總結一下:

關系是不是一目了然了?如何添加更多約束項呢?比如希望H矩陣盡可能系數等等,就在上面這幾類問題的准則函數后添加約束,轉化成對偶問題求解即可。

 

題外話

  A-非負矩陣NMF實現數據聚類

分析了這么多,已經解開了之前的困惑:譜聚類與NMF之間的聯系

回顧上面分析Kmeans提到的三類數據聚類問題,對$XX^T$進行NMF處理:

更直觀地,將數據放在對應維度觀察:

可以看到,由於矩陣對稱,即figure對稱,對W/H聚類,都可以得到三類標簽,從而實現數據的聚類。對於非對稱呢?自然想到:如果W對應樣本數量維度,則對W進行聚類,如果H對應樣本數量維度,就對H進行聚類,同樣可以實現數據聚類

給出一個利用(Kernel kmeans)聚類以及利用NMF聚類的對比示例。

利用$X^TX$是kmeans的思路,利用$L$是RatioCut思路,事實上,泛化之后,直接利用$X^TX$也可以利用是NMF的思路。

  

clc;clear all;close all;
N = 100;
K = 3;
X = [randn(N,2)+ones(N,2);...
    randn(N,2)+3*ones(N,2);...
    randn(N,2)-4*ones(N,2)];
posran = randperm(K*N);
X = X-min(min(X));
X = X(posran,:);

%%方法一 基於Data: 利用 XX'  + 核心函數
sigma2 = 0.02;
L = exp(-dist(X,X')*sigma2);
%%Step2:Eigenvalues decomposition
[Qini,V] = eig(L);
%%Step3:New matrix Q
[~,pos] = sort(diag(V),'descend');
Q = Qini(:,pos(1:K));
for i =1:K
    Q(:,i) = Q(:,i)-min(Q(:,i));
end
Q = Q./repmat(sqrt(diag(Q'*Q)'),K*N,1);
[idx,ctrs] = kmeans(Q,K);
figure 
subplot 221
plot(X(:,1),X(:,2),'.');
title('原數據');grid on;
subplot 222
plot3(Q(:,1),Q(:,2),Q(:,3),'b.');
title('特征');grid on;
subplot  223
plot3(Q(idx==1,1),Q(idx==1,2),Q(idx==1,3),'b.');hold on;
plot3(Q(idx==2,1),Q(idx==2,2),Q(idx==2,3),'r.');hold on;
plot3(Q(idx==3,1),Q(idx==3,2),Q(idx==3,3),'g.');hold on;
title('特征聚類');grid on;
subplot 224
plot(X(idx==1,1),X(idx==1,2),'b.');hold on;
plot(X(idx==2,1),X(idx==2,2),'r.');hold on;
plot(X(idx==3,1),X(idx==3,2),'g.');hold on;
title('聚類結果');grid on;
%%方法2 基於NMF: 對X*X'聚類
%即NMF
Iter = 500;
K = 3;
[W,H] = nmf(X*X',K,Iter);
[idx,ctrs] = kmeans(W,K,'distance','cityblock');
figure 
subplot 221
plot(X(:,1),X(:,2),'.');
title('原數據');grid on;
subplot 222
plot3(W(:,1),W(:,2),W(:,3),'b.');
title('W矩陣');grid on;
subplot  223
plot3(W(idx==1,1),W(idx==1,2),W(idx==1,3),'b.');hold on;
plot3(W(idx==2,1),W(idx==2,2),W(idx==2,3),'r.');hold on;
plot3(W(idx==3,1),W(idx==3,2),W(idx==3,3),'g.');hold on;
title('W矩陣聚類');grid on;
subplot 224
plot(X(idx==1,1),X(idx==1,2),'b.');hold on;
plot(X(idx==2,1),X(idx==2,2),'r.');hold on;
plot(X(idx==3,1),X(idx==3,2),'g.');hold on;
title('聚類結果');grid on;

  這里的代碼只是為了說明理論問題,代碼本身不足以支持應用。給出對應結果圖:

基於$X^TX$的Kmeans:

 

基於$X^TX$的NMF:

 

事實上,直接對$X$進行NMF聚類,只要將$X^TX$替換為$X$即可,對應結果圖:

這里可以理解為:H是對應的字典信息,W是線性變換。

  B-圖的聚類(不再是數據的聚類)

上文分析的是對數據點進行分類,如果直接對鄰接矩陣、拉普拉斯矩陣,也就是圖片信息進行分類呢?(可能有點繞,但數據點聚類,並不代表圖就是聚類,圖明顯可以聚類,對應的數據點也未必可以聚類)。

圖對應的矩陣,如拉普拉斯矩陣、鄰接矩陣等等,說到底都是figure的表達,如上圖所示,因此上文分析的矩陣W/B,可以用圖片的信息替代。

對於圖的聚類,一種思路是將圖中像素點讀取,轉化成數據格式,再進行聚類。

Data角度就是前面分析的種種類型,Figure角度呢?

給出NMF對圖片的處理結果(分四類):

對應code:

img = imread('2.png');
V = 1-im2bw(rgb2gray(img));
figure
K = 4;
Iter = 500;
[W,H] = nmf(V, K, Iter);
subplot 331
mesh(V);
title('原數據')

for i =1:K
    subplot(3,3,i+1);
    mesh(W(:,i)*H(i,:));
    title(['分解',num2str(i)])
end

NMF對於Figure是一種線性表達的思路,可以分離的基礎是數據不共線(橫/縱),再給出之前音樂分離的語譜圖:

之所以可以分離正是因為音樂頻譜的周期性,所以對於非周期的說話人,直接應用NMF應該是無效的,對應的時域波形:

 

參考:

  • On the Equivalence of Nonnegative Matrix Factorization and Spectral Clustering
  • Symmetric Nonnegative Matrix Factorization for Graph Clustering


免責聲明!

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



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