目录
【此为本人学习吴恩达的机器学习课程的笔记记录,有错误请指出!】
问题形式化
我们从一个例子开始定义推荐系统的问题。
假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分。如图:
前三部电影是爱情片,后两部则是动作片,可以看出 Alice 和 Bob 似乎更倾向与爱情片,而 Carol 和 Dave 似乎更倾向与动作片。 我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据。如上图中的?号就是待预测的评分(这里使用该用户评分的平均值作预测值)。
下面引入一些标记:
代表用户的数量
代表电影的数量
𝑟(𝑖, 𝑗) 如果用户 𝑗 给电影 𝑖 评过分,则 𝑟(𝑖, 𝑗) = 1
代表用户 𝑗 给电影 𝑖 的评分
代表用户 𝑗 评过分的电影的总数
基于内容的推荐系统
在该例子中,我们可以假设每部电影都有两个特征,如 𝑥1 代表电影的浪漫程度, 𝑥2 代表电影的动作程度。
则每部电影都有一个特征向量,如 是第一部电影的特征向量为[0.9, 0]。
下面基于这些特征来构建一个推荐系统算法。 假设采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如 是第一个用户的模型的参数。 于是有:
用户 𝑗 的参数向量
电影 𝑖 的特征向量
对于用户 𝑗 和电影 𝑖,我们预测评分为:
针对用户 𝑗,该线性回归模型的代价函数为预测误差的平方和,加上正则化项:
其中 𝑖: 𝑟(𝑖, 𝑗) 表示只计算那些用户 𝑗 评过分的电影。
在一般的线性回归模型中,误差项和正则项应该都是乘以1/2𝑚,在这里我们将𝑚去掉。
上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
如果要用梯度下降法来求解最优解,计算代价函数的偏导数后得到梯度下降的更新公式为:
协同过滤
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。
但是如果我们既没有用户的参数,也没有电影的特征,只有用户对电影的评分,怎么办?协同过滤算法可以同时学习这两者。
优化目标函数改为同时针对 𝑥 和 𝜃 进行:
对代价函数求偏导数的结果如下:
注:在协同过滤从算法中,通常不使用方差项,如果需要的话,算法会自动学得。
协同过滤算法使用步骤如下:
1. 初始 为一些随机小值
2. 使用梯度下降算法最小化代价函数(同时更新 𝑥 和 𝜃)
3. 在训练完算法后,我们预测 为用户 𝑗 给电影 𝑖 的评分
通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是可以用这些数据作为给用户推荐电影的依据。
例如,如果一位用户正在观看电影 𝑥(𝑖),我们可以寻找另一部电影𝑥(𝑗),依据两部电影的特征向量之间的距离 ∥𝑥(𝑖) - 𝑥(𝑗)∥ 的大小来判断是否要推荐。
向量化:低秩矩阵分解
实现协同过滤算法的预测情况。
我们有五部电影,以及四位用户,那么这个矩阵 𝑌 就是一个 5 行 4 列的矩阵,它将这些电影的用户评分数据都存在矩阵里:
推荐评分:
找到相关影片:
学习得到电影特征 𝑥 后,就可以进行电影之间的距离计算,找到相似的电影给予推荐。
推行工作上的细节:均值归一化
如果我们新增一个用户 Eve,并且 Eve 没有为任何电影评分,那么以什么为依据为 Eve 推荐电影呢?
首先需要对结果 𝑌 矩阵进行均值归一化处理,即将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:
然后利用这个新的 𝑌 矩阵来训练算法,用新训练出的算法来预测评分时,则需要将平均值重新加回去。
预测评分:
对于 Eve,新模型会认为他给每部电影的评分都是该电影的平均分。
基于相似内容推荐和基于相似用户推荐(个人扩展)
以上是基于电影内容(特征)来进行推荐的,我们使用的是线性回归模型,也就是根据电影内容的相似度来推荐。
我们还可以实现基于用户的相似度来进行推荐(聚类算法):
以每个电影评分作为维度值(特征),一个样本数据(对应图中的一点)就是一个用户对所有电影的评分的集合:
根据余弦相似度(cosine similarity),计算两个用户特征向量的相似度:
两个用户的向量夹角 𝜃 越小,说明这两个用户具有较高的相似度。
这里使用的是聚类算法,用电影评分来对用户进行分组后,同一个组内的用户具有较高的相似性。
如果要给一个用户进行推荐,先找出与该用户相似的用户群,推荐用户群中评分较高的电影即可。