基于物品的协同过滤算法

核心思想 给用户推荐那些和他们之前喜欢的物品相似的物品。
不同于基于内容的推荐,基于物品的协同过滤中的相似主要是利用用户行为的集体智慧。
相似度的计算

计算相似度的实现方式是多种多样的
  • 基于共同喜欢物品的用户列表计算:
    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? 是喜欢物品i的用户数,N j N_j Nj? 是喜欢物品j的用户数,分子中∣ N i ? N j ∣ |N_i \bigcap N_j| ∣Ni??Nj?∣ 是同时喜欢物品ij的用户数。当同时喜欢两个物品的人数越多,说明两个物品的相似度越高,或者说是相关性越高。分母中,使用了喜欢该物品的总人数作为惩罚,来减小物品因过度热门造成的误差影响。
  • 基于余弦相似度计算
对物品的喜爱程度并不能单纯的使用二值属性来评价,很多数据集包含了用户对物品的详细评分数据,将评分数据进一步引入到相似度计算中,公式如下:
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=1len?nki2?×∑k=1len?nkj2? ? ?∑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?∑?wji?scoreui?
其中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

    推荐阅读