机器学习之推荐系统

推荐系统是最重要的机器学习的应用之一。

我们从电影打分系统来进入推荐系统的学习。

假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分。

img

前三部电影是爱情片,后两部则是动作片,我们可以看出AliceBob似乎更倾向与爱情片, 而 CarolDave 似乎更倾向与动作片。并且没有一个用户给所有的电影都打过分。我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据。

下面引入一些标记:

$n_u$ 代表用户的数量

$n_m$ 代表电影的数量

$r(i, j)$ 如果用户j给电影 $i$ 评过分则 $r(i,j)=1$

$y^{(i, j)}$ 代表用户 $j$ 给电影$i$的评分

$m_j$代表用户 $j$ 评过分的电影的总数

基于内容的推荐系统

我们假设每部电影都有两个特征,如$x_1$代表电影的浪漫程度,$x_2$ 代表电影的动作程度。
img

则每部电影都有一个特征向量,如$x^{(1)}$是第一部电影的特征向量为[0.9 0]。

下面我们要基于这些特征来构建一个推荐系统算法。
假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如$\theta^{(1)}$是第一个用户的模型的参数。
于是,我们有:

$\theta^{(j)}$用户$j$的参数向量

$x^{(i)}$电影$i$的特征向量

对于用户$j$和电影$i$,我们预测评分为:$(\theta^{(j)})^T x^{(i)}$

代价函数

针对用户$j$,该线性回归模型的代价为预测误差的平方和,加上正则化项:
$$
\min_{\theta (j)}\frac{1}{2}\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\left(\theta_{k}^{(j)}\right)^2
$$

其中 $i:r(i,j)$表示我们只计算那些用户 $j$ 评过分的电影。在一般的线性回归模型中,误差项和正则项应该都是乘以$1/2m$,在这里我们将$m$去掉。并且我们不对方差项$\theta_0$进行正则化处理。

上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
$$
\min_{\theta^{(1)},…,\theta^{(n_u)}} \frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2
$$
如果我们要用梯度下降法来求解最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为:

$$
\theta_k^{(j)}:=\theta_k^{(j)}-\alpha\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_k^{(i)} \quad (\text{for} , k = 0)
$$

$$
\theta_k^{(j)}:=\theta_k^{(j)}-\alpha\left(\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_k^{(i)}+\lambda\theta_k^{(j)}\right) \quad (\text{for} , k\neq 0)
$$

协同过滤:

这两

我们的优化目标便改为同时针对$x$和$\theta$进行。
$$
J(x^{(1)},…x^{(n_m)},\theta^{(1)},…,\theta^{(n_u)})=\frac{1}{2}\sum_{(i:j):r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}(x_k^{(j)})^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2
$$

对代价函数求偏导数的结果如下:

$$
x_k^{(i)}:=x_k^{(i)}-\alpha\left(\sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\theta_k^{j}+\lambda x_k^{(i)}\right)
$$

$$
\theta_k^{(i)}:=\theta_k^{(i)}-\alpha\left(\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}x_k^{(i)}+\lambda \theta_k^{(j)}\right)
$$

注:在协同过滤从算法中,我们通常不使用方差项,如果需要的话,算法会自动学得。
协同过滤算法使用步骤如下:

  1. 初始 $x^{(1)},x^{(1)},…x^{(nm)},\ \theta^{(1)},\theta^{(2)},…,\theta^{(n_u)}$为一些随机小值

  2. 使用梯度下降算法最小化代价函数

  3. 在训练完算法后,我们预测$(\theta^{(j)})^Tx^{(i)}$为用户 $j$ 给电影 $i$ 的评分

协同过滤优化目标:

给定$x^{(1)},…,x^{(n_m)}$,估计$\theta^{(1)},…,\theta^{(n_u)}$:
$$
\min_{\theta^{(1)},…,\theta^{(n_u)}}\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2
$$

给定$\theta^{(1)},…,\theta^{(n_u)}$,估计$x^{(1)},…,x^{(n_m)}$:

同时最小化$x^{(1)},…,x^{(n_m)}$和$\theta^{(1)},…,\theta^{(n_u)}$:
$$
J(x^{(1)},…,x^{(n_m)},\theta^{(1)},…,\theta^{(n_u)})=\frac{1}{2}\sum_{(i,j):r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}(x_k^{(i)})^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}(\theta_k^{(j)})^2
$$

$$
\min_{x^{(1)},…,x^{(n_m)} \\ \theta^{(1)},…,\theta^{(n_u)}}J(x^{(1)},…,x^{(n_m)},\theta^{(1)},…,\theta^{(n_u)})
$$

协同过滤算法的向量化实现

我们有关于五部电影的数据集,我将要做的是,将这些用户的电影评分,进行分组并存到一个矩阵中。

我们有五部电影,以及四位用户,那么 这个矩阵 $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 ?

推出评分:

img

找到相关影片:

img

现在既然你已经对特征参数向量进行了学习,那么我们就会有一个很方便的方法来度量两部电影之间的相似性。例如说:电影 $i$ 有一个特征向量$x^{(i)}$,你是否能找到一部不同的电影 $j$,保证两部电影的特征向量之间的距离$x^{(i)}$和$x^{(j)}$很小,那就能很有力地表明电影$i$和电影 $j$ 在某种程度上有相似,至少在某种意义上,某些人喜欢电影 $i$,或许更有可能也对电影 $j$ 感兴趣。总结一下,当用户在看某部电影 $i$ 的时候,如果你想找5部与电影非常相似的电影,为了能给用户推荐5部新电影,你需要做的是找出电影 $j$,在这些不同的电影中与我们要找的电影 $i$ 的距离最小,这样你就能给你的用户推荐几部不同的电影了。

均值归一化

让我们来看下面的用户评分数据:

img

如果我们新增一个用户 Eve,并且 Eve 没有为任何电影评分,那么我们以什么为依据为Eve推荐电影呢?

我们首先需要对结果 $Y $矩阵进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:

img

然后我们利用这个新的 $Y$ 矩阵来训练算法。
如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测$(\theta^{(j)})^T x^{(i)}+\mu_i$,对于Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。


机器学习之推荐系统
https://lijianxiong.work/2021/20210716/
作者
LJX
发布于
2021年7月16日
许可协议