著名的科學雜誌《Nature》於1999年刊登了兩位科學家D.D.Lee和H.S.Seung對數學中非負矩陣研究的突出成果。該文提出了一種新的矩陣分解思想――非負矩陣分解(Non-negative Matrix Factorization,NMF)算法,即NMF是在矩陣中全部元素均爲非負數約束條件之下的矩陣分解方法。該論文的發表迅速引發了各個領域中的科學研究人員的重視:一方面,科學研究中的不少大規模數據的分析方法須要經過矩陣形式進行有效處理,而NMF思想則爲人類處理大規模數據提供了一種新的途徑;另外一方面,NMF分解算法相較於傳統的一些算法而言,具備實現上的簡便性、分解形式和分解結果上的可解釋性,以及佔用存儲空間少等諸多優勢。
信息時代使得人類面臨分析或處理各類大規模數據信息的要求,如衛星傳回的大量圖像、機器人接受到的實時視頻流、數據庫中的大規模文本、Web上的海量信息等。處理這類信息時,矩陣是人們最經常使用的數學表達方式,好比一幅圖像就剛好與一個矩陣對應,矩陣中的每一個位置存放着圖像中一個像素的空間位置和色彩信息。因爲實際問題中這樣的矩陣很龐大,其中存放的信息分佈每每不均勻,所以直接處理這樣的矩陣效率低下,這對不少實際問題而言就失去了實用意義。爲高效處理這些經過矩陣存放的數據,一個關鍵的必要步驟即是對矩陣進行分解操做。經過矩陣分解,一方面將描述問題的矩陣的維數進行削減,另外一方面也能夠對大量的數據進行壓縮和歸納。html
在科學文獻中,討論利用矩陣分解來解決實際問題的分析方法不少,如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思想的提出迅速獲得了不少人的重視,並有不少將這種思想應用到實際中成功解決具體實際問題的例子。
算法
這裏是分解的公式:數據庫
這裏r是分解矩陣的秩,V是原矩陣的一個近似,W與H就是分解而成的兩個矩陣。優化
下面是W和H的求法,是一個迭代算法,初始的W與H是隨機的就好了:spa
非負矩陣的具體算法以下:3d
輸入參數: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
下面是代碼:code
clear all; close all; clc; V=double(imread('lena.jpg')); imshow(mat2gray(V)); [i u]=size(V); %計算V的規格 r=100; %設置分解矩陣的秩 W=rand(i,r); %初始化WH,爲非負數 H=rand(r,u); maviter=100; %最大迭代次數 for iter=1:maviter W=W.*((V./(W*H))*H'); %注意這裏的三個公式和文中的是對應的 W=W./(ones(i,1)*sum(W)); H=H.*(W'*(V./(W*H))); end img_V=W*H; figure; imshow(mat2gray(img_V));
下面是原圖和重構後的效果,若是秩和迭代次數越大,那麼重構後的圖越接近原圖:視頻
原圖htm
重構圖blog
這個算法是Lee和Seung在1999年發表在nature雜誌上的。具體論文看這裏:http://www.cs.rutgers.edu/~mlittman/topics/dimred02/seung-nonneg-matrix.pdf
看不懂英文不要緊,能夠看這個中文的介紹:http://wenku.baidu.com/view/94c8af0bf78a6529647d5331.html。
文章結合自:http://fxy1211.blog.163.com/blog/static/68255322007826111015905/ 和 http://www.cnblogs.com/tiandsp/archive/2012/11/13/2768597.html