Abby Yeh
Abby Yeh
Apr 1 · 9 min read

SVD++ and hybrid recommender system

Photo by Denise Jans on Unsplash

在上一篇 SVD 實作推薦系統 中介紹了可以利用使用者對商品的評分找出代表使用者和商品的向量來推薦使用者商品的模型。然而除了商品的評分,有很多其他資訊也可幫我們推薦使用者更適合的商品。SVD++ 就是一個跟之前 Funk SVD 很相近的混合推薦系統 ( hybrid recommender system )。

當使用者對一個物品評分的時候,除了分數之外其實還提供了另一個也相當重要的資訊:使用者觀看或使用了這個商品。以影音串流服務為例,使用者能觀看電影的時間有限,可能只有下班的幾個小時和假日。所以大部分的使用者不會隨便點開一部電影來看,他可能會挑介紹或預覽圖吸引他的電影,也可能是挑喜歡的類別的電影。所以即使使用者給了這部電影很低的分數,他也可能喜歡相似的電影。

— 基本概念 —

SVD++和 Funk SVD 的基本概念都是利用迭代的方式找出 SVD 的近似。

而 SVD++ 和 FunkSVD有什麼不同呢?

首先,SVD++ 將 bias 分為 bu 和 bi,分別表示使用者 u 和物品 i 偏離平均的分數。例如,使用者 u 是影評家,他可能會嚴格的評分,每部電影都給了比平均更低一顆星。電影 i 是經典電影,使用者給低分可能會被覺得沒有鑒賞力,而都給比平均高一顆星的分數。所以喜好程度分別加上個別使用者和個別物品的 bias 才會是真正的分數。

另外,SVD++ 還加入了鄰接族群模式( Neighborhood models )。和過去的CF ( collaborative Filtering ) 演算法使用使用者導向的不同,SVD++ 使用的是物品導向的鄰接族群模式。使用者導向是用已記錄的評分來預測未知的評分,而物品導向則是用同一個使用者對相似的物品的評分來預測的。物品導向不但更好的擴充性和準確度,也可能夠更好的解釋預測分數背後的理由,因為使用者很熟悉自己喜好的物品。

這個公式可以理解為當物品 i 和 j 很相似的時候 (S_ij 趨近 1),使用者 u 對物品 i 的喜好程度 (r_ui 減 b_ui) 應該和使用者 u 對物品 j 的喜好程度相近 。所以當 S_ij 接近 1 的時候 r_ui_hat 會幾乎加上使用者對物品 j 的喜好程度,而當 S_ij 趨近為 0,則是加上幾乎是 0 的值,這樣在取平均(除以 total 的 S)之後對物品 i 的喜好程度就會跟對相似的物品們的喜好程度很像。

但是完全依靠評分過相似的商品來預測評分會產生一個問題,如果使用者 u 根本沒有評過相似的商品怎麼辦?所以計算 S^k 的內差權重( interpolation weights )求出沒有評分過的 item 和要預測的 item 計算相似度。詳細的解法可以看這篇論文

內差權重:原本只有 k 個評過的商品有相似度(如左圖),利用所有評分(包含其他使用者的評分)和內插法就可以推得使用者為評分商品與預測的商品的相似度。

第三,SVD++ 使用了評分的隱含的反饋 — 使用者評分過哪些商品。除了本來評分的矩陣 R ,SVD++ 還加入另一個矩陣 N 來代表使用者未評過哪些商品。

— SVD++ 演算法與實作 —

(想跳複雜的公式,直接看 SVD++ 實際上該怎麼使用可以按這邊)

完整的預測評分的式子是,演算法跟 Funk SVD 一樣是最小化SSE:

藍色的部分為改進過的 latent factor model,在論文中被命名為 Asymmetric SVD 。用評價過與為評價過的商品特徵總合來代表試用者。這樣不僅可以很容易地在使用者評分過商品後加入系統,同時也可以更好的解釋推薦的原因和便利的整合隱藏的反饋(基本概念的第三點)。

