基于物品的协同过滤算法

核心思想

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

相似度的计算

计算相似度的实现方式是多种多样的

  • 基于共同喜欢物品的用户列表计算:
    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=NiNj NiNj
    分母中 N i N_i Ni 是喜欢物品i的用户数, N j N_j Nj 是喜欢物品j的用户数,分子中 ∣ N i ⋂ N j ∣ |N_i \bigcap N_j| NiNj 是同时喜欢物品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=NiNjNiNj=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αNj1αNiNj
其中当 α ∈ ( 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=NuSj,kwjiscoreui
其中 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

你可能感兴趣的:(推荐系统)