推荐系统入门系列—协同过滤算法详解
协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息。具体的又分为基于用户的协同过滤(User Collaboration Filter)和基于商品的协同过滤(Item Collaboration Filter)
基于用户的协同过滤(UserCF)
基本思想
基于用户的协同过滤推荐的基本原理是,根据所有用户对物品的偏好,发现与当前用户口味和偏好相似的‘“邻居” 用户群,并推荐近邻所偏好的物品。
在一般的应用中是采用计算“K近邻”的算法;基于这K个邻居的历史偏好信息,为当前用户进行推荐。
如下图所示:
用户c喜欢物品喜欢物品ACD,用户a喜欢物品喜欢物品AC,通过算法计算发现也用户a与用户c十分相似,于是猜测用户a也喜欢物品D,于是将D物品推送给用户a。
例子
(1)基本数据:假设用户对电影的评分情况如下,称之为评分矩阵:
用户/电影 | 电影1 | 电影2 | 电影3 | 电影4 | 电影5 | 电影6 |
---|---|---|---|---|---|---|
A | 1 | 5 | 3 | |||
B | 3 | 3 | ||||
C | 5 | 10 | ||||
D | 10 | 5 | ||||
E | 5 | 1 | ||||
F | 5 | 3 | 1 |
(2)根据评分矩阵计算用户相似度
我们采用最常见的余弦相似度进行计算相似度,设多维向量,则其余弦相似度为:
根据这个公式,可以计算出用户A 用户C,用户A、用户B 之间的相似度为:
计算所有的用户之间的相似度,进而得到用户相似度矩阵:
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
A | 1 | 0 | 0.08 | 0.15 | 0.93 | 0.43 |
B | 0 | 1 | 0 | 0.32 | 0 | 0.6 |
C | 0.08 | 0 | 1 | 0.4 | 0 | 0.15 |
D | 0.15 | 0.32 | 0.4 | 1 | 0 | 0 |
E | 0.93 | 0 | 0 | 0 | 1 | 0.5 |
F | 0.43 | 0.6 | 0.15 | 0 | 0.5 | 1 |
(3)根据评分矩阵、用户相似度矩阵得到推荐列表(推荐未看过的电影)
UserCF算法会基于评分矩阵、用户相似度矩阵给用户推荐和他兴趣最相似的K个用户喜欢的物品。如下的公式度量了UserCF算法中用户对物品的感兴趣程度:
其中,S(u,K) 为和用户 u 兴趣最接近的 K 个用户, N( i ) 为对物品 i 有过行为的用户集合, 为用户 u 和用户 v 的兴趣相似度, 为用户 v 对物品 i 的兴趣。
在电影推荐例子中,假设我们要给用户A推荐电影,我们首先找到个与用户A相似,并且对电影 评分的 用户集合。然后对这些用户集合中的每一个用户 进行如下计算: ( 用户 u 和相似用户 v 的相似程度 ) X ( 用户 v 对商品 i 的喜爱程度 r_{vi} ) 然后将乘积结果累加作为 u 对 i 的感兴趣程度。
如:我们要确定用户A对电影2的兴趣程度,先确定,所以:
不难发现,其数值就等于 相似度矩阵的第A行 与 评分矩阵第 电影2 列 内积的结果。
推广一下,用户u对物品i的评分数值就等于 相似度矩阵的第u行 与 评分矩阵第 i 列 内积的结果。
所以,推荐列表 = 相似度矩阵 X 评分矩阵
用户/电影 | 电影1 | 电影2 | 电影3 | 电影4 | 电影5 | 电影6 |
---|---|---|---|---|---|---|
A | 2.9 | 2.2 | 11.0 | 3.9 | 0.8 | 1.2 |
B | 3.2 | 6.0 | 1.8 | 0 | 4.6 | 0.6 |
C | 9.1 | 0.8 | 0.9 | 0.2 | 2.0 | 10.2 |
D | 11.2 | 1.0 | 0.8 | 0.5 | 6.0 | 4.0 |
E | 0.9 | 2.5 | 11.2 | 3.8 | 0 | 0.5 |
F | 1.2 | 6.8 | 7.7 | 1.8 | 1.8 | 2.5 |
由于用户已经对电影中的一些商品有过行为,所以还要把这些电影给滤除掉。
得到最终的推荐列表:
1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|
A | 2.2 | 0.8 | 1.2 | |||
B | 3.2 | 1.8 | 0 | 0.6 | ||
C | 0.8 | 0.9 | 0.2 | 2.0 | ||
D | 1.0 | 0.8 | 0.5 | 4.0 | ||
E | 0.9 | 2.5 | 0 | 0.5 | ||
F | 1.2 | 1.8 | 1.8 |
其数值代表的意义是用户对电影的感兴趣程度。
UserCF 改进
对于一些热门的商品例如《新华字典》,许多用户都可能会有购买行为,但是不能说明买过这本书的兴趣就相同。但是都买了相对冷门点的《统计学习方法》的人,就很可能有相似的兴趣。
为了改进这个问题,假设 N(i) 为喜欢物品 i 的用户数,则可以改用下面的公式计算相似度:
上面的式子中 惩罚了用户 u 和用户 v 共同兴趣列表中热门物品对他们相似度的影响。
基于物品的协同过滤(ItemCF)
基本思想
基于物品的协同过滤推荐的基本原理与基于用户的类似,只是使用所有用户
对物品的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户。
如下图所示:
用户c喜欢物品喜欢物品A,通过算法计算发现物品A与物品C十分相似,于是猜测用户c也喜欢物品C,于是将C物品推送给用户c。
例子
计算过程与UserCF非常相似,区别在于计算时把UserCF的评分矩阵转置:
电影/用户 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
电影1 | 1 | 5 | 10 | |||
电影2 | 3 | 5 | ||||
电影3 | 5 | 5 | 3 | |||
电影4 | 3 | 1 | ||||
电影5 | 3 | 5 | ||||
电影6 | 10 |
再计算商品与商品之间的相似度得到商品之间的相似度矩阵。
最后的推荐列表 = 商品之间的相似度矩阵 X 评分矩阵转置
ItemCF 改进
由于活跃用户可能会广泛的购买各种类别商品,因此对物品相似度的贡献要小于不活跃用户。本节计算相似度的方法同样可以改用下面的方法:
这个公式只是对活跃用户做的一种软性惩罚,但对于很多过于活跃的用户,在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中。
归一化
如果将 ItemCF 的相似度矩阵按最大值归一化,可以提高推荐的准确率。如果已经得到了物品相似度矩阵 w ,那么可以用如下公式得到归一化之后的相似度矩阵 w’ :
归一化的好处不仅仅在于增加推荐的准确度,它还可以提高推荐的覆盖率和多样性。
UserCF 与 ItemCF 对比
同样是协同过滤,在基于用户和基于项目两个策略中应该如何选择呢?
在实际应用中,存在两种情况:(1) 电商、电影、音乐网站,用户数量远大于物品数量。(2)新闻网站,物品(新闻文本)数量可能大于用户数量。
角度 | ltem-CF | User-CF |
---|---|---|
应用场景 | 物品的个数是远远小于用户的数量的,而且物品的个数和相似度相对比较稳定。适用于非社交推荐 | 物品的个数大于用户的个数,且物品的更新程度很快,相似度依然不稳定。适用与社交推荐 |
精确度 | 发现长尾物品,精度就会小于UserCF | 精度高与Item_CF |
系统多样性 | 多样性推荐较强 | 多样性推荐较弱 |
推荐偏好 | UserCF注重社会化 | ItemCF注重个性化 |