什么是非負矩陣分解 NMF(Non-negative Matrix Factorization )


      著名的科學雜志《Nature》於1999年刊登了兩位科學家D.D.Lee和H.S.Seung對數學中非負矩陣研究的突出成果。該文提出了一種新的矩陣分解思想――非負矩陣分解(Non-negative Matrix Factorization,NMF)算法,即NMF是在矩陣中所有元素均為非負數約束條件之下的矩陣分解方法。該論文的發表迅速引起了各個領域中的科學研究人員的重視:一方面,科學研究中的很多大規模數據的分析方法需要通過矩陣形式進行有效處理,而NMF思想則為人類處理大規模數據提供了一種新的途徑;另一方面,NMF分解算法相較於傳統的一些算法而言,具有實現上的簡便性、分解形式和分解結果上的可解釋性,以及占用存儲空間少等諸多優點。
      信息時代使得人類面臨分析或處理各種大規模數據信息的要求,如衛星傳回的大量圖像、機器人接受到的實時視頻流、數據庫中的大規模文本、Web上的海量信息等。處理這類信息時,矩陣是人們最常用的數學表達方式,比如一幅圖像就恰好與一個矩陣對應,矩陣中的每個位置存放着圖像中一個像素的空間位置和色彩信息。由於實際問題中這樣的矩陣很龐大,其中存放的信息分布往往不均勻,因此直接處理這樣的矩陣效率低下,這對很多實際問題而言就失去了實用意義。為高效處理這些通過矩陣存放的數據,一個關鍵的必要步驟便是對矩陣進行分解操作。通過矩陣分解,一方面將描述問題的矩陣的維數進行削減,另一方面也可以對大量的數據進行壓縮和概括。

      在科學文獻中,討論利用矩陣分解來解決實際問題的分析方法很多,如PCA(主成分分析)ICA(獨立成分分析)SVD(奇異值分解)VQ(矢量量化)等。在所有這些方法中,原始的大矩陣V被近似分解為低秩的V=WH形式。這些方法的共同特點是,因子W和H中的元素可為正或負,即使輸入的初始矩陣元素是全正的,傳統的秩削減算法也不能保證原始數據的非負性。在數學上,從計算的觀點看,分解結果中存在負值是正確的,但負值元素在實際問題中往往是沒有意義的。例如圖像數據中不可能有負值的像素點;在文檔統計中,負值也是無法解釋的。因此,探索矩陣的非負分解方法一直是很有意義的研究問題,正是如此,Lee和Seung兩位科學家的NMF方法才得到人們的如此關注。
      NMF是一種新的矩陣分解算法,它克服了傳統矩陣分解的很多問題,通過尋找上下文有意義的解決方法,提供解釋數據的更深看法。NMF通過尋找低秩,非負分解那些都為非負值的矩陣。這在現實的應用中有很多例子,如數字圖像中的像素一般為非負數,文本分析中的單詞統計也總是非負數,股票價格也總是正數等等。NMF的基本思想可以簡單描述為:對於任意給定的一個非負矩陣A,NMF算法能夠尋找到一個非負矩陣U和一個非負矩陣V,使得滿足A=UV,從而將一個非負的矩陣分解為左右兩個非負矩陣的乘積。由於分解前后的矩陣中僅包含非負的元素,因此,原矩陣A中的一列向量可以解釋為對左矩陣U中所有列向量(稱為基向量)的加權和,而權重系數為右矩陣V中對應列向量中的元素。這種基於基向量組合的表示形式具有很直觀的語義解釋,它反映了人類思維中“局部構成整體”的概念。研究指出,非負矩陣分解是個NP問題,可以划為優化問題用迭代方法交替求解U和V。NMF算法提供了基於簡單迭代的求解U,V的方法,求解方法具有收斂速度快、左右非負矩陣存儲空間小的特點,它能將高維的數據矩陣降維處理,適合處理大規模數據。利用NMF進行文本、圖像大規模數據的分析方法,較傳統的處理算法速度更快、更便捷。NMF思想的提出迅速得到了很多人的重視,並有很多將這種思想應用到實際中成功解決具體實際問題的例子。

給出非負矩陣分解定義為:

找到非負矩陣U與V,使得A=UV。在計算中等式兩者很難完全相等。在計算中往往是根據某更新法則迭代更新出兩個乘子U,V,當上式左右兩端的距離(如歐式距離)滿足我們設定的大小,停止迭代。


      非負矩陣的具體算法如下:

輸入參數:X,R,MAXITER,其中X為被分解的矩陣,R為降階后B的秩,MAXITER為迭代次數

輸出參數:B,H

1):初始化矩陣B,H為非負數,同時對B的每一列數據歸一化

2):for i=1:MAXITER

    a:更新H矩陣一行元素:H(i,j)=H(i,j)*(B'*X)(i,j)/(B'*B*H)(i,j)

b:更新B的一列元素:B(k,j)=B(k,j)*(X*H')(k,j)/(B*H*H')(k,j);

                  c: 重新對B進行列歸一化

       3)end

 

      matlab源程序如下:

dim=size(X);  %計算x的規格
X=double(X);
B=10*rand(dim(1),r);  %初始化BH,為非負數
B=B./(ones(dim(1),1)*sum(B));  %歸一化B的每一列

H=10*rand(r,dim(2));

maxiter=100;  %最大迭代次數
for iter=1:maxiter
  H=H.*(B'*(X./(B*H)));
  B=B.*((X./(B*H))*H');
  B=B./(ones(dim(1),1)*sum(B));
end

 

REF:

http://blog.sina.com.cn/s/blog_468651400100cgct.html (重要)

http://blog.sina.com.cn/s/blog_86dad8bb0101ptsr.html (重要)

http://blog.csdn.net/acdreamers/article/details/44663421 (重要)

http://baike.baidu.com/link?url=YWjBXhkqjMUCLr7aLNI7z4Nl7YK4Vgd6tb5bEqzURhPN0_SrpRDtvmx8nM0vCJzA4L1SrZllWrdzkzoolJI90a (矩陣乘法)

 

 


免責聲明!

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



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