基于物品的协同过滤(ItemCF)
前面的章节提到了基于用户的协同过滤算法,今天我们来聊聊协同过滤算法中的第二种,基于物品的协同过滤算法。
基于物品的协同过滤就是根据用户历史选择物品的行为,通过物品间的相似度,给用户推荐其他物品。
举个栗子,继续用上一章节的电影的例子,喜欢「复仇者联盟」的用户,往往都喜欢「钢铁侠」。这时,如果有用户看了「复仇者联盟」,就会给他推荐「钢铁侠」。
这个时候,有看到例子的朋友就会很疑惑了,怎么看起来跟基于用户的协同过滤差不多呢,没关系,往下看就会明白了。
跟基于用户的协同一样,基于物品的协同也是分两步来进行。
1. 计算物品之间的相似度。
那么我们要如何确定物品之间的相似度呢,根据物品历史被喜欢的情况,假如某两个物品历史共同被许多用户喜欢,则说明这两个物品是相似的。
假设喜欢物品 a 的用户数为 N(a),喜欢物品 b 的用户数为 N(b),那么 a 与 b 的相似度为:
上述公式可以理解为喜欢 A 物品的用户中,有多少比例的用户也喜欢 B,比例越高,说明 A与 B 的相似度越高。
但是这样的公式有一个问题,如果物品 B 很热门,很多人都喜欢,那么相似度就会无限接近1,这样就会造成所有的物品拿出来,都与 B 有极高的相似度,这样就没有办法证明物品之间的相似度是可靠的了。
为了避免出现类似的情况,可以通过以下公式进行改进:
2. 根据物品的相似度和用户的历史行为给用户推荐。
获得了物品的相似度后,则根据以下公式来计算用户 u 对物品 b 的兴趣:
其中,N(u)是用户喜欢物品的集合,S(b,K)是和物品 b 最相似的 K 个物品的集合,Wab 是物品 a 和 b 的相似度,Rua 是用户 u 对物品 a 的兴趣。
假设:
用户 A 喜欢:a b c
用户 B 喜欢:b c d
用户 C 喜欢:c d
喜欢一个物品的用户数为:
- 喜欢 a 的用户数:1
- 喜欢 b 的用户数:2
- 喜欢 c 的用户数:3
- 喜欢 d 的用户数:2
那么同时喜欢两个物品的用户数为:
- 喜欢 ab 的用户数:1
- 喜欢 ac 的用户数:1
- 喜欢 bc 的用户数:2
- 喜欢 dc 的用户数:2
物品相似度为:
-
ab 相似度为:
-
ac 相似度为:
-
bc 相似度为:
-
cd 相似度为:
如果某个用户对 a 的兴趣度为1,对 b 的兴趣度为2,那么预测他对 c,d 的兴趣度为:
-
c:
- d:0
以上就是基于物品的协同过滤算法。
说了这么多,回到最开始看到例子产生的疑问。基于物品的协同过滤和基于用户的协同过滤都是参考了用户的兴趣度,两者的区别在哪里?
其实可以把基于物品的协同过滤看做是基于用户的协同过滤的一种改良。
针对电商类网站,用户数远大于物品数,而且物品的变更频率不高,物品的相似度相对于用户的兴趣来讲比较稳定。这个时候使用基于物品的协同过滤是比较好的选择。
针对新闻类的应用,时效性较高,物品变化很快,而用户有相对稳定的场景。此时往往会选择基于用户的协同过滤算法。
最后要如何挑选,取决于网站里哪个相似度更稳定。