關於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中的一列向量可以解釋爲對左矩陣U中所有列向量(稱爲基向量)的加權和,而權重係數爲右矩陣V中對應列向量中的元素。這種基於基向量組合的表示形式具有很直觀的語義解釋,它反映了人類思維中“局部構成整體”的概念。研究指出,非負矩陣分解是個NP問題,可以劃爲優化問題用迭代方法交替求解U和V。NMF算法提供了基於簡單迭代的求解U,V的方法,求解方法具有收斂速度快、左右非負矩陣存儲空間小的特點,它能將高維的數據矩陣降維處理,適合處理大規模數據。利用NMF進行文本、圖像大規模數據的分析方法,較傳統的處理算法速度更快、更便捷。NMF思想的提出迅速得到了很多人的重視,並有很多將這種思想應用到實際中成功解決具體實際問題的例子。

       非負矩陣的具體算法如下:
  輸入參數: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

 

處理前圖片

處理後圖片

參考文獻:

基於非負矩陣分解的人臉表情識別研究

非負矩陣分解:數學的奇妙力量

下一步嘗試採用NMF提取特徵。

 

文章來自於:http://fxy1211.blog.163.com/blog/static/68255322007826111015905/


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章