1. 程式人生 > >SVD(singular value decomposition)應用——推薦系統中

SVD(singular value decomposition)應用——推薦系統中

val end lin inf 抽取 比例 過程 說明 from

參考自:http://www.igvita.com/2007/01/15/svd-recommendation-system-in-ruby/

看到SVD用於推薦評分矩陣的分解,主要是可以根據所需因子實現降維,最終造成的是有損的降維壓縮,此處k=2

技術分享圖片

一、對於矩陣的奇異值分解

任意一個M*N的矩陣A(M行*N列M>N),可以被寫成三個矩陣的乘積:

1. U:(M行M列的列正交矩陣)

2. S:(M*N的對角線矩陣,矩陣元素非負)

3. V:(N*N的正交矩陣的倒置)

A=U*S*V‘(註意矩陣V需要倒置)

直觀地說:

假設我們有一個矩陣,該矩陣每一列代表一個user,每一行代表一個item。

技術分享圖片

如上圖,ben,tom….代表user,season n代表item。

矩陣值代表評分(0代表未評分):

如 ben對season1評分為5,tom對season1 評分為5,tom對season2未評分。

機器學習和信息檢索:

機器學習的一個最根本也是最有趣的特性是數據壓縮概念的相關性。

如果我們能夠從數據中抽取某些有意義的感念,則我們能用更少的比特位來表述這個數據。

從信息論的角度則是數據之間存在相關性,則有可壓縮性。

SVD就是用來將一個大的矩陣以降低維數的方式進行有損地壓縮。

降維:

下面我們將用一個具體的例子展示svd的具體過程。

首先是A矩陣。

A =

     5     5     0     5
     5     0     3     4
     3     4     0     3
     0     0     5     3
     5     4     4     5
     5     4     5     5

(代表上圖的評分矩陣)

使用python調用svd函數:

from numpy import *
import numpy as np
A=array([[5,5,0,5],[5,0,3,4],[3,4,0,3],[0,0,5,3],[5,4,4,5]])
U,S,V=linalg.svd(A)
print(U[:,0:2])
print(S[0:2])
print(transpose(V[0:2,:]))

結果為

[-0.35306958 -0.36720805]
[-0.22638915 0.717629 ]
[-0.59629428 0.14214909]]
[15.03731961 6.22771342]
[[-0.58807167 -0.17873492]
[-0.43226781 -0.52344675]
[-0.31767041 0.8252125 ]
[-0.6053113 0.11437508]]

正常的奇異值分解結果為

[[-0.54053874 -0.4719281 -0.0544475 -0.5220922 -0.4577739 ]
[-0.41992954 0.32748187 0.80778125 -0.13363768 0.21458152]
[-0.35306958 -0.36720805 -0.25275349 0.00260059 0.82256247]
[-0.22638915 0.717629 -0.49794725 -0.42507526 0.07152717]
[-0.59629428 0.14214909 -0.18080134 0.72723103 -0.2503451 ]]
[15.03731961 6.22771342 3.01939334 0.98887228]
[[-0.58807167 -0.17873492 0.69696172 0.36941833]
[-0.43226781 -0.52344675 -0.66452317 0.31234116]
[-0.31767041 0.8252125 -0.26150878 0.38694056]
[-0.6053113 0.11437508 -0.06531823 -0.78501599]]

分解矩陣之後我們首先需要明白S的意義。

可以看到S很特別,是個對角線矩陣。

每個元素非負,而且依次減小,具體要講明白元素值的意思大概和線性代數的特征向量,特征值有關。

但是可以大致理解如下:

在線性空間裏,每個向量代表一個方向。

所以特征值是代表該矩陣向著該特征值對應的特征向量的方向的變化權重。

所以可以取S對角線上前k個元素。

當k=2時候即將S(6*4)降維成S(2*2)

同時U(6*6),Vtranspose(4*4)相應地變為 U(6*2),Vtranspose(4*2).

最後根據降維結果在相乘,得到矩陣與原矩陣有差別。這就是之前說的降維可以看成一種數據的有損壓縮。

接下來我們開始分析該矩陣中數據的相關性。

我們將u的第一列當成x值,第二列當成y值。即u的每一行用一個二維向量表示,同理v的每一行也用一個二維向量表示。

如下圖:

技術分享圖片

從圖中可以看出:

Season5,Season6特別靠近。Ben和Fred也特別靠近。

同時我們仔細看一下A矩陣可以發現,A矩陣的第5行向量和第6行向量特別相似,Ben所在的列向量和Fred所在的列向量也特別相似。

所以從直觀上我們發現U矩陣和V矩陣可以近似來代表A矩陣,換據話說就是將A矩陣壓縮成U矩陣和V矩陣,至於壓縮比例得看當時對S矩陣取前k個數的k值是多少。

到這裏,我們已經完成了一半。

尋找相似用戶:

依然用實例來說明:

我們假設,現在有個名字叫Bob的新用戶,並且已知這個用戶對season n的評分向量為:[5 5 0 0 0 5]。(此向量為列向量)

我們的任務是要對他做出個性化的推薦。

我們的思路首先是利用新用戶的評分向量找出該用戶的相似用戶。

技術分享圖片

如上圖(圖中第二行式子有錯誤,Bob的轉置應為行向量)。

對圖中公式不做證明,只需要知道結論,結論是得到一個Bob的二維向量,即知道Bob的坐標。

將Bob坐標添加進原來的圖中:

技術分享圖片

然後從圖中找出和Bob最相似的用戶。

註意,最相似並不是距離最近的用戶,這裏的相似用余弦相似度計算。(關於相似度還有很多種計算方法,各有優缺點)

即夾角與Bob最小的用戶坐標。

可以計算出最相似的用戶是ben。

接下來的推薦策略就完全取決於個人選擇了。

這裏介紹一個非常簡單的推薦策略:

找出最相似的用戶,即ben。

觀察ben的評分向量為:【5 5 3 0 5 5】。

對比Bob的評分向量:【5 5 0 0 0 5】。

然後找出ben評分過而Bob未評分的item並排序,即【season 5:5,season 3:3】。

即推薦給Bob的item依次為 season5 和 season3。

最後還有一些關於整個推薦思路的可改進的地方:

1.svd本身就是時間復雜度高的計算過程,如果數據量大的情況恐怕時間消耗無法忍受。 不過可以使用梯度下降等機器學習的相關方法來進行近似計算,以減少時間消耗。

2.相似度計算方法的選擇,有多種相似度計算方法,每種都有對應優缺點,對針對不同場景使用最適合的相似度計算方法。

3.推薦策略:首先是相似用戶可以多個,每個由相似度作為權重來共同影響推薦的item的評分。

SVD(singular value decomposition)應用——推薦系統中