核心思想
给用户推荐那些和他们之前喜欢的物品相似的物品。
不同于基于内容的推荐,基于物品的协同过滤中的相似主要是利用用户行为的集体智慧。
相似度的计算
计算相似度的实现方式是多种多样的
-
基于共同喜欢物品的用户列表计算:
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∣ 是同时喜欢物品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