协同过滤算法(collaborative filtering)的主要目标是通过用户物品交互产生的协同(collaborative)信息,从而计算用户与用户之间的相似度、物品与物品之间的相似度。通过相似度的加权求和,计算用户对于物品的评分。
根据相似度计算的出发点的不同,协同过滤可以分为用户协同过滤(userCF)以及物品协同过滤(itemCF)。
共现矩阵(用户-物品交互的0/1矩阵)
例如,用户1与物品1、2产生过交互,用户2与物品3产生过交互,用户3未和任何一个物品产生交互,则共现矩阵如下所示:
物品1 | 物品2 | 物品3 | |
---|---|---|---|
用户1 | 1 | 1 | 0 |
用户2 | 0 | 0 | 1 |
用户3 | 0 | 1 | 0 |
(1)余弦相似度(cosine similarity)
余弦相似度多用于衡量向量之间的相似性。其物理含义是向量的夹角越小,则余弦相似度越大。当向量之间重合时,余弦相似度为1。
c o s ( a ⃗ , b ⃗ ) = a ⃗ ⋅ b ⃗ ∣ ∣ a ⃗ ∣ ∣ ⋅ ∣ ∣ b ⃗ ∣ ∣ cos(\vec{a}, \vec{b}) = \frac{\vec{a} \cdot \vec{b}}{||\vec{a}|| \cdot ||\vec{b}||} cos(a ,b )=∣∣a ∣∣⋅∣∣b ∣∣a ⋅b
(2)皮尔逊相似度
s i m ( j , i ) = ∑ p ∈ P ( R i , p − R i ‾ ) ( R j , p − R ‾ j ) ∑ p ∈ P ( R i , p − R ‾ i ) 2 ∑ p ∈ P ( R j , p − R ‾ j ) 2 sim(j, i) = \frac{\sum_{p \in P}(R_{i, p} - \overline{R_i})(R_{j, p} - \overline R_j)}{\sqrt{\sum_{p \in P}(R_{i, p} - \overline R_i})^2\sqrt{\sum_{p \in P}(R_{j, p} - \overline R_j})^2} sim(j,i)=∑p∈P(Ri,p−Ri )2∑p∈P(Rj,p−Rj )2∑p∈P(Ri,p−Ri)(Rj,p−Rj)
* 减小用户偏置的影响
1、通过共现矩阵,得到用户表示向量。例如用户1 = [1, 1, 0], 用户3 = [0, 0, 0]
2、两两之间计算用户向量的相似度,得到用户相似度矩阵(用户-用户矩阵),这里以余弦相似度为例。
用户1 | 用户2 | 用户3 | |
---|---|---|---|
用户1 | 1 | 0 | 1 / 2 1 / \sqrt{2} 1/2 |
用户2 | 0 | 1 | 0 |
用户3 | 1 / 2 1 / \sqrt{2} 1/2 | 0 | 1 |
3、获取Top n的相似用户,计算用户u对物品p的评分。用户u与相似用户的相似度乘上用户对于物品p的评分。
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)
1、在真实场景中,用户增长速度一般大于物品增长速度,因此用户数量可能远大于物品数量,存储用户相似度矩阵的存储开销过大。
2、用户的历史数据稀疏,大部分用户交互的物品占总物品的比例很低,所以找到相似用户的准确率不高, 不适用用户交互反馈稀疏的场景。
1、通过共现矩阵,得到物品表示向量。例如物品1 = [1, 0, 0], 物品2 = [1, 0, 1]
2、两两之间计算物品向量的相似度,得到物品相似度矩阵(物品–物品矩阵)
3、获取Top k的相似物品,计算用户u对物品p的评分
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是用户u正反馈的物品集合。
更容易追踪兴趣相似的人喜欢什么,社交属性强,同时相对于关注物品的类型,捕捉热点的能力强。
更适用于兴趣变换稳定的应用,如电商、视频等。
处理稀疏向量的能力弱,头部效应明显,对长尾物品不利。
例如两个冷门物品,交互的用户都不多,相乘等于零的概率大。但是对热门物品,跟大部分的物品都有交互,因此基本上都会有得分,更容易被推荐为相关物品,出现马太效应。
《深度学习推荐系统》 王喆