讀古今文學網 > 機器學習實戰 > 14.1 SVD的應用 >

14.1 SVD的應用

奇異值分解

優點:簡化數據,去除噪聲,提高算法的結果。 缺點:數據的轉換可能難以理解。 適用數據類型:數值型數據。

利用SVD實現,我們能夠用小得多的數據集來表示原始數據集。這樣做,實際上是去除了噪聲和冗余信息。當我們試圖節省空間時,去除噪聲和冗余信息就是很崇高的目標了,但是在這裡我們則是從數據中抽取信息。基於這個視角,我們就可以把SVD看成是從有噪聲的數據中抽取相關特徵。如果這一點聽來奇怪,也不必擔心,我們後面會給出若干SVD應用的場景和方法,解釋它的威力。

首先,我們會介紹SVD是如何通過隱性語義索引應用於搜索和信息檢索領域的。然後,我們再介紹SVD在推薦系統中的應用。

14.1.1 隱性語義索引

SVD的歷史已經超過上百個年頭,但是最近幾十年隨著計算機的使用,我們發現了其更多的使用價值。最早的SVD應用之一就是信息檢索。我們稱利用SVD的方法為隱性語義索引(Latent Semantic Indexing,LSI)或隱性語義分析(Latent Semantic Analysis,LSA)。

在LSI中,一個矩陣是由文檔和詞語組成的。當我們在該矩陣上應用SVD時,就會構建出多個奇異值。這些奇異值代表了文檔中的概念或主題,這一特點可以用於更高效的文檔搜索。在詞語拼寫錯誤時,只基於詞語存在與否的簡單搜索方法會遇到問題。簡單搜索的另一個問題就是同義詞的使用。這就是說,當我們查找一個詞時,其同義詞所在的文檔可能並不會匹配上。如果我們從上千篇相似的文檔中抽取出概念,那麼同義詞就會映射為同一概念。

14.1.2 推薦系統

SVD的另一個應用就是推薦系統。簡單版本的推薦系統能夠計算項或者人之間的相似度。更先進的方法則先利用SVD從數據中構建一個主題空間,然後再在該空間下計算其相似度。考慮圖14-1中給出的矩陣,它是由餐館的菜和品菜師對這些菜的意見構成的。品菜師可以採用1到5之間的任意一個整數來對菜評級。如果品菜師沒有嘗過某道菜,則評級為0。

圖14-1 餐館的菜及其評級的數據。對此矩陣進行SVD處理則可以將數據壓縮到若干概念中去。在右邊的矩陣當中,標出了一個概念。

我們對上述矩陣進行SVD處理,會得到兩個奇異值(讀者如果不信可以自己試試)。因此,就會彷彿有兩個概念或主題與此數據集相關聯。我們看看能否通過觀察圖中的0來找到這個矩陣的具體概念。觀察一下右圖的陰影部分,看起來Ed、Peter和Tracy對「烤牛肉」和「手撕豬肉」進行了評級,同時這三人未對其他菜評級。烤牛肉和手撕豬肉都是美式燒烤餐館才有的菜,其他菜則在日式餐館才有。

我們可以把奇異值想像成一個新空間。與圖14-1中的矩陣給出的五維或者七維不同,我們最終的矩陣只有二維。那麼這二維分別是什麼呢?它們能告訴我們數據的什麼信息?這二維分別對應圖中給出的兩個組,右圖中已經標示出了其中的一個組。我們可以基於每個組的共同特徵來命名這二維,比如我們得到的美式BBQ和日式食品這二維。

如何才能將原始數據變換到上述新空間中呢?下一節我們將會進一步詳細地介紹SVD,屆時將會瞭解到SVD是如何得到UVT兩個矩陣的。VT矩陣會將用戶映射到BBQ/日式食品空間去。類似地,U矩陣會將餐館的菜映射到BBQ/日式食品空間去。真實的數據通常不會像圖14-1中的矩陣那樣稠密或整齊,這裡如此只是為了便於說明問題。

推薦引擎中可能會有噪聲數據,比如某個人對某些菜的評級就可能存在噪聲,並且推薦系統也可以將數據抽取為這些基本主題。基於這些主題,推薦系統就能取得比原始數據更好的推薦效果。在2006年末,電影公司Netflix曾經舉辦了一個獎金為100萬美元的大賽,這筆獎金會頒給比當時最好系統還要好10%的推薦系統的參賽者。最後的獲獎者就使用了SVD1。

下一節將介紹SVD的一些背景材料,接著給出利用Python的NumPy實現SVD的過程。然後,我們將進一步深入討論推薦引擎。當對推薦引擎有相當的瞭解之後,我們就會利用SVD構建一個推薦系統。

SVD是矩陣分解的一種類型,而矩陣分解是將數據矩陣分解為多個獨立部分的過程。接下來我們首先介紹矩陣分解。

1. Yehuda Koren, 「The BellKor Solution to the Netflix Grand Prize,」 August 2009; http://www.netflixprize.com/assets/GrandPrize2009_BPC_BellKor.pdf.