一、协同过滤算法简介
所谓协同过滤算法,其基本思想就是根据用户之前的喜好及其他兴趣相近的用户的选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向, 并预测用户可能喜好的产品进行推荐)。
目前应用广泛的协同过滤算法是基于邻域的方法,而这种方法主要有下面两种算法:
二、基于用户的协同过滤
基于用户的协同过滤算法主要包括两个步骤:
一个例子:
对用户推荐商品的过程可以形象化未一个猜测用户对商品打分的任务。上图就是5个用户对5个商品的打分情况,可以理解未用户对商品的喜欢程度(可以通过用户的购买,收藏,浏览时间来判断)。
根据上图,我们现在的任务变成了判断应不应该将商品5推荐给Alice,也就是推测Alice对商品5的打分情况。
基于用户的协同过滤算法:
这就需要解决两个问题:
2.1 计算两个向量的相似度
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J (A,B) = \frac{|A \cap B|}{|A \cup B|} J(A,B)=∣A∪B∣∣A∩B∣
余弦相似度
它衡量了用户向量i ii和j jj之间的向量夹角的大小, 夹角越小, 说明相似度越大, 两个用户越相似
s
i
m
(
i
,
j
)
=
cos
(
i
,
j
)
=
i
⋅
j
∣
∣
i
∣
∣
⋅
∣
∣
j
∣
∣
sim (i,j) = \cos (i,j) = \frac{i \cdot j}{||i|| \cdot ||j||}
sim(i,j)=cos(i,j)=∣∣i∣∣⋅∣∣j∣∣i⋅j
皮尔逊相关系数
这个也是非常常用的一种计算相似度的一种方式, 相比余弦相似度, 皮尔逊相关系数通过使用用户平均分对个人独立评分进行修正, 减少了用户评分偏置的影响。
简单的说, 其实pearson做的就是把两个向量都减去他们的均值, 然后再计算consine值。 用pearson来计算用户相似进行推荐的话, 效果还是好于consine的。公式如下:
s
i
m
(
i
,
j
)
=
∑
p
∈
P
(
R
i
,
p
−
R
‾
j
)
(
R
j
p
−
R
‾
j
)
∑
p
∈
P
(
R
i
,
p
−
R
‾
i
)
2
∑
p
∈
P
(
R
i
,
p
−
R
j
‾
)
2
sim (i,j) = \frac{\sum_{p \in P}(R_{i,p}-\overline{\text{R}}_{j})(R_{jp} -\overline{\text{R}}_j )}{\sqrt{\sum_{p \in P}(R_{i,p}-\overline{R}_{i})^2}\sqrt{\sum_{p \in P}(R_{i,p}-\overline{R_{j}})^2}}
sim(i,j)=∑p∈P(Ri,p−Ri)2
∑p∈P(Ri,p−Rj)2
∑p∈P(Ri,p−Rj)(Rjp−Rj)
这个式子里面其实就是每个向量先减去了它的平均值, 然后在计算余弦相似度.
from scipy.stats import pearsonr i = [1, 0, 0, 0] j = [1, 0.5, 0.5, 0] pearsonr(i, j)
计算Alice对物品5的打分: