Spark MLlib模型训练—推荐系列算法
如果你平时爱刷抖音,或者热衷看电影,不知道有没有过这样的体验:这类影视 App 你用得越久,它就好像会读心术一样,总能给你推荐对胃口的内容。其实这种迎合用户喜好的推荐,离不开机器学习中的推荐算法。
在今天这一讲,我们就结合两个有趣的电影推荐场景,为你讲解 Spark MLlib 支持的协同过滤与频繁项集算法
电影推荐场景
今天这一讲,咱们结合 Kaggle 竞赛中的MovieLens 数据集,使用不同算法来构建简易的电影推荐引擎。尽管 MovieLens 数据集包含了多个文件,但课程中主要用到的,是 ratings.csv 这个文件。文件中的每条数据条目,记录的都是用户对于电影的打分,如下表所示。
其中第一列 userId 为用户 ID,movieId 表示电影 ID,而 rating 就是用户对于电影的评分。像这样,同时存有用户与物品(电影)信息的二维表,我们把它们统称为“交互矩阵”,或是“共现矩阵”。你可能会疑惑,通过这么一份简单的二维表,我们能干些什么呢?
可别小瞧这份数据,与合适的模型算法搭配在一起,我就能根据它们构建初具模样的推荐引擎。在 Spark MLlib 框架下,至少有两种模型算法可以做到这一点,
- 一个是协同过滤(Collaborative Filtering),
- 另一个是频繁项集(Frequency Patterns)。
其中,前者天生就是用来做推荐用的,而后者是一种常规的非监督学习算法,你可以结合数据特点,把这个算法灵活运用于推荐场景。整个数据流差不多就是这样的
协同过滤
我们先说协同过滤,从字面上来说**,“过滤”是目的,而“协同”是方式**、方法。简单地说,协同过滤的目标,就是从物品集合(比如完整的电影候选集)中,“过滤”出那些用户可能感兴趣的物品子集。而“协同”,它指的是,利用群体行为(全部用户与全部物品的交互历史)来实现过滤
这样说有些绕,实际上,协同过滤的核心思想很简单,就是“相似的人倾向于喜好相似的物品集”。
交互矩阵看上去简单,但其中隐含着大量的相似性信息,只要利用合适的模型算法,我们就能挖掘出用户与用户之间的相似性、物品与物品之间的相似性,以及用户与物品之间的相似性。一旦这些相似性可以被量化,我们自然就可以基于相似性去做推荐了。思路是不是很简单?
那么问题来了,这些相似性,该怎么量化呢?答案是:矩阵分解。
在数学上,给定维度为(M,N)的交互矩阵 C,我们可以把它分解为两个矩阵 U 与 I 的乘积。其中,我们可以把 U 称作“用户矩阵”,它的维度为