你好,我是黄申。

个性化推荐这种技术在各大互联网站点已经普遍使用了,系统会根据用户的使用习惯,主动提出一些建议,帮助他们发现一些可能感兴趣的电影、书籍或者是商品等等。在这方面,最经典的案例应该是美国的亚马逊电子商务网站,它是全球最大的 B2C 电商网站之一。在公司创立之初,最为出名的就是其丰富的图书品类,以及相应的推荐技术。亚马逊的推荐销售占比可以达到整体销售的 30% 左右。可见,对于公司来说,推荐系统也是销售的绝好机会。因此,接下来的两节,我会使用一个经典的数据集,带你进行推荐系统核心模块的设计和实现。

MovieLens 数据集

在开始之前,我们先来认识一个知名的数据集,MovieLens。你可以在它的主页查看详细的信息。这个数据集最核心的内容是多位用户对不同电影的评分,此外,它也包括了一些电影和用户的属性信息,便于我们研究推荐结果是不是合理。因此,这个数据集经常用来做推荐系统、或者其他机器学习算法的测试集。

时至今日,这个数据集已经延伸出几个不同的版本,有不同的数据规模和更新日期。我这里使用的是一个最新的小规模数据集,包含了 600 位用户对于 9000 部电影的约 10 万条评分,最后更新于 2018 年 9 月。你可以在这里下载:http://files.grouplens.org/datasets/movielens/ml-latest-small.zip

解压了这个 zip 压缩包之后,你会看到 readme 文件和四个 csv 文件(ratings、movies、links 和 tags)。其中最重要的是 ratings,它包含了 10 万条评分,每条记录有 4 个字段,包括 userId、movieId、rating、timestamp。userId 表示每位用户的 id,movieId 是每部电影的 ID,

rating 是这位用户对这部电影的评分,取值为 0-5 分。timestamp 是时间戳。而 movies 包含了电影的主要属性信息,title 和 genres 分别表示电影的标题和类型,一部电影可以属于多种类型。links 和 tags 则包含了电影的其他属性信息。我们的实验主要使用 ratings 和 movies 里的数据。

设计的整体思路

有了用于实验的数据,接下来就要开始考虑如何设计这个推荐系统。我在第 38 期讲解了什么是协同过滤推荐算法、基于用户的协同过滤和基于物品的协同过滤。这一节我们就以协同过滤为基础,分别实现基于用户和物品的过滤。

根据协同过滤算法的核心思想,整个系统可以分为三个大的步骤。

第一步,用户评分的标准化。因为有些用户的打分比较宽松,而有些用户打分则比较挑剔。所以,我们需要使用标准化或者归一化,让不同用户的打分具有可比性,这里我会使用z 分数标准化。

第二步,衡量和其他用户或者物品之间的相似度。我们这里的物品就是电影。在基于用户的过滤中,我们要找到相似的用户。在基于物品的过滤中,我们要找到相似的电影。我这里列出计算用户之间相似度 usus