一、协同过滤思想介绍
顾名思义,协同过滤算法的核心思想就是“物以类聚,人以群分”,通过用户对物品的评价和意见,将物品和人聚成几类,从各自的类中挑选出用户可能感兴趣的的物品进行推荐,而代替从直接从海量物品中筛选,缩小目标范围,简化计算。
二、协同过滤基本原理
协同过滤最关键的一步是怎么将人或者是物品进行聚类,此时我们的一般做法是获取用户-物品的共现矩阵,其中用户跟物品发生的交互有可能是显示行为(比如有具体评分等),但大部分情况下我们拿到的都是隐式行为(比如是否浏览、点击等)
用户/物品 | i1 | i2 | i3 |
---|---|---|---|
u1 | 1 | 1 | |
u2 | 1 | ||
u3 | 1 |
拿到共现矩阵之后我们就可以进行距离计算,我们可以计算用户间的距离,也可以计算物品之间的距离,这也就衍生出了两种不同的协同过滤方式。我们的目的是给用户推荐,也就没有和用户发生过交互行为的物品。
1.基于用户的协同过滤(Usercf)
基本步骤
- Step1:计算用户间的相似度(共现矩阵中行与行)
- Step2:选取TopN个相似用户
- Step3:计算预测得分
- Step4:选出TopK个物品进行推荐
关于用户间的相似度计算方法有很多,这里重点列举几种常用的方法。
相似度计算方式
(1)杰卡德(Jacard)相似系数
两个集合A和B交集元素的个数在A、B并集中所占的比例,称为这两个集合的杰卡德系数,用符号 J(A,B) 表示。杰卡德相似系数是衡量两个集合相似度的一种指标,jaccard值越大说明相似度越高。其取值范围为[0,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∣
其缺点为引入分值,对所有物品一视同仁
(2) 余弦相似度
余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度,夹角越小,证明余弦相似度越大,两个用户越相似,其取值范围为[-1,1]。
cos
θ
=
∑
i
=
1
n
(
A
i
×
B
i
)
∑
i
=
1
n
(
A
i
)
2
×
∑
i
=
1
n
(
B
i
)
2
\cos \theta=\frac{\sum_{i=1}^n(A_i\times B_i)}{\sqrt{\sum_{i=1}^n(A_i)^2\times \sqrt{\sum_{i=1}^n(B_i)^2}}}
cosθ=∑i=1n(Ai)2×∑i=1n(Bi)2∑i=1n(Ai×Bi)
=
A
T
⋅
B
∣
∣
A
∣
∣
×
∣
∣
B
∣
∣
=\frac{A^T\cdot B}{||A||\times ||B||}
=∣∣A∣∣×∣∣B∣∣AT⋅B
不过对于不同的物品,其所带来的影响也是不同的,比如:两个用户都对<新华字典>有过行为,但这并不能说明他们的兴趣是一样的,因为大多数人都买过这件商品。但如果用户都买过《java语言编程思想》,那么就可以认为他们的兴趣有很大的相似之处。换句话说,两个用户对冷门的物品采取过同样的行为更能说明他们兴趣的相似度。所以可以改进上述的公式(称为User-IIF):
cos
θ
=
∑
i
=
1
n
(
A
i
×
B
i
×
1
log
(
1
+
N
i
)
)
∑
i
=
1
n
(
A
i
)
2
×
∑
i
=
1
n
(
B
i
)
2
\cos \theta=\frac{\sum_{i=1}^n(A_i\times B_i\times \frac{1}{\log (1+N_i)})}{\sqrt{\sum_{i=1}^n(A_i)^2\times \sqrt{\sum_{i=1}^n(B_i)^2}}}
cosθ=∑i=1n(Ai)2×∑i=1n(Bi)2∑i=1n(Ai×Bi×log(1+Ni)1)
其中 N i N_i Ni为物品 i i i跟用户发生过交互的次数, N i N_i Ni越大,则对应 1 log ( 1 + N i ) \frac{1}{\log (1+N_i)} log(1+Ni)1越小,对热门商品进行了惩罚,不过改进后的余弦相似度仍存在没有考虑用户间评分偏差性的问题。
(3)皮尔逊相关系数
通过引入用户平均分减少用户评分对结果的影响
cos
θ
=
∑
i
=
1
n
(
A
i
−
A
ˉ
)
(
B
i
−
B
ˉ
)
∑
i
=
1
n
(
A
i
−
A
ˉ
)
2
×
∑
i
=
1
n
(
B
i
−
B
ˉ
)
2
\cos \theta=\frac{\sum_{i=1}^n(A_i-\bar A) (B_i-\bar B)}{\sqrt{\sum_{i=1}^n(A_i-\bar A)^2\times \sqrt{\sum_{i=1}^n(B_i-\bar B)^2}}}
cosθ=∑i=1n(Ai−Aˉ)2×∑i=1n(Bi−Bˉ)2∑i=1n(Ai−Aˉ)(Bi−Bˉ)
其实对于不同的业务,不一定要以平均值为衡量标准,比如工资这种情况选择中位数或许更靠谱。
预测评分计算
利用用户相似度和相似用户的评价加权平均获得用户的评价的预测值。
R
u
,
p
=
∑
s
∈
S
(
W
u
,
s
⋅
R
s
,
p
)
∑
s
∈
S
W
u
,
s
R_u,p=\frac{\sum_{s\in S}(W_{u,s}\cdot R_{s,p})}{\sum_{s\in S}W_{u,s}}
Ru,p=∑s∈SWu,s∑s∈S(Wu,s⋅Rs,p)
其中
S
S
S为TopN相似用户集合,
W
u
,
s
W_{u,s}
Wu,s是用户
u
u
u和用户
s
s
s的相似度,
R
s
,
p
R_{s,p}
Rs,p为用户
s
s
s对物品
p
p
p的评分。
可以选择减去用户对物品的评分偏差更精确:
R
u
,
p
=
∑
s
∈
S
(
W
u
,
s
⋅
(
R
s
,
p
−
R
ˉ
s
)
)
∑
s
∈
S
W
u
,
s
R_u,p=\frac{\sum_{s\in S}(W_{u,s}\cdot (R_{s,p}-\bar R_{s}))}{\sum_{s\in S}W_{u,s}}
Ru,p=∑s∈SWu,s∑s∈S(Wu,s⋅(Rs,p−Rˉs))
Usercf的缺点
- 在物品较多的情况下,每个user对应的向量可能极其稀疏,不同用户之间买的物品重叠性较低,导致算法无法找到一个用户的邻居,即偏好相似的用户。这导致UserCF不适用于那些正反馈获取较困难的应用场景*(如酒店预订, 大件商品购买等低频应用),通俗的说就是user在item里面并不能形成很好的联系。
- 基于用户的协同过滤需要维护用户相似度矩阵以便快速的找出TopN相似用户, 该矩阵的存储开销非常大,存储空间随着用户数量的增加而增加,不适合用户数据量大的情况使用。因此很多平台初期都会采用Itemcf
2.基于物品的协同过滤(Itemcf)
基本步骤
- Step1:计算物品和物品之间的相似性(共现矩阵中列与列)
- Step2:获取用户最喜欢的TopK个物品列表(根据评分或者是浏览时长等)
- Step3:计算预测评分
- Step4:选取TopN个物品进行推荐
其相似度计算方式与Usercf计算方法相同,这里就不赘述了。
预测评分计算
R
u
,
p
=
∑
h
∈
H
(
W
p
,
h
⋅
R
u
,
h
)
R_{u,p}=\sum_{h\in H}(W_{p,h}\cdot R_{u,h})
Ru,p=h∈H∑(Wp,h⋅Ru,h)
其中
H
H
H为用户最喜欢TopK物品列表,
W
p
,
h
W_{p,h}
Wp,h是物品
p
p
p与物品
h
h
h的相似度,
R
u
,
h
R_{u,h}
Ru,h是用户
u
u
u对物品
h
h
h的已有评分
三、应用场景
UserCF基于用户相似度进行推荐,具有更强的社交特性,适用于新闻推荐场景。因为新闻本身的兴趣点往往是分散的,相比用户对不同新闻的兴趣偏好,新闻的及时性、热点性更为重要,UserCF正适用于发现热点,以及跟踪热点的趋势
ItemCF适用于兴趣变化较为稳定的场景,比如电商场景,用户往往在一个时间段内寻找一类商品,或者是电视剧、电影这种推荐场景
四、存在问题
协同过滤最严重的一个问题就是泛化能力较弱,具有很强的头部效应,容易跟大量物品产生相似, 而尾部物品由于特征向量稀疏, 导致很少被推荐。