1. 程式人生 > >文本主題模型之非負矩陣分解(NMF)

文本主題模型之非負矩陣分解(NMF)

slist 做到 主題模型 直觀 推薦算法 語言 開始 2.6 如果

在文本主題模型之潛在語義索引(LSI)中,我們講到LSI主題模型使用了奇異值分解,面臨著高維度計算量太大的問題。這裏我們就介紹另一種基於矩陣分解的主題模型:非負矩陣分解(NMF),它同樣使用了矩陣分解,但是計算量和處理速度則比LSI快,它是怎麽做到的呢?

1. 非負矩陣分解(NMF)概述

    非負矩陣分解(non-negative matrix factorization,以下簡稱NMF)是一種非常常用的矩陣分解方法,它可以適用於很多領域,比如圖像特征識別,語音識別等,這裏我們會主要關註於它在文本主題模型裏的運用。

    回顧奇異值分解,它會將一個矩陣分解為三個矩陣:

A=UΣVTA=UΣVT

    如果降維到kk維,則表達式為:

Am×nUm×kΣk×kVTk×nAm×n≈Um×kΣk×kVk×nT

    但是NMF雖然也是矩陣分解,它卻使用了不同的思路,它的目標是期望將矩陣分解為兩個矩陣:

Am×nWm×kHk×nAm×n≈Wm×kHk×n

    分解成兩個矩陣是不是一定就比SVD省時呢?這裏的理論不深究,但是NMF的確比SVD快。不過如果大家讀過我寫的矩陣分解在協同過濾推薦算法中的應用,就會發現裏面的FunkSVD所用的算法思路和NMF基本是一致的,只不過FunkSVD聚焦於推薦算法而已。

    那麽如何可以找到這樣的矩陣呢?這就涉及到NMF的優化思路了。

2. NMF的優化思路

    NMF期望找到這樣的兩個矩陣W,HW,H,使WHWH的矩陣乘積得到的矩陣對應的每個位置的值和原矩陣AA對應位置的值相比誤差盡可能的小。用數學的語言表示就是:

argminW,H12i,j(Aij?(WH)ij)2argmin?W,H12∑i,j(Aij?(WH)ij)2

    如果完全用矩陣表示,則為:

argminW,H12||A?WH||2Froargmin?W,H12||A?WH||Fro2

    其中,||?||Fro||?||Fro為Frobenius範數。

    當然對於這個式子,我們也可以加上L1和L2的正則化項如下:

    

argminW,H12||A?WH||2Fro+αρ||W||1+αρ||H||1+α(1?ρ)2||W||2Fro+α(1?ρ)2||H||2Froargmin?W,H12||A?WH||Fro2+αρ||W||1+αρ||H||1+α(1?ρ)2||W||Fro2+α(1?ρ)2||H||Fro2

    其中,αα為L1&L2正則化參數,而ρρ為L1正則化占總正則化項的比例。||?||1||?||1為L1範數。

    我們要求解的有m?k+k?nm?k+k?n個參數。參數不少,常用的叠代方法有梯度下降法和擬牛頓法。不過如果我們決定加上了L1正則化的話就不能用梯度下降和擬牛頓法了。此時可以用坐標軸下降法或者最小角回歸法來求解。scikit-learn中NMF的庫目前是使用坐標軸下降法來求解的,,即在叠代時,一次固定m?k+k?n?1m?k+k?n?1個參數,僅僅最優化一個參數。這裏對優化求W,HW,H的過程就不再寫了,如果大家對坐標軸下降法不熟悉,參看之前寫的這一篇Lasso回歸算法: 坐標軸下降法與最小角回歸法小結。

3. NMF 用於文本主題模型

    回到我們本文的主題,NMF矩陣分解如何運用到我們的主題模型呢?

    此時NMF可以這樣解釋:我們輸入的有m個文本,n個詞,而AijAij對應第i個文本的第j個詞的特征值,這裏最常用的是基於預處理後的標準化TF-IDF值。k是我們假設的主題數,一般要比文本數少。NMF分解後,WikWik對應第i個文本的和第k個主題的概率相關度,而HkjHkj對應第j個詞和第k個主題的概率相關度。  

    當然也可以反過來去解釋:我們輸入的有m個詞,n個文本,而AijAij對應第i個詞的第j個文本的特征值,這裏最常用的是基於預處理後的標準化TF-IDF值。k是我們假設的主題數,一般要比文本數少。NMF分解後,WikWik對應第i個詞的和第k個主題的概率相關度,而HkjHkj對應第j個文本和第k個主題的概率相關度。

    註意到這裏我們使用的是"概率相關度",這是因為我們使用的是"非負"的矩陣分解,這樣我們的W,HW,H矩陣值的大小可以用概率值的角度去看。從而可以得到文本和主題的概率分布關系。第二種解釋用一個圖來表示如下:

