非負矩陣分解,顧名思義就是,將非負的大矩陣分解成兩個非負的小矩陣。
回顧矩陣分解本身,在
公式(1)中的v是乙個n*m維的矩陣,其中每一列就是
那麼非負和其它的有什麼不同呢?下面我就盜一張圖來直觀地展示幾種矩陣分解方法的效果差異。(出自lee and seung (1999))
圖中就對比了三種方法的區別。
vq的約束是要求h的每一列只有乙個元素為1,其它為0,因此相當於將m個資料歸納成了k個代表,原資料對映過去就是取k個基當中與原向量距離最小的來重新表示。所以vq的基都是一張張完整正常的臉,它們都是最具代表性的臉。
pca大家用得比較多,就是求一組標準正交基,第乙個基的方向取原資料方差最大的方向,然後第二個基在與第乙個基正交的所有方向裡再取方差最大的,這樣在跟前面的基都正交的方向上一直取到k個基。所以pca的基沒有直觀的物理意義,而且w和h裡面的元素都是可正可負的,這就意味著還原時是用w的基加加減減得到的。
nmf因為約束了非負,所以只准把基相加,不能相減,這就意味著基與基是通過拼接組合來還原原象的。所以我們可以看到nmf的每個基實際上在表示著臉部的某個部件,這種性質在許多場景上就有了它特有的用處了。
我們換個角度來想像一下這三種情景。
vq其實就像kmeans,它的基都落在原資料的最具代表性的位置上。
pca的基則是指向四向八方的,相互正交著。
nmf的原資料首先就是只分布在非負子空間裡面的,然後它的基則在這個非負子空間靠近邊緣的區域,像一組長短不
一、間隔不一的傘骨。
這是個有界優化問題
所以最直觀的最簡單的方法就是
方法一:
我們看標準的有界優化問題
但是,作為有追求有理想的同學們,lee and seung (1999)
認為方法一不夠好,要來點更快的。
方法二:
這個又叫乘法更新法,因為人家用了乘法......
推導起來有點麻煩,但寫起**來也是相當簡單,幾行**足矣,而且收斂比方法一快一些。
但是,作為有追求有理想的同學們,林智仁(沒錯,就是搞libsvm那個林智仁)c lin(2007)
搖搖頭,「看我的」。
方法三:
傳說中這個方法是快了一些,然而我覺得有方法一和二就妥妥了,像現在這麼強計算力的時代,計算省下來那點時間,還抵不回寫這複雜**多花的時間。
林智仁這篇文章c lin(2007)
是後期出來的,review了之前幾種主流的方法,再提出自己的新方法,所以這篇的內容比較全(懶人只看這一篇就夠了)。
python 非負矩陣分解 NMF
非負矩陣分解是矩陣中所有元素均為非負數約束條件下的矩陣分解,其基本思想 給定乙個非負矩陣v,nmf能夠找到乙個非負矩陣w和乙個非負矩陣h,使得矩陣w和矩陣h的乘積近似等於矩陣v中的值。h矩陣 係數矩陣 nmf廣泛應用於影象分析,文字挖掘和語音處理鄰域。nmf矩陣分解優化目標 最小化w矩陣h矩陣的乘積...
降維方法 非負矩陣分解 NMF
非負矩陣分解 non negative matrix factorization 作為一種非監督式的降維方法,其主要思想正如其名字描述的那樣 將乙個非負原始矩陣分解為兩個非負矩陣的積 vm n w m r v r n vm n wm r v r n 矩陣v v 為原始資料矩陣,包含 n role p...
NMF演算法 非負矩陣分解演算法 python實現
nmf演算法 非負矩陣分解演算法。目標 將乙個大矩陣分解成兩個稍小的矩陣 利用矩陣的乘法 要求 待分解矩陣不能有負值。因為負值對於資料是無效的。假定有乙個元資料矩陣v,目標是將其分解成兩個非負矩陣w和h相乘的形式。v w h 這邊需要注意一些維度也就是角標,我就會直接寫了 其中,w稱為權重係數矩陣,...