核心思想
給使用者推薦那些和他們之前喜歡的物品相似的物品。
不同于基于内容的推薦,基于物品的協同過濾中的相似主要是利用使用者行為的集體智慧。
相似度的計算
計算相似度的實作方式是多種多樣的
-
基于共同喜歡物品的使用者清單計算:
w i j = ∣ N i ⋂ N j ∣ ∣ N i ∣ ∗ ∣ N j ∣ w_{ij} = \frac{|N_i \bigcap N_j|}{\sqrt{|N_i| * |N_j|}} wij=∣Ni∣∗∣Nj∣
∣Ni⋂Nj∣
分母中 N i N_i Ni 是喜歡物品
的使用者數, N j N_j Nj 是喜歡物品i
的使用者數,分子中 ∣ N i ⋂ N j ∣ |N_i \bigcap N_j| ∣Ni⋂Nj∣ 是同時喜歡物品j
和i
的使用者數。當同時喜歡兩個物品的人數越多,說明兩個物品的相似度越高,或者說是相關性越高。分母中,使用了喜歡該物品的總人數作為懲罰,來減小物品因過度熱門造成的誤差影響。j
- 基于餘弦相似度計算
對物品的喜愛程度并不能單純的使用二值屬性來評價,很多資料集包含了使用者對物品的詳細評分資料,将評分資料進一步引入到相似度計算中,公式如下:
w i j = N i ⋅ N j ∣ N i ∣ ∗ ∣ N j ∣ = ∑ k = 1 l e n ( n k i × n k j ) ∑ k = 1 l e n n k i 2 × ∑ k = 1 l e n n k j 2 w_{ij} = \frac{N_i \cdot N_j}{|N_i| * |N_j|} = \frac{\sum_{k=1}^{len} (n_{ki} \times n_{kj}) }{\sqrt{\sum_{k=1}^{len}n_{ki}^2 \times \sqrt{\sum_{k=1}^{len} n_{kj}^2 }}} wij=∣Ni∣∗∣Nj∣Ni⋅Nj=∑k=1lennki2×∑k=1lennkj2
∑k=1len(nki×nkj)
- 熱門物品的懲罰問題
當物品
i
被更多的使用者喜歡時,分子中的 N ( i ) ⋂ N ( j ) N(i) \bigcap N(j) N(i)⋂N(j) 和分母中的
N(i)
都會增長。對于熱門物品,分子 N ( i ) ⋂ N ( j ) N(i) \bigcap N(j) N(i)⋂N(j) 的增長速度普遍會高于分母中
N(i)
的增長速度,就容易使得物品
i
和很多物品的相似度都偏高,出現 ItemCF 中的物品熱門問題。
為解決該問題,對于熱門物品
i
進行懲罰,如下:
w i j = ∣ N i ⋂ N j ∣ ∣ N i ∣ α ∗ ∣ N j ∣ 1 − α w_{ij} = \frac{|N_i \bigcap N_j|}{|N_i|^\alpha * |N_j|^{1-\alpha}} wij=∣Ni∣α∗∣Nj∣1−α∣Ni⋂Nj∣
其中當 α ∈ ( 0 , 0.5 ) \alpha \in (0, 0.5) α∈(0,0.5) 時,
N(i)
越小,懲罰越厲害,進而使得熱門物品相關性分數下降。
計算預測評分
使用如下公式進行評分的預測:
p u i = ∑ N u ⋂ S j , k w j i s c o r e u i p_{ui} = \sum_{N_u \bigcap S_{j,k}} w_{ji} score_{ui} pui=Nu⋂Sj,k∑wjiscoreui
其中 S j k S_{jk} Sjk 是物品
j
相似物品的集合,一般取相似分數最高的
k
個物品。 s c o r e u i score_{ui} scoreui 是使用者
u
對物品
i
的評分,如果沒有評分資料,則取1。通過使用該方法計算得到使用者物品的評分預測,可取其中Top-N個,作為推薦候選。
基于使用者的協同過濾的原理和基于物品的協同過濾的原理是類似的。
代碼執行個體:
https://github.com/zhangdianlei/recommendation/blob/master/ItemSimilarity.py
https://github.com/zhangdianlei/recommendation/blob/master/ItemSimilarity_cos.py
https://github.com/zhangdianlei/recommendation/blob/master/ItemSimilarity_alpha.py
https://github.com/zhangdianlei/recommendation/blob/master/ItemSimilarity_recommend.py