假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分。
下面引入一些标记:
- n𝑢 代表用户的数量
- n𝑚 代表电影的数量
- 𝑟(𝑖,𝑗) 如果用户 𝑗 给电影 𝑖 评过分则 𝑟(𝑖,𝑗) = 1
- 𝑦(𝑖,𝑗) 代表用户 𝑗 给电影 𝑖 的评分
- m𝑗代表用户 𝑗 评过分的电影的总数、
前三部电影是爱情片,后两部则是动作片,我们可以看出 Alice 和 Bob 似乎更倾向与爱情片,而 Carol 和 Dave 似乎更倾向与动作片。并且没有一个用户给所有的电影都打过分。我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据。
算法——基于内容的推荐系统
在一个基于内容的推荐系统算法中,我们假设对于我们希望推荐的东西有一些数据,这些数据是有关这些东西的特征。
在我们的例子中,我们可以假设每部电影都有两个特征,如𝑥1代表电影的浪漫程度,𝑥2代表电影的动作程度。
则每部电影都有一个特征向量,如𝑥⁽ ¹ ⁾是第一部电影的特征向量为[1 0.9 0]。(1为特征x0的值)
下面我们要基于这些特征来构建一个推荐系统算法。
假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型𝜃(j)∈R3(三维向量,特征项数+1,1为x0),如𝜃(1)是第一个用户的模型的参数。 于是有:
- 𝜃(𝑗)用户 𝑗 的参数向量
- 𝑥(𝑖)电影 𝑖 的特征向量
- 对于用户 𝑗 和电影 𝑖,我们预测评分为:(𝜃⁽ ʲ ⁾)ᵀ𝑥⁽𝑖⁾
那么如何求用户参数呢?——代价函数
针对用户 𝑗的参数𝜃⁽ ʲ ⁾,该线性回归模型的代价为预测误差的平方和,加上正则化项:
其中 𝑖: 𝑟(𝑖,𝑗)表示我们只计算那些用户 𝑗 评过分的电影。在一般的线性回归模型中,误差项和正则项应该都是乘以1/2𝑚,在这里我们将𝑚去掉,因为m不会影响我们求解最小值。并且我们不对方差项𝜃0进行正则化处理。
上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
如果我们要用梯度下降法来求解最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为:
因为我们假设变量是已有的,即不同电影的各个特征。所以叫做基于内容的推荐。
协同过滤
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。
相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。
已知y、x求用户参数𝜃:
已知y、𝜃求特征向量x:
协同过滤算法是指当你执行算法时,观察大量用户,观察这些用户的实际行为,来协同地得到更佳的每个人对电影的评分值。
用户参数能帮助算法更好地进行特征学习。
协同过滤算法可以同时学习这两者。我们的优化目标便改为同时针对𝑥和𝜃进行。
对代价函数求偏导数的结果如下:
注:在协同过滤算法算法中x∈Rn、𝜃∈Rn,不将x0、𝜃0代入。
协同过滤算法使用步骤如下:
- 初始 𝑥(1), 𝑥(1), . . . 𝑥(𝑛𝑚), 𝜃(1), 𝜃(2), . . . , 𝜃(𝑛𝑢)为一些随机值
- 使用梯度下降算法最小化代价函数
- 在训练完算法后,如果用户 𝑗 尚未给电影 𝑖 评分,我们通过**(𝜃⁽ ʲ ⁾)ᵀ𝑥⁽ 𝑖 ⁾**预测用户 𝑗 给电影 𝑖 的评分
低秩矩阵分解
对协同过滤算法进行向量化。
我们有五部电影,以及四位用户,那么 这个矩阵 𝑌 就是一个 5 行 4 列的矩阵,它将这些电影的用户评分数据都存在矩阵里:
得到预测评分矩阵:
将这个矩阵向量化表示:
所以预测矩阵可以表示成:XΘᵀ
通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是我们可以用这些数据作为给用户推荐电的依据。例如,如果一位用户正在观看电影 𝑥(𝑖),我们可以寻找另一部电影𝑥(𝑗),依据两部电影的特征向量之间的距离∥𝑥(𝑖) − 𝑥(𝑗)∥的大小。
均值归一化
如果我们新增一个用户 Eve,并且 Eve 没有为任何电影评分,那么我们以什么为依据为 Eve 推荐电影呢?
我们首先需要对结果 𝑌矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:
然后我们利用这个新的 𝑌 矩阵来训练算法,新矩阵的每一行的均值都是0。
对新的矩阵使用协同过滤算法,用新训练出的算法来预测评分时,需要将平均值重新加回去,预测**(𝜃⁽ ʲ ⁾)ᵀ𝑥⁽ 𝑖 ⁾ + 𝜇ᵢ**。
对于 Eve,我们的新模型根据(𝜃⁽ 5 ⁾)ᵀ𝑥⁽ 𝑖 ⁾ + 𝜇ᵢ,认为她给每部电影的评分都是该电影的平均分𝜇ᵢ,因为𝜃⁽ 5 ⁾为零向量。
均值归一化是协同过滤的预处理。