x 和 y 都是所有商品對特徵的相似程度矩陣 (n * f),Asymmetric SVD 把使用者特徵用所有評分過的商品的特徵總和和所有為評分過的商品特徵總和取代,可以想成使用者 u 等於他都看有哪些特徵的影片和不看有哪些特徵的片。而 Sigma 前面的係數是作者實驗過後找出來較好的正規化的係數,讓 Pi 不會受到看過和沒看過的影片數量影響。

SVD 求出來的使用者矩陣 U,其實很像使用者都看有哪些特徵的影片,所以直接使用 SVD 求出的使用者矩陣 P 代替。

其更新為:

qi += lr * (eui * (pu + np.sqrt(N(u)).sum() * y.sum() - rr qi))
pu += lr * (eui * qi - rr * pu)
for j in N(u):
y += lr * (eui * np.sqrt(N(u)).sum() * qi - rr * yi )

橘色的的部分合起來為 neighborhood model ,對評價過的商品,往上調整使用者實際評分 ( 扣除bias ) 乘上相似度,相似的商品相似度 S 會接近1,反之則為接近0 。又為了方便全域的最佳化,把跟使用者評分過的與要預測商品最相近 k 個商品相似度 S 改成用所有評分來更新所有物品的相似權重 W,取代內積權重。

for j in R(u):
# lr: learning rate, rr: regularization rate
wij += lr * (np.sqrt(R(u)).sum() * eui * (rui - bui) - rr * wij)

另外,為了多考慮使用者有沒有評分,加了c[i][j] 對於使用者沒有評分過相似的商品給予懲罰。例如使用者沒有看過評分過魔戒 1、2,使用者可能也不會喜歡魔戒 3。其更新如下:

for j in N(u):
cij += lr * (np.sqrt(N(u)).sum() * eui - rr * cij)

備註: N(u): 為使用者沒有評分過的電影。

— 實際使用—

實際使用的時候,去實作一個SVD++很沒有效率。這時候就可以使用現成的 package 。Surprice 是 Python scikit (e.g. scikit-learn)中專門為推薦系統實作的套件,利用這個套件就可以很輕鬆的使用 SVD++了 。

首先,用 pip 安裝 `scikit-surprise`

$ pip install scikit-surprise

接著就可以用 Surprise 了:

from surprise import SVDpp
from surprise import Dataset
from surprise import accuracy
from surprise.model_selection import train_test_split
# 載入 movielens-100k 的資料.
data = Dataset.load_builtin('ml-100k')
# 將資料分為 training set 和 validation set
train_set, val_set = train_test_split(data, test_size=.3)
# 使用 SVD++ 演算法.
algo = SVDpp()

# 訓練模型並驗證結果
algo.fit(train_set)
predictions = algo.test(val_set)

結果

備註:

  1. 參數可以參考這邊
  2. 這個套件裡的演算法跟原論文比是簡化過的版本,少了neighborhood model

— 總結 —

Funk SVD 只有用評分分數來預測使用者的評分,然而現在的推薦系統亦會運用隱含的使用者和商品的互動來預測分數。 SVD++ 也加入了這樣的互動,並結合 neighborhood model 以得到更好的預測分數。然而,實作一個推薦系統還有很多可以考慮的資料,像是電影裡的演員、導演或是電影受歡迎的程度。甚至再不同情況下使用不同的演算法,例如對一個新的使用者就可以使用物品的受歡迎程度來做推薦,在商品的頁面使用 neighborhood model 推薦相似商品等等。所以要做出一個實際可以用的推薦系統還有很多可以考慮的地方,不是直接使用 Matrix Factorization based 的演算法就結束了。

— 完整程式

Github: https://github.com/leafinity/gradient_dscent_svd/blob/master/svdpp.ipynb

這個Github程式的推薦結果,其實跟上一篇非常相似。

— 參考資料 —

[1] Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model

[2] Interpolation (Sci.py)

[3] Surprise Matrix Factorization-based algorithms

Taiwan AI Academy

news, tech reviews and supplemental materials

Thanks to Evans Tsai

Abby Yeh

Written by

Abby Yeh

Teaching assistants in Taiwan AI Academy, sharing what I learn when I assist students.

Taiwan AI Academy

news, tech reviews and supplemental materials

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade