协同过滤
1.1 概述
协同过滤(简称CF)是根据已有数据来推测出未知数据。在协同过滤这个算法中会从海量的数据中找到与你品味比较类似( 即相似度达到指定范围)的数据,而这些数据会成为你的邻居,系统会根据*你的这些邻居为你推荐你心仪的物品。
启发式的协同过滤算法可以分为基于用户的协同过滤算法和基于项目的协同过滤算法。
1.2 协同过滤算法核心和原理
步骤如下:
(1)收集用户偏好。
(2)找到相似的用户或物品。
(3)计算并推荐。
1.3 基于用户的协同过滤算法
(图像理解)
1.3.1 相似值及预测值的计算
(这里仅用了皮尔逊相关系数来计算相似度其实计算相似度的公式有许多建议在网上自行查询)。
(1)相似度的计算
1.皮尔逊相关系数:
计算公式:
其中,i 表示项,例如商品;Iu 表示用户 u 评价的项集;Iv 表示用户 v 评价的项集;
r
u
,
i
r_{u,i}
ru,i 表示用户 u 对项 i 的评分;
r
v
,
i
r_{v,i}
rv,i表示用户 v 对项 i 的评分;
r
‾
u
\overline{r}_u
ru 表示用户 u 的平均评分;
r
‾
v
\overline{r}_{v}
rv 表示用户 v 的平均评分。
结果是一个在-1与1之间的系数,该系数用来说明两个用户间联系的强弱程度。
相关系数的分类:
1). 0.8-1.0 极强相关
2). 0.6-0.8 强相关
3). 0.4-0.6 中等程度相关
4). 0.2-0.4 弱相关
5). 0.0-0.2 极弱相关或无相关
2.预测值的计算
根据上述所求的相似度的值,寻找用户u的邻居集
N
∈
U
N\in U
N∈U,其中N表示邻居集,U表示用户集,然后根据用户评分数据预测用户u对项i的评分,计算公式如下:
其中s(u,u’)表示用户u和u’的相似度。
相关例子
有下面这个示例
假如有如下电子商务评分数据集,预测用户c对商品4的评分
表中 ?表示评分未知。根据基于用户的协同过滤算法步骤,计算用户 C 对商品 4 的评分,其步骤如下所示。
(1)寻找用户 C 的邻居 从数据集中可以发现,只有用户 A 和用户 D 对商品 4 评过分,因此候选邻居只 有 2 个,分别为用户 A 和用户 D。用户 A 的平均评分为 4,用户 C 的平均评分为 3.67,用户 D 的平均评分为 3。
根据皮尔逊相关系数公式:
红色区域计算 C 用户与 A 用户,用户 C 和用户 A 的相似度为:
s ( C , A ) = ( 5 − 3.67 ) ( 4 − 4 ) + ( 2 − 3.67 ) ( 3 − 4 ) ( 5 − 3.67 ) ) 2 + ( 2 − 3.67 ) 2 × ( 4 − 4 ) 2 + ( 3 − 4 ) 2 s(C,A)=\frac{(5-3.67)(4-4)+(2-3.67)(3-4)}{\sqrt{(5-3.67))^{2}+(2-3.67)^{2}}\times\sqrt{(4-4)^{2}+(3-4)^{2}}} s(C,A)=(5−3.67))2+(2−3.67)2×(4−4)2+(3−4)2(5−3.67)(4−4)+(2−3.67)(3−4)
用户 C 和用户 A 的相似度
蓝色区域计算 C 用户与 D 用户的相似度为:
s ( C , D ) = ( 5 − 3.67 ) ( 2 − 3 ) + ( 4 − 3.67 ) ( 4 − 3 ) ( 5 − 3.67 ) 2 + ( 4 − 3.67 ) 2 × ( ( 2 − 3 ) 2 + ( 4 − 3 ) 2 s(C,D)=\frac{(5-3.67)(2-3)+(4-3.67)(4-3)}{\sqrt{(5-3.67)^{2}+(4-3.67)^{2}}\times\sqrt{((2-3)^{2}+(4-3)^{2}}} s(C,D)=(5−3.67)2+(4−3.67)2×((2−3)2+(4−3)2(5−3.67)(2−3)+(4−3.67)(4−3)
C 用户与 D 用户的相似度
(2)预测用户 C 对商品 4 的评分 根据上述评分预测公式,计算用户 C 对商品 4 的评分,如下所示: 用户 C 对商品 4 的评分
P c , 4 = 3.67 + 0.782 × ( 5 − 4 ) + ( − 0.516 ) × ( 3 − 3 ) 0.782 + 0.516 P_{c,4}=3.67+\frac{0.782\times(5-4)+(-0.516)\times(3-3)}{0.782+0.516} Pc,4=3.67+0.782+0.5160.782×(5−4)+(−0.516)×(3−3)=4.272
依此类推,可以计算出其他未知的评分。(以下数据的求解就不在一 一列举)
计算发现s(M,N)= s(N,M)
通过得到的预测值可以补全数据,如下图所示:
1.4 基于项目(物品)的协同过滤算法
基于物品的协同过滤算法通过计算不同用户对不同物品的评分获得物品间的关系,基于物品间的关系对用户进行相似物品的推荐,评分即代表用户对物品的态度和偏好。比如,用户A同时购买了物品x,y,那么说明x,y之间的相关度高,当用户B也购买了物品x时,那么可以预测B也可能购买物品y。
(图像理解)
算法流程:
1)构建用户
⟹
\Longrightarrow
⟹物品的倒排(即倒查表);
2)构建物品与物品的共现矩阵;
3)计算物品之间的相似度,即计算相似矩阵;
4)根据用户的历史记录,给用户推荐物品。
(改进优化)
注:该算法也适合解决基于用户的协同过滤问题
实例
如下表,行表示用户,列表示物品,1 表示用户喜欢该物品。
表一
1.4.1 构建倒排
A: a , b , d
B: b , c , e
C : c , d
D : b , c ,d
E : a , d
1.4.2 构建物品与物品之间的共现矩阵
共现矩阵表示同时喜欢两个物品的用户数,是一个对称矩阵,是由用户
⟹
\Longrightarrow
⟹物品的倒排表计算出来的。
1.4.3 计算物品之间的相似度,即计算相似矩阵
设 ∣ N ( i ) ∣ |N(i)| ∣N(i)∣表示喜欢物品的用户数, ∣ N ( i ) ∩ N ( j ) ∣ |N(i)\cap N(j)| ∣N(i)∩N(j)∣表示同时喜欢物品i、j用户数,则物品i与物品j的相似度为:
w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ w_{ij}=\frac{|N(i)\cap N(j)|}{|N(i)|} wij=∣N(i)∣∣N(i)∩N(j)∣
但上式也可能会出现问题,当物品j是一个很热门的物品时,人人都喜欢,那么就会很接近 1 ,那上式会让很多物品都和热门物品有一个很大的相似度。所以,需要改进一下公式:
w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ ∙ ∣ N ( j ) ∣ w_{ij}=\frac{|N(i)\cap N(j)|}{\sqrt{|N(i)|\bullet|N(j)|}} wij=∣N(i)∣∙∣N(j)∣∣N(i)∩N(j)∣(求相似度时主要用这个公式)
上式中,分子即为共现矩阵,矩阵 N(用于计算分母)表示喜欢某物品的用户数(是总的用户数).
矩阵N如下:
所以,物品之间的余弦相似矩阵如下(因为该矩阵是对阵的,所以在矩阵右上部分我写出了相似度计算的公式,左下部分写出了对应公式的值):
1.4.4 根据用户的历史记录个用户推荐物品
推荐结果 = 改进的共现矩阵*评分矩阵=相似矩阵
ItemCF 通过如下公式计算用户 u 对一个物品 j的兴趣度:
其中:
N(u):用户喜欢的物品的集合
S_{j,k}:和物品j最相似的k个物品的集合
W_{ji}:物品j和i的相似度
R_{uj}: 用户u对物品 i 的兴趣度(对于因反馈的数据集,如果用户 u 对物品 i 有过行为即可令
r
i
j
r_{ij}
rij=1)
上式的含义是:和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。
如:以用户 A 为例,建立用户对物品的评分矩阵(即 A对物品的兴趣度)如下:
用户 A 已经见过物品 a , b , d并对其进行了评分,所以我们需要选择是推荐物品c还是物品e给用户 A.
推荐结果:
则可以看出,用户 A 对物品 c 的预测兴趣度(即喜爱程度)为1.25, 对物品 e 的预测兴趣度(即喜爱程度)为0.58。所以,可向 A推荐物品 c .
1.5 User-based 与 Item-based算法对比
CF算法分为两大类,一类为基于memory的(Memory-based),另一类为基于Model的(Model-based),User-based和Item-based算法均属于Memory-based类型,具体细分类可以参考wikipedia的说明。
**User-based**的基本思想是如果用户A喜欢物品a,用户B喜欢物品a、b、c,用户C喜欢a和c,那么认为用户A与用户B和C相似,因为他们都喜欢a,而喜欢a的用户同时也喜欢c,所以把c推荐给用户A。该算法用最近邻居(nearest-neighbor)算法找出一个用户的邻居集合,该集合的用户和该用户有相似的喜好,算法根据邻居的偏好对该用户进行预测。
User-based算法存在两个重大问题:
- 数据稀疏性。一个大型的电子商务推荐系统一般有非常多的物品,用户可能买的不到1%的物品,不同用户之间买的物品重叠性较低,导致算法可能无法找到一个用户的邻居,即偏好相似的用户。
- 算法扩展性。最近邻居算法的计算量随着用户和物品数量的增加而增加,不适合数据量大的情况使用。
Iterm-based的基本思想是预先根据所有用户的历史偏好数据计算物品之间的相似性,然后把与用户喜欢的物品相类似的物品推荐给用户。还是以之前的例子为例,可以知道物品a和c非常相似,因为喜欢a的用户同时也喜欢c,而用户A喜欢a,所以把c推荐给用户A。
因为物品直接的相似性相对比较固定,所以可以预先在线下计算好不同物品之间的相似度,把结果存在表中,当推荐时进行查表,计算用户可能的打分值,可以同时解决上面两个问题。
参考文章资料来源
1、https://www.bilibili.com/video/BV1WX4y1K7Xj
2、https://blog.csdn.net/m0_51132284/article/details/112793371
3、https://blog.csdn.net/wickedvalley/article/details/80095007
4、https://blog.csdn.net/qq_42851418/article/details/85265723
5、http://blog.csdn.net/huagong_adu/article/details/7362908