推薦系統矩陣分解-基於SVD協同過濾的推薦

奇異值分解(Singular value decomposition)是一種矩陣分解技術,也是一種提取信息的方法。將一個比較複雜的矩陣用更小更簡單的3個子矩陣的相乘來表示,這3個小矩陣描述了大矩陣重要的特性,可以起到降維簡化數據,去除數據噪聲的作用。通常,我們熟知的應用是將 SVD 應用到 PCA 降維中。
關於SVD,請見奇異值分解SVD,裏面還有鏈接-PCA和SVD的區別和聯繫。

  • SVD在推薦系統中到底在什麼位置呢?
    推薦系統 -> 協同過濾算法 -> 隱語義模型 -> 矩陣分解 -> SVD

SVD就是用來將一個大的矩陣以降低維數的方式進行有損地壓縮。假設我們有一個矩陣,該矩陣每一列代表一個user,每一行代表一個item。

矩陣值代表評分(0代表未評分),user5暫不計入該矩陣,將上述矩陣命名爲 AA

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

,則將矩陣 AA 作SVD,有:

[U,S,Vtranspose]=svd(A)

U =
   -0.4472   -0.5373   -0.0064   -0.5037   -0.3857   -0.3298
   -0.3586    0.2461    0.8622   -0.1458    0.0780    0.2002
   -0.2925   -0.4033   -0.2275   -0.1038    0.4360    0.7065
   -0.2078    0.6700   -0.3951   -0.5888    0.0260    0.0667
   -0.5099    0.0597   -0.1097    0.2869    0.5946   -0.5371
   -0.5316    0.1887   -0.1914    0.5341   -0.5485    0.2429
   
S =
   17.7139         0         0         0
         0    6.3917         0         0
         0         0    3.0980         0
         0         0         0    1.3290
         0         0         0         0
         0         0         0         0
         
Vtranspose =
   -0.5710   -0.2228    0.6749    0.4109
   -0.4275   -0.5172   -0.6929    0.2637
   -0.3846    0.8246   -0.2532    0.3286
   -0.5859    0.0532    0.0140   -0.8085

其中,SS 很特殊,是個對角線矩陣,每個元素非負,而且依次減小,表示奇異值(可以理解爲EVD中的特徵值,後直接稱爲特徵值)。可以大致理解爲:在線性空間裏,每個向量代表一個方向,所以特徵值是代表該矩陣向着該特徵值對應的特徵向量的方向的變化權重。

SS 對角線上前 kk 個元素。當 k=2k=2 時候即將 S(6×4)S(6 \times 4) 降維成 S(2×2)S(2 \times 2),同時 U(6×6),Vtranspose(4×4)U(6\times 6),Vtranspose(4\times 4) 相應地變爲 U(6×2),Vtranspose(4×2)U(6\times 2),Vtranspose(4\times 2). 可得到如下圖:

其中,UU 可以看作是 item 的某種潛在因子(隱向量表示),V看作 user 的某種潛在因子(隱向量表示),此時我們用降維後的 U,S,VU,S,V 來相乘得到 A2A2,有:

A2=U(1:6,1:2)*S(1:2,1:2)*(V(1:4,1:2))'
A2 =

    5.2885    5.1627    0.2149    4.4591
    3.2768    1.9021    3.7400    3.8058
    3.5324    3.5479   -0.1332    2.8984
    1.1475   -0.6417    4.9472    2.3846
    5.0727    3.6640    3.7887    5.3130
    5.1086    3.4019    4.6166    5.5822

可以看出,A2A2AA 很接近,所以,基於SVD的降維(PCA)還可以看作是數據的有損壓縮。

UU 的第一列當成 xx 值,第二列當成 yy 值,user1-4 對應 Ben | Tom | John | Fred,即 UU 的每一行用一個二維向量表示,同理 VV 的每一行也用一個二維向量表示,item1-6 對應Season 1 Season 2 Season 3 Season 4 Season 5 Season 6,有:

從圖中可以看出,Season5,Season6特別靠近。Ben 和 Fred 也特別靠近。同時我們仔細看一下 AA ,可以發現,AA 的第 5 行向量和第 6 行向量特別相似,Ben 所在的列向量和 Fred 所在的列向量也特別相似。

假設,現在有個名字叫Bob的新用戶(其實,在現在的推薦系統中,會把這個用戶放到矩陣 AA 中參與計算,那樣可以直接補全評分矩陣,從而直接進行推薦),並且已知這個用戶對season n的評分向量爲:[5,5,0,0,0,5]T[5,5,0,0,0,5]^T。(此向量爲列向量)。現在任務是要對他做出個性化的推薦,首先是利用新用戶的評分向量找出該用戶的相似用戶。
Bob2D=BobT×U2×Sk1Bob_{2D}= Bob^T\times U_2\times S_k^{-1}
其中,BobT=[5,5,0,0,0,5]Bob^T=[5,5,0,0,0,5],上式:

Bob_{2D}=
[5,5,0,0,0,5]   
X
 [[-0.4472   -0.5373]   
 [-0.3586    0.2461]   
 [-0.2925   -0.4033]   
 [-0.2078    0.6700]   
 [-0.5099    0.0597]  
 [-0.5316    0.1887]]   
X 
[[17.7139         0]    
       [0    6.3917]]


=[0.3775 0.0802]

得到一個Bob的二維向量(隱向量表示),即知道Bob的座標。將Bob座標添加進原來的圖中:

從圖中用餘弦相似度計算找出和Bob最相似的用戶(基於user的協同過濾推薦,爲什麼要進行SVD呢?哈哈哈,這個例子不太好,但可以順便回顧一下基於user的協同過濾推薦),計算出最相似的用戶是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。

總結

  • SVD本身就是時間複雜度高的計算過程,如果數據量大的情況恐怕時間消耗無法忍受。 不過可以使用梯度下降等機器學習的相關方法來進行近似計算,以減少時間消耗。 paper [A Guide to Singular Value Decomposition for Collaborative Filtering] 中總結了幾種SVD的方法,它們都是用梯度下降來進行求解的。
  • 相似度計算方法的選擇,有多種相似度計算方法,每種都有對應優缺點,對針對不同場景使用最適合的相似度計算方法。在推薦系統中,最常用的相似度計算方法是餘弦相似度。
  • 推薦策略:首先是相似用戶可以多個,每個由相似度作爲權重來共同影響推薦的 item 的評分。

推薦閱讀:
從SVD到推薦系統
SVD在推薦系統中的應用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章