技術分享圖片

    和LSI相比,我們不光得到了文本和主題的關系,還得到了直觀的概率解釋,同時分解速度也不錯。當然NMF由於是兩個矩陣,相比LSI的三矩陣,NMF不能解決詞和詞義的相關度問題。這是一個小小的代價。

4. scikit-learn NMF的使用

    在 scikit-learn中,NMF在sklearn.decomposition.NMF包中,它支持L1和L2的正則化,而W,HW,H的求解使用坐標軸下降法來實現。

    NMF需要註意的參數有:

    1) n_components:即我們的主題數k, 選擇k值需要一些對於要分析文本主題大概的先驗知識。可以多選擇幾組k的值進行NMF,然後對結果人為的進行一些驗證。

    2) init : 用於幫我們選擇W,HW,H叠代初值的算法, 默認是None,即自動選擇值,不使用選擇初值的算法。如果我們對收斂速度不滿意,才需要關註這個值,從scikit-learn提供的算法中選擇一個合適的初值選取算法。

    3)alpha: 即我們第三節中的正則化參數αα,需要調參。開始建議選擇一個比較小的值,如果發現效果不好在調參增大。

    4) l1_ratio: 即我們第三節中的正則化參數ρρ,L1正則化的比例,僅在α>0α>0時有效,需要調參。開始建議不使用,即用默認值0, 如果對L2的正則化不滿意再加上L1正則化。

    從上面可見,使用NMF的關鍵參數在於主題數的選擇n_components和正則化的兩個超參數α,ρα,ρ。

    此外,WW矩陣一般在調用fit_transform方法的返回值裏獲得,而HH矩陣則保存在NMF類的components_成員中。

    下面我們給一個例子,我們有4個詞,5個文本組成的矩陣,需要找出這些文本和隱含的兩個主題之間的關系。代碼如下:

    完整代碼參見我的github:https://github.com/ljpzzz/machinelearning/blob/master/natural-language-processing/nmf.ipynb

import numpy as np
X = np.array([[1,1,5,2,3], [0,6,2,1,1], [3, 4,0,3,1], [4, 1,5,6,3]])
from sklearn.decomposition import NMF
model = NMF(n_components=2, alpha=0.01)

    現在我們看看分解得到的W,HW,H:

W = model.fit_transform(X)
H = model.components_
print W
print H

    結果如下:

[[ 1.67371185  0.02013017]
 [ 0.40564826  2.17004352]
 [ 0.77627836  1.5179425 ]
 [ 2.66991709  0.00940262]]
[[ 1.32014421  0.40901559  2.10322743  1.99087019  1.29852389]
 [ 0.25859086  2.59911791  0.00488947  0.37089193  0.14622829]]

    從結果可以看出, 第1,3,4,5個文本和第一個隱含主題更相關,而第二個文本與第二個隱含主題更加相關。如果需要下一個結論,我們可以說,第1,3,4,5個文本屬於第一個隱含主題,而第二個問題屬於第2個隱含主題。

5. NMF的其他應用

    雖然我們是在主題模型裏介紹的NMF,但實際上NMF的適用領域很廣,除了我們上面說的圖像處理,語音處理,還包括信號處理與醫藥工程等,是一個普適的方法。在這些領域使用NMF的關鍵在於將NMF套入一個合適的模型,使得W,HW,H矩陣都可以有明確的意義。這裏給一個圖展示NMF在做語音處理時的情形:

技術分享圖片

6. NMF主題模型小結

    NMF作為一個漂亮的矩陣分解方法,它可以很好的用於主題模型,並且使主題的結果有基於概率分布的解釋性。但是NMF以及它的變種pLSA雖然可以從概率的角度解釋了主題模型,卻都只能對訓練樣本中的文本進行主題識別,而對不在樣本中的文本是無法識別其主題的。根本原因在於NMF與pLSA這類主題模型方法沒有考慮主題概率分布的先驗知識,比如文本中出現體育主題的概率肯定比哲學主題的概率要高,這點來源於我們的先驗知識,但是無法告訴NMF主題模型。而LDA主題模型則考慮到了這一問題,目前來說,絕大多數的文本主題模型都是使用LDA以及其變體。下一篇我們就來討論LDA主題模型。

轉載自 文本主題模型之非負矩陣分解(NMF) - 劉建平Pinard - 博客園 https://www.cnblogs.com/pinard/p/6812011.html

文本主題模型之非負矩陣分解(NMF)