推荐系统|推荐系统 —— 协同过滤

前言 作为推荐系统 这一系列的第二篇文章,我们今天主要来聊一聊目前比较流行的一种推荐算法——协同过滤;
当然,这里我们只讲理论,并不会涉及到相关代码或者相关框架的使用,在这一系列的后续文章,如果可能,我们可以将我们的所有理论知识整合一下,实践一个 推荐系统的 实战。
协同过滤是什么 顾名思义,协同过滤就是指用户可以齐心协力,通过不断地和网站互动,使自己的推荐列表能够不断过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。这种仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法,一般来说可以分为以下几种:

  • 基于邻域的方法(neighborhood-based)
  • 隐语义模型(latent factor model)
  • 基于图的随机游走算法(random walk on graph)等
而今天我们要说的 基于用户的协同过滤 就是一种 基于邻域的方法;
基于邻域的方法 又可以分为以下两种算法:。
  • 基于物品的协同过滤算法
    这种算法给用户推荐和他之前喜欢的物品相似的物品。
  • 基于用户的协同过滤算法
    给用户推荐和他兴趣相似的其他用户喜欢的物品。
基于用户的协同过滤
  • 原理
    给用户推荐和他兴趣相似的其他用户喜欢的物品。
  • 实现步骤:
    • 找到和目标用户兴趣相似的用户集合。
    • 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
  • 实践(只是为了加深理解哈)
    上面都是空洞洞的文字描述,下面我们就一个列子来加深一下理解
    1. 收集数据,假设我们现以收集如下数据
    user item1 item2 item3
    A 1 1 0
    B 1 1 1
    C 0 1 1
    这是一个简单的 user 和 item 的矩阵,如果user购买过item 则标识为1 ,否则为 0。
    1. 计算用户之间的相似度:
      相似度的计算是有很多种方法的,如何准确的计算出两个用户之间的相似度是该算法的一个最重要的环节,至于相似度的计算,网上还是有相当多的资料的,这里就不再赘述,下面我简单的列举了一些比较常用和简单的计算方式
    • 距离衡量相似度
      我们可以将每一个用户想象成特征组成的高维空间的一个点,而他们的相似度就是这两个点的距离,常用的距离公式有:欧几里得距离,曼哈顿距离,明可夫斯基距离 等
    • 余弦相似度计算法
      我们可以将每一个用户想象成特征组成的高维空间的一个点,其与 高维空间中的原点组成一个表示其的唯一向量,两个用户的相似度就可以用他们两个向量之间的夹角来确定,夹角越小,越相似
    • 其他
      可以参考一下这个文章这个文章
    • 同现度
      最后,我们再来说一个比较low,但是也简单的算法,也是本次实践的算法:同现度
      即,当两个用户同时购买了同一个商品,那么他们相似度 +1
      那么我们就可以计算出用户之间的相似度了,可以得到如下一个列表
      user A B C
      A * 2 1
      B 2 * 2
      C 1 2 *
    这里啰嗦一下,虽然算法分简单 和 复杂,但是和算法的效果是没有绝对的关系的,所以不要小看那些简单的算法噢。
    1. 【推荐系统|推荐系统 —— 协同过滤】找到和推荐用户相似的用户集合 ,并推荐
      这里我们只有一个3个用户,所以我们这个集合那就定为一个吧,如果我们要给A推荐,那么先找到与A相似的用户集合 {B}
    2. 推荐
      既然我们找到了A用户的相似用户们是 B,而且也可以很简单的发现 B 买过 item3,而A没有买过,所以我们就给 A 推荐 item3
  • 总结
    基于用户的协同过滤差不多就是这个样子,当然实际生产环境你肯定得考虑很多其他因素,比如数据规模,数据特征选取,特征的权重等等等等。当然这些都不在讨论之列,我们只要知道该算法是个什么,怎么做的,有什么用就好了。最后我们再来总结下这个算法优劣吧:+
    • 因为是找用户的相似度,所以更能反映了用户所在的小型兴趣群体中物品的热门程度,比较社会化群体化。
    • 针对用户个人而言,其特征或者说兴趣是不够细化的。
    • 从实时方面来看,用户个人的行为不一定能造成物品推荐的实时更新,当然这里是不一定,很多时候,当某个热点东西进入该用户的圈子,这个东西的传递还是迅速的
    • 对于物品的冷启动比较友好,一旦一个新物品被某个用户购买,立刻就可以推荐给他圈子的其他用户
    • 对于用户的冷启动不友好,因为一个新用户的加入,并不会马上被加入到某个圈子,比较用户相似度矩阵是不可能实时计算的。
    • 推荐结果不具有可解释性,我不知道推荐给你的这个物品是什么,我只知道,你的朋友都在用
    • 对于用户比较庞大的公司,计算用户相似度会比较麻烦
基于物品的协同过滤 上面讲完了 基于用户的协调过滤,那么我们成热打铁把 基于物品的协调 过滤也一块讲了
物品的协调过滤 不同于 基于用户的区别就在于:
  1. 计算相似度的时候我们是通过用户行为计算的 物品之间 的相似度,而基于用户 则是通过用户行为计算的 用户之间 的相似度。维护的是物品之间的相似度矩阵
  2. 当给一个用户作推荐的时候,基于用户 因为已经计算了 用户之间的相似度,则可以找到推荐用户兴趣相似的用户,而基于物品,则可以找到和推荐用户感兴趣的物品相似的物品来做推荐
好像差不多也就这些东西,弄懂基于用户的协同过滤之后,基于物品的也就是那么回事了,其主要特征如下:
  • 推荐更加个性化,反映了用户自己的兴趣传承
  • 实时性方面,用户实时浏览和喜欢,都能立即造成推荐的物品的改变
  • 对于物品的冷启动比较不友好
  • 对于用户的冷启动比较友好
  • 推荐结果具有很好的解释性
  • 对于物品实时更新的领域不太适用,比如:新闻。相反,对于物品变化比较不敏感的领域很适用。
ok!就这样了,感谢你的观看!!!

    推荐阅读