推荐系统入门总结
第2章协同过滤推荐
2.1基于用户的最近邻推荐
2.1.1基于用户的最近邻推荐(user-basednearest negibor recommendation)
1、算法步骤和假设
step1:给定用户-物品的二维矩阵(元素是用户对物品的评分)和用户标识作为输入
step2:找出与当前用户过去有相似偏好的用户(最近邻)
step3:对当前用户没有见过的物品p,利用最近邻用户对p的评分计算当前用户对p评分的预测值。
假设条件:(1)如果两个用户过去有相似的偏好,那么未来他们的偏好也是相似的。(2)用户的偏好不随着时间变化。
2、计算用户相似度
Person相关系数的方法:根据用户对物品的评分,用户a和用户b的相似度sim(a,b)可以用下列公式计算:
其中是用户a对物品的评分均值,用户b同理。
Person系数的范围是[-1,1]表示强负相关和强正相关。(公式计算的是两个向量的内积,相当于先计算出两个向量,然后减去平均值,最后做歌点乘),重点是减去了平均值,使得计算中不考虑平均值的差异使得用户可比。对于这样的例子比较合适,用户a的评分向量是(4,2,2,1),用户b的评分向量是(3,1,1,0)虽然绝对值不一样。但是减去平均值后趋势是差不多的,可以看作是相似的。
3、根据用户形似度预估评分
有了用户的相似度,就可以预估用户对没有评分的物品喜欢程度。用户a对未评分物品p的预估评分如下计算:
其中N是用户a的最近邻的个数。公式的意思是:p的评分相对于平均分有个偏差,这个偏差的依据是最近邻用户的偏差乘上相似度的和的平均值。
4、更好的相似度计算方法
第一个问题是热门物品。很多领域会存在一些大家都比较喜欢的物品(比如热歌),让两个用户对这些物品达成共识,很容易但是很没有价值,因为他不能体现出用户的差异即用户特殊的喜好。最好的结果是除邻热歌之外,有的用户喜好这些歌,而有的用户不太喜好这些歌。Person的方法不能解决热歌的问题。需要降低对广受欢迎物品有同样看法的相对重要性。类似与检索的技术叫反用户频率,解决这个问题。
https://arxiv.org/pdf/1301.7363.pdf
这篇文章提供一个方差权重因子的方法解决了这个问题。http://files.grouplens.org/papers/algs.pdf
第二个问题是评分较少的碰大运。当用户a和用户b都是给很少的物品评分时,我们依据Person系数不能区分他们是真正的兴趣相似还是碰巧因为这几个物品意见相同。即由于样本太少,即使相似度很高,但是不能推测出他们未来对很多物品的兴趣也是很相似的。这篇文章提供一个重要性赋权,解决这个问题。https://grouplens.org/site-content/uploads/evaluating-TOIS-20041.pdf
第三个问题:N的选择,到底要选择多少个近邻进行计算。如果所有的用户都考虑,计算量太大。需要通过给相似度设定阈值和最多N个近邻来解决。
2.2基于物品的最近邻推荐
基本思路:离线计算好物品之间的相似度矩阵,在线根据用户历史获取相似物品。
假设:(1)大家都说好的东西,那就是好东西。所以评分相似的物品,物品的相似度越高。(2)一个人对同一个物品的评分是相同的。所以用户对于相似的物品,会给出类似的评分。
2.2.1余弦相似度计算
将两个物品用向量来表示,计算向量间的夹角作为物品的相似度。一个方法是将一个物品的所有用户对它评分作为向量。这样评分越接近的两个物品,相似度越大。为了考虑用户评分平均分的差异,需要将用户的评分矩阵做个处理,每个用户的评分都要减去这个用户评分的平均值。然后再将物品表示乘评分组成的向量。设U为所有同时给物品a和物品b评分的用户集合,a和b的相似度公式如下:
其中是用户u所有评分的均值。
有了物品的相似度公式既可以预测用户对没有见过的物品的评分。书上的公式是:
其中relatedItems(u)是用户评分物品集合,realtedItems(p)是物品p的相似物品集合。是用户对物品i的评分。分母是相似度的和,分子是相似度乘评分的和。
我们的代码就是首先获取用户的听歌历史(由试听,收藏,讨厌等类型组成,每个类型有一定的权重和时间衰减),然后获得每首歌的相似歌曲列表,得到最终的推荐歌曲列表。歌曲的权重由相似度和听歌历史的权重相乘得到。没有除去分母。
2.3.1显式和隐式评分
我们的依据有用户的听歌历史,用户收藏,用户不喜欢,用户放入垃圾桶。