一、协同过滤算法简介
所谓协同过滤算法,其基本思想就是根据用户之前的喜好及其他兴趣相近的用户的选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向, 并预测用户可能喜好的产品进行推荐)。
目前应用广泛的协同过滤算法是基于邻域的方法,而这种方法主要有下面两种算法:
- 基于用户的协同过滤算法(UserCF): 给用户推荐和他兴趣相似的其他用户喜欢的产品
- 基于物品的协同过滤算法(ItemCF): 给用户推荐和他之前喜欢的物品相似的物品
二、基于用户的协同过滤
基于用户的协同过滤算法主要包括两个步骤:
- 找到和目标用户相似的用户
- 找到这个集合中用户喜欢的,且目标用户没有听说过的物品推荐给用户。
一个例子:
对用户推荐商品的过程可以形象化未一个猜测用户对商品打分的任务。上图就是5个用户对5个商品的打分情况,可以理解未用户对商品的喜欢程度(可以通过用户的购买,收藏,浏览时间来判断)。
根据上图,我们现在的任务变成了判断应不应该将商品5推荐给Alice,也就是推测Alice对商品5的打分情况。
基于用户的协同过滤算法:
- 首先根据前面的这些打分情况(或者说已有的用户向量)计算一下Alice和用户1, 2, 3, 4的相似程度, 找出与Alice最相似的n个用户
- 根据这n个用户对物品5的评分情况和与Alice的相似程度会猜测出Alice对物品5的评分, 如果评分比较高的话, 就把物品5推荐给用户Alice, 否则不推荐
这就需要解决两个问题:
- 用户之间的相似度如何计算
- 选出与Alice最相似的n个用户后如何根据他们的习惯进行推荐。
2.1 计算两个向量的相似度
-
杰卡德相似系数
这个是衡量两个集合的相似度一种指标。 两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。
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的打分: