网易云音乐的歌单推荐算法是怎样的?

不是广告党,但我却成为网易云音乐的的重度患者,不管是黑红的用户界面,还是高质量音乐质量都用起来很舒服。我喜欢听歌,几乎每周不低于15小时,但其实听得不…
关注者
25,886
被浏览
2,378,424
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

最近研读了下「集体智慧编程」,书中提供了完整的推荐算法介绍。个人参照其中,并模拟网易云音乐的情景来举些例子(全文所有数据虚构,仅供参考)。

在详细介绍推荐算法前,要提一下协作型过滤(Collaborative Filtering)的概念:协作型过滤算法会通过对一大部分人进行搜索,从中发现与我们品味相近的一小部分人。算法会对这些人所偏爱的其他内容进行考查,并将它们组合起来构造出一个经过排名的推荐列表。有许多方法来帮助我们确定哪些人与自己的品味更加相近,在本文中我们将提到两种方法来实现这个目的,基于用户的协作型过滤和基于物品的协作型过滤。

我们先从更易理解的基于用户的协作型过滤开始。

基于用户的协作型过滤的流程至少包括以下四个步骤:

  1. 建立评价规则
  2. 搜集用户偏好
  3. 寻找相近的用户
  4. 推荐歌曲

1.建立评价规则

下图是我随意做的一个评价规则。评价规则应该根据明确的用户行为来建立。

需要特别注意的是,这个评价规则是可以随着开发者收集到数据和侧重点的不同进行变更(当然不能频繁变更)。

2.搜集用户偏好

根据评价规则,我们可以得到每个用户和该用户相关的每首歌的一个得分。 下图也是我随意造的数据。

3.寻找相近的用户

常用的计算相似度评价值的体系有两种:欧几里得距离和皮尔逊相关度。

欧几里得距离非常直观。我们以经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考查他们彼此间距离的远近,如下图:

(用R简单地画一下,莫吐槽太丑)

再次强调,欧几里得距离评价的核心是距离,这与票数第一名答案(

@邰原朗

)中用角度余弦值来评价有本质区别。

相比欧几里得距离,皮尔逊相关度评价是一种相对复杂一些的方法。它通过计算两组数据与某一直线拟合程度的相关系数,来判断两个对象的兴趣相似度。虽然皮尔逊相关度评价比欧几里得距离评价的计算公式更复杂一些,但是它在数据不是很规范的时候(比如对甲乙做比较,甲的用户偏好评分普遍高,乙则相反,用欧几里得距离评价的结果通常南辕北辙)往往能给出更好的结果。

我们以做对比的两者分别为坐标轴,在图中标出两者对共同音乐的评分情况。如下图所示。



根据周杰伦和那英的用户偏好,《真的爱你》分别得分为3分和3分,因此《真的爱你》定位在图的(3,3)处。

图中的虚线是最佳拟合线(本例中我采用的是OLS模型。绘制原理简言之,就是让这条线尽可能地靠近图上所有的数据点)。如果两位用户对所有歌曲的偏好情况都相同,那么这条直线将成为对角线,并且会与图上所有的数据点相交,从而得到一个结果为1的李响相关度评价。第一幅偏好空间的相关系数较低,下面是一个相关系数较高的例子。


采用皮尔逊相关度评价的一个明显好处是,它修正了“夸大分值(grade inflation)”的情况。在第二幅偏好空间中,虽然汪峰总是倾向于给出比周杰伦更高的分值,但最终的虚线几乎是拟合的,这是因为他们两者有着相对近似的偏好。而皮尔逊相关度评价的结果是否就是我们想要的结果,取决于具体的应用场景。

4.推荐歌曲

接下来系统要做的就是,为用户郑昊提供歌曲推荐。我们当然可以查找与郑昊品味最相近的人,从他所喜欢的歌曲中找出一首郑昊可能还未接触过的歌曲。不过,这样的做法未免太随意了。

目前最通用的做法是,通过一个经过加权的评价值来为歌曲打分,评分结果即排名结果。为此,我们需要取得所有其他用户的分数,借此得到相关系数后,再乘以他们与相关歌曲的分数,求和之后再除以对应的相关系数总计,便能获得一个我们需要的评价值。在下表中我们给出了具体的做法。


「相关系数」一列来自于皮尔逊相关度评价。「歌名」对应各用户的得分来自评价规则处理后的结果。将前两者一一对应相乘,便是「歌N*相关系数」的值。如此一来,相比于与我们不相近的人,那些与我们相近的人将会对整体评价值拥有更多的贡献。总计一行给出了所有加权评价值的总和。

我们可以用总计值来计算歌曲排名,但是我们还需要考虑到,这样人数会对一首歌的得分产生正相关影响。为了避免这一问题,我们需要将总计除以相关系数总计。相关系数总计等于所有对这首歌曲有影响的用户的相关系数之和。表中最后一行就是我们所需要的结果。

接下来,我们来介绍基于物品的协作型过滤。

如果将基于用户的协作型过滤简述成如下形式:

网易云音乐用户甲->偏好相近用户->相关歌曲->推荐列表。

那么基于物品的协作型过滤也可以简述成如下形式:

1.歌曲A->相关用户->相关歌曲->推荐列表;

2.网易云音乐用户甲->偏好歌曲->推荐列表。

步骤1是对任意一歌曲进行数据抓取,找到相关用户和这些用户的偏好数据,再去得到相关歌曲信息,获取与该歌曲相近的最优推荐。由于与用户无关,所以步骤1可以安排在网络流量不是很大的时候进行,或者在独立于主应用之外的另一台计算机上单独进行。这里的歌曲A可能是任一一首歌。步骤1承担了大部分的运算工作。

步骤2在用户甲有相关需求时发生,通过获取用户甲的偏好歌曲和步骤1的结果,就能找到给用户甲的歌曲推荐。