一、算法概述
通过分析用户兴趣,在用户群中找到指定用户的相似用户,综合这些相似用户对某一信息的评价,形成系统关于该指定用户对此信息的喜好程度预测。
实现协同过滤需要以下3个步骤:
- 收集用户偏好
- 找到相似的用户或物品
- 计算推荐
二、用户评分
从用户的行为和偏好中发现规律,并基于此进行推荐,所以收集用户的偏好信息成为系统推荐效果最基础的决定因素。用户有很多方式向系统提供自己的偏好信息,如:评分、投票、转发、购买、点击流、页面停留时间等。
以上用户行为都是通用的,在实际设计中添加一些特定的用户行为,并用他们表示用户对物品的喜好程度。如何组合用户的行为基本有如下两种方式。
- 将不同的行为分组
一般分为查看和购买,然后基于不同用户的行为,计算不用用户或物品的相似度。类似“购买了该书的人还购买了”“查看了该书的人还查看了” - 对不同行为加权
对于不同行为产生的用户喜好进行加权,然后求出用户对物品的总体喜好。
收集完数据后要进行数据预处理核心工作是减噪和归一化
- 减噪:数据中可能存在大量噪声和误操作
- 归一化:不同行为数据差别比较大,通过归一化
经过以上处理得到如下一张二维表,值是用户对商品的喜好:
用户/物品 | 物品A | 物品B | 物品C |
---|---|---|---|
用户A | 0.1 | 0.8 | 1 |
用户B | 0.1 | 0 | 0.02 |
用户C | 0.5 | 0.3 | 0.1 |
三、相似度计算
协同过滤中分为基于用户的协同过滤和基于物品的协同过滤。相似度计算现有的几种方法是基于向量的,即计算两个向量的距离,距离越近相似度越大。在与用户-物品偏好二维矩阵中将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,或者将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度。简要介绍如下5种。
- 同现相似度
物品i和物品j的同相似度公式定义
其中,分母是喜欢物品i的用户数,而分子则是同时喜欢物品i和物品j的用户数。因此,上述公式可用理解为喜欢物品i的用户有多少比例的用户也喜欢j (和关联规则类似)但上述的公式存在一个问题,如果物品j是热门物品,有很多人都喜欢,则会导致Wij很大,接近于1。因此会造成任何物品都和热门物品交有很大的相似度。为此我们用如下公式进行修正:
这个格式惩罚了物品j的权重,因此减轻了热门物品和很多物品相似的可能性。
- 欧式距离
最初用于计算欧几里得空间中的两个点的距离,假设x、y是n维空间的两个点,它们之间的欧几里得距离是:
可以看出,当n=2时,欧几里得距离是平面上的两点的距离。当用欧几里得距离表示相似度时,一般采用一下公式进行转换:距离越小,相似度越大。
- 皮尔逊相关系数
皮尔逊相关系数一般用于计算两个定距变量间联系的紧密程度,它的取值在[-1,+1]之间。
- Cosine相似度
Cosine相似度被广泛应用于计算文档数据的相似度:
- Tanimoto系数
Tanimoto系数由Jaccard系数扩展而来,多用于文档计算,详细介绍
四、推荐计算
- 基于用户的CF(userCF)
基于用户对物品的偏好找到相邻的用户,然后将邻居用户喜欢的推荐给当前用户。在计算上将一个用户对所有物品的偏好作为一个向量计算用户之间相似度,找到K邻居后,根据邻居的相似度权重及其对物品的偏好,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。 - 基于物品的CF(itemCF)
基于物品的CF的原理和基于用户的CF类似,在计算邻居时采用物品本身。
五、训练数据
1,1,1
1,2,1
2,1,1
2,3,1
3,3,1
3,4,1
4,2,1
4,4,1
5,1,1
5,2,1
5,3,1
6,4,1
六、实战代码
相似度计算类ItemSimilarity,支持同现相似度、余弦相似度、欧氏距离相似度