推荐

推荐的一些基本介绍

什么是推荐

定义:根据群体偏好来向用户推荐相关的物品

例子:

  1. Amazon、淘宝通过对用户浏览、购买等行为记录后,并推荐可能喜欢的商品
  2. 网易云音乐的私人FM
  3. 美团APP上的猜你喜欢

一般步骤:

  1. 搜集用户行为数据
  2. 建立用户-物品评价值表
  3. 计算用户-用户之间或物品-物品之间的相似度值
  4. 提供相似度最高的推荐

协作型过滤

Collaborative filtering:对一大群人进行搜索,并从中找出品味相近的一小群人。算法会对这些人所偏爱的其他内容进行考察,并将它们组合起来构造出一个经过排名的推荐列表

基于用户推荐

用户-物品评价值表:

物品1 物品2 物品n
用户1 3.5 4.5 4
用户2 4 3
用户3 3 4.5
用户4 4
用户5 3.5 4 4.5

相似度计算

基于用户-物品评价值表,我们可以计算出用户-用户之间的相似度评价值,有若干种方法可以计算。

  1. 欧几里得距离:当距离越大,则偏好越近;当=1时则代表偏好相同
  2. 皮尔逊相关度:判断两组数据与某一直线拟合程度的一种度量。
  3. 曼哈顿距离算法
  4. Jaccard/Tanimoto系数(Tanimoto coefficient)
  5. 互信息系数:度量非线性相关性
  6. 更多相似度计算函数

欧几里得距离

在数学中,欧几里得距离是欧几里得空间中两点间’’普通“(即直线)距离。

通过欧几里得公式我们可以计算基于用户-物品评价值表的偏好空间中用户与用户的距离,距离越近,则越相似

1
2
3
4
5
6
7
sum = 0
# useritems为用户-物品评价值表
for item in useritems[u1] :
if item in useritems[u2] :
sum += pow(useritems[u1][item] - useritems[u2][item] , 2)

similarity = sqrt(sum)

皮尔逊相关度评价

皮尔逊相关系数是判断两组数据与某一直线拟合程度的一种度量(即尽可能使图中红线靠近所有坐标点)

皮尔逊相关度计算函数会返回介于-1与1之间的数据。当值为1时表明两个人对每一个物品是完全一致的评价,值为-1时则表明两者完全不相关

推荐物品

为所有用户和待推荐用户计算相似度,根据相似度进行排名;这里我们得到了品味相近的人,现在想获得物品的推荐,当然我们可以从品味相近的用户中挑选尚未评价过的物品,但这样太随意了,可能存在的问题:

  1. 品味相近的用户尚未对某个物品进行评价,可能这个物品是想要的
  2. 品味相近的用户不看好某个物品,但可能这个物品是想要的

为了解决上述问题,我们需要通过一个加权的用户评价值表来进行打分

用户1的加权用户评价值表:

相似度 物品1 S(物品1) 物品2 S(物品2) 物品n S(物品n )
用户2 0.38 3 物品1 * 相似度 3
用户3 0.89 4 4.5
用户4 0.92 4 4
用户5 0.66 4 4 4.5
总计
Sim.Sum 相似度之和(该用户所有评论的物品)
总计/Sim.Sum

总计:得到用户对物品的评价,品味相近的人,为评价值提供更多的贡献

总计/Sim.Sum:为了防止受更多人评论的物品影响最终评价结果,需要用总计值/相似度之和进行标准化

最终我们会得到用户对所有物品的评价值列表,经过按评价值排序后,最后输出推荐列表

存在的问题

对于用户和物品数量级很大的情况,将一个用户和所有其他用户进行比较,然后再对每位用户评过分的商品进行比较,其速度是难以忍受的

并且也许用户在偏好方面在彼此间很少会有重叠,这可能会令计算用户的相似度判断变得十分困难

基于物品推荐

基于物品的协作型过滤允许我们将大量的计算任务预先执行,从而使需要给予推荐的用户能够更快地得到他们想要的结果

总体思路:

  1. 为每件物品预先计算好最为相近的物品
  2. 推荐时,取到该用户评价过的所有物品,找到与这些物品相似的物品
  3. 根据计算相似度加权后输出评价值

与基于用户推荐的区别是:物品间的比较不会像用户间比较的那么频繁变化,这就意味着这个计算过程可以离线进行