为什么要讲推荐系统:
- 推荐系统是机器学习中的一个重要的应用。
- 在行业里,尤其是硅谷有很多公司试图建立好的推荐系统。如果你考虑像Amazon,Netflix或eBay等网站或系统试图推荐新产品给用户。如Amazon推荐新书,Netflix推荐新电影给你,等等。
- 这些推荐系统,根据你过去买过什么书,或过去评价过什么电影来判断。对收入的增加非常有帮助。因此,对推荐系统性能的改善,将对这些企业的有实质性和直接的影响。
- 在机器学习相关的学术界,推荐系统问题实际上受到很少的关注,或者说在学术界它占了很小的份额。但是,在许多有能力构建这些系统的科技企业中,推荐系统似乎占据很高的优先级。
- 讨论推荐系统,可以讨论到机器学习中的一些大思想。对机器学习来说,特征是很重要的,所选择的特征,将对学习算法的性能有很大的影响。在机器学习中,针对一些问题,有算法可以为你自动学习一套好的特征。推荐系统就是这样一个例子。通过推荐系统,你将领略一小部分特征学习的思想。
例子:
假使一个电影供应商,有 5 部电影和 4 个用户,要求用户为电影打分。前三部电影是爱情片,后两部则是动作片。可以看出Alice和Bob更倾向与爱情片, 而 Carol 和 Dave 似乎更倾向与动作片。并且没有用户给所有的电影都打过分。希望构建一个算法来预测每个人可能会给没看过的电影打多少分,并以此作为推荐的依据。
在讨论解决方案前,定义如下符号:
- nu 代表用户的数量
- nm 代表电影的数量
- r(i,j) 如果用户j给电影 i 评过分则 r(i,j)=1
- y(i,j) 代表用户 j 给电影 i 的评分
- mj 代表用户 j 评过分的电影的总数
在一个基于内容的推荐系统算法中,假设希望推荐的东西有一些数据,这些数据是这些东西的特征。
例子中,假设每部电影都有两个特征,如 x1 代表电影的浪漫程度, x2 代表电影的动作程度。
则每部电影都有一个特征向量,如 x(1) 是第一部电影的特征向量为[0.9 0]。
下面要基于这些特征来构建一个推荐系统算法。假设采用线性回归模型,可以针对每个用户训练一个线性回归模型,如 θ(1) 是第一个用户的模型的参数。
则有:
- θ(j) 用户 j 的参数向量
- x(i) 电影 i 的特征向量
对于用户 j 和电影 i ,预测评分为: (θ(j))Tx(i)。
这种方法的一个假设是每个用户会依据其对电影各个特征的喜好程度来给每个电影打分。其中:
- 评分表 _(θ(j))Tx(i)_的维度:(nm, nu)
- 电影特征 _X_的维度:(nm, nx)
- 用户的喜好表 θ的维度:(nu, nx)
回忆一下此前在线性回归中讲过的预测房屋价格的例子,是非常类似的。只是在这个例子中,对于特定用户,并非给所有电影都做过评价,因此在做线性回归时,只能处理用户已经评价过的电影数据。
针对用户 j,该线性回归模型的代价为预测误差的平方和,加上正则化项:
其中 i:r(i,j) 表示只计算那些用户 j 评过分的电影。在一般的线性回归模型中,误差项和正则项应该都是乘以 1/2m ,在这里将 m 去掉。并且不对方差项 θ0 进行正则化处理。
上面的代价函数只是针对一个用户的,为了学习所有用户,将所有用户的代价函数求和:
如果要用梯度下降法来求解最优解,计算代价函数的偏导数后得到梯度下降的更新公式为:
在之前的基于内容的推荐系统中,对于每一部电影,都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果拥有用户的参数,可以学习得出电影的特征。
但是如果既没有用户的参数,也没有电影的特征,这两种方法都不可行了。协同过滤算法可以同时学习这两者。
优化目标便改为同时针对 x 和 θ 进行。
对代价函数求偏导数如下,对于 j = 1, ..., nu, i = 1, ..., nm,有:
注:在协同过滤从算法中,通常不使用方差项,如果需要的话,算法会自动学得。协同过滤算法使用步骤如下:
- 初始 x(1), x(1), ..., x(nm), θ(1), θ(2), ..., θ(nu) 为一些随机小值
- 使用梯度下降算法最小化代价函数
- 在训练完算法后,预测 (θ(j))Tx(i) 为用户 j 给电影 i 的评分
通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是可以用这些数据作为给用户推荐电影的依据。
例如,如果一位用户正在观看电影 x(i) ,算法可以寻找另一部电影 x(j) ,依据两部电影的特征向量之间的距离 ‖x(i)-x(j)‖ 的大小。
总结协同过滤优化目标的三种情况:
- 给定 x(1), ..., x(nm) ,估计 θ(1), ..., θ(nu) :
- 给定 θ(1), ..., θ(nu) ,估计 x(1), ..., x(nm) :
- 同时最小化 x(1), ..., x(nm) 和 θ(1), ..., θ(nu) :
这里介绍有关协同过滤算法的向量化实现,和利用协同过滤可以做的其他事情,例如:
- 当给出一件产品时,你能否找到与之相关的其它产品。
- 一位用户最近看上一件产品,有没有其它相关的产品,你可以推荐给他。
我将要做的是,实现一种选择的方法,写出协同过滤算法的预测情况。
一个电影评分的例子,有关于一个电影的数据集,将这些用户的电影评分,进行分组并存到一个矩阵中。
假设有五部电影、四位用户,那么这个矩阵 Y 就是一个5行4列的矩阵,它将这些电影的用户评分数据都存在矩阵里:
Movie | Alice (1) | Bob (2) | Carol (3) | Dave (4) |
---|---|---|---|---|
Love at last | 5 | 5 | 0 | 0 |
Romance forever | 5 | ? | ? | 0 |
Cute puppies of love | ? | 4 | 0 | ? |
Nonstop car chases | 0 | 0 | 5 | 4 |
Swords vs. karate | 0 | 0 | 5 | ? |
推出评分:
上面这个矩阵的计算只需要计算 XΘT 即可,也就算是向量化的计算方法。
对于矩阵_XΘT_,它有一个数学属性就是低秩(Low Rank),上述计算的逆过程( XΘT = X * ΘT )也可以理解为低秩矩阵分解,可参考推荐阅读。
找到相关电影:
- 对于每个影片 i,学习特征的向量 x(i) ∈ Rn:
- 例如 x1 = 爱情片, x2 = 动作片,x3 = 喜剧片,等等
- 给定电影 j,如何找到相关电影 i?
- 如果电影 j 和电影 _i_的距离 ||x(i) - x(j)|| 很小,那么认为两部电影是相似的
现在已经学习根据特征参数向量来度量两部电影之间的相似性。例如:电影 i 有一个特征向量 x(i) ,是否能找到一部不同的电影 j ,保证两部电影的特征向量之间的距离 x(i) 和 x(j) 很小,那就能很有力地表明电影 i 和电影 j 在某种程度上有相似,至少在某种意义上,某些人喜欢电影 i ,或许更有可能也对电影 j 感兴趣。
总结一下,当用户在看某部电影 i 的时候,如果你想找5部与电影非常相似的电影,为了能给用户推荐5部新电影,你需要找出电影 j ,使得 j 在这些不同的电影中与要找的电影 i 的距离最小,这样你就能给你的用户推荐几部不同的电影了。
通过这个方法,希望你能知道,如何进行一个向量化的计算来对所有的用户和所有的电影进行评分计算。同时希望你也能掌握,通过学习特征参数,来找到相关电影和产品的方法。
来看下面的用户评分数据:
如果新增一个用户 Eve,并且 Eve 没有为任何电影评分,那么以什么为依据为Eve推荐电影呢?
首先需要对结果 Y 矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:
然后利用这个新的 Y 矩阵来训练算法。 如果要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测 (θ(j))Tx(i) + μi ,对于Eve,新模型会认为她给每部电影的评分都是该电影的平均分。
- 推荐访问Google Drive的共享,直接在Google Colab在线运行ipynb文件:
- 不能翻墙的朋友,可以访问GitHub下载: