Recommender Systems(推荐系统)

前言

     这一章内容还是紧接着上一章内容,在上一章我给大家介绍了异常检测系统,在这一章将给大家介绍另一个在生活中常会涉及到的推荐系统。例如当你在用淘宝购物时,有没有发现每次首页推荐的商品都是和你前几次搜索过的商品相关,这就是推荐系统根据你每次搜索的爱好,然后相应地推荐你可能喜欢的商品。在这一章,我将详细地给大家介绍这类学习系统是怎样实现的。

     最后,如果有理解不对的地方,希望大家不吝赐教,谢谢!

第十四章 Recommender Systems(推荐系统)

14.1 把问题公式化

      我们以一个电影打分的例子来向大家介绍这个问题,在看完电影后,会出现一个打分环节,我们设分数为0~5分,系统会根据你打的分,然后猜测出其他你没有看过的电影你会打的分数,根据这来推荐给你可能喜欢的其他电影。如图1所示,我们得到了这样的数据,我们用n_{u}来表示用户的数目,在这里n_{u}=4,我们用n_{m}来表示电影的数目,在这里n_{m}=5,还有r(i,j)=1表示如果用户j对电影i进行了评分,那么让r(i,j)=1,用y^{(i,j)}来表示用户j对电影i打的分数(注意必须是进行了评分的,才会有y^{(i,j)},即r(i,j)=1)。我们会发现前三个电影都是爱情片,后面两个都是动作片,对于用户Alice和Bob,我们会发现他们对爱情片的评分比较高,而动作片都是0分,所以大致可以推测他们比较喜欢爱情片,所以对于他们还没有看的另外一部爱情片,我们大致可以猜测评分应该也是5分或者4分这样比较高的分数,而对于用户Carol和Dave正好相反,我们发现他们对动作片比较感兴趣,所以对于他们还没有看的那部爱情片,我们可以猜测评分应该是0分或者1分这样比较低的分,其实我们推荐系统做的就是这个工作,根据已知的数据推测未知的数据,然后相应地推荐电影给用户。

                                                                                  图1 电影打分的情况

14.2 基于内容推荐

      在前面,大致给大家讲解了推荐系统做的一个怎样的工作,在这一节将详细地给大家讲解整个系统是如何运作的。对于图1的电影打分情况,在前面也给大家说明了,这5部电影大致分为两类电影,爱情片和动作片,我们可以用x^{(i)}来表示每部电影的特征,比如第一部电影x^{(1)}=\begin{bmatrix} 0.9\\0 \end{bmatrix}表示这部电影的爱情指数有0.9,动作指数为0,我们也会写成这样x^{(1)}=\begin{bmatrix} 1\\ 0.9 \\ 0 \end{bmatrix},同样x_{0}=1,用\theta ^{(j)}来表示每个用户的学习系数,比如第一个用户的\theta ^{(1)}=\begin{bmatrix} 0\\ 5 \\ 0 \end{bmatrix},假设第三部电影特征x^{(3)}=\begin{bmatrix} 1\\ 0.99 \\ 0 \end{bmatrix},所以对于第一个用户Alice的那部没有看过的电影估计分数为(\theta ^{(1)})^{\top }x^{(3)}=5\times 0.99=4.95,就是这样来得到每个没有评分电影的大概分数。

      下面我们把整个系统进行总结:

1.r(i,j)=1 表示用户j对电影i进行了评分

2.y^{(i,j)}表示用户j对电影i打的分数(r(i,j)==1)

3.\theta ^{(j)}表示每个用户j的学习系数

4.x^{(i)}表示每部电影的特征系数

对于用户j对电影i评分,我们进行预测分数为(\theta ^{(j)})^{\top }x^{(i)}

5.m^{(j)}来表示用户j对电影已经打分了的电影数目

所以我们的目标就是:

当学习\theta ^{(j)}\underset{\theta ^{(j)}}{min}\underset{i:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})^{2}+\frac{\lambda }{2}\sum_{k=1}^{n}(\theta _{k}^{(j)})^2

当学习\theta ^{(1)},\theta ^{(2)},...,\theta ^{(n_{u})}\underset{\theta ^{(1)},\theta ^{(2)},...,\theta ^{(n_{u})}}{min}\frac{1}{2}\sum_{j=1}^{n_{u}}\underset{i:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})^2+\frac{\lambda }{2}\sum_{j=1}^{n_{u}}\sum_{k=1}^{n}(\theta_{k} ^{(j)})^2

梯度下降法更新:

\theta _{k}^{(j)}:=\theta _{k}^{(j)}-\alpha \underset{i:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})x_{k}^{(i)}(for k=0)

\theta _{k}^{(j)}:=\theta _{k}^{(j)}-\alpha (\underset{i:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})x_{k}^{(i)}+\lambda \theta _{k}^{(j)})(for k\neq0)

     对于以上我们是根据已知每个电影的特征x^{(i)},再进行学习得到\theta ^{(j)},如图2所示,我们有了每个电影的特征,但是关于每部电影的特征指数,我们需要通过大量用户的评价才能得到,而且可能每个的人感受不同,所以这个电影的特征值不是很好确定的,所以如果我们不知道每部电影的特征指数,而我们有每个用户的学习参数\theta ^{(j)},假设我们得到了\theta ^{(1)}=\begin{bmatrix} 0\\5 \\ 0 \end{bmatrix},\theta ^{(2)}=\begin{bmatrix} 0\\5 \\ 0 \end{bmatrix},\theta ^{(3)}=\begin{bmatrix} 0\\0 \\ 5 \end{bmatrix},\theta ^{(4)}=\begin{bmatrix} 0\\0 \\ 5 \end{bmatrix},所以我们会有(\theta ^{(1)})^{\top }x^{(1)}\approx 5,(\theta ^{(2)})^{\top }x^{(1)}\approx 5,(\theta ^{(3)})^{\top }x^{(1)}\approx 0,(\theta ^{(4)})^{\top }x^{(1)}\approx 0,由此我们可以得到第一部电影的x1=1.0,x2=0.0,所以x^{(1)}=\begin{bmatrix} 1\\1.0 \\ 0.0 \end{bmatrix},这样在给定\theta ^{(1)},\theta ^{(2)},...,\theta ^{(n_{u})}时,当我们去学习x^{(i)}时,我们的目标是\underset{x^{(i)}}{min}\underset{j:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})^{2}+\frac{\lambda }{2}\sum_{k=1}^{n}(x_{k}^{(j)})^2,当我们学习x^{(1)},x^{(2)},...,x^{(n_{m})}时,我们的目标是\underset{x^{(1)},x ^{(2)},...,x ^{(n_{m})}}{min}\frac{1}{2}\sum_{i=1}^{n_{m}}\underset{j:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})^2+\frac{\lambda }{2}\sum_{i=1}^{n_{m}}\sum_{k=1}^{n}(x_{k} ^{(j)})^2,所以整个过程就成了当给定\theta时,我们可以学习到x,又可以通过x学习到新的\theta,这样反复下去,可以得到最后的\theta和x。

                                                                            图2 关于每部电影的特征指数

14.3 协同过滤算法

      在前面也给大家介绍了,怎样根据\theta学习得到x,怎样根据x学习得到\theta,他们的目标函数分别是:\underset{x^{(1)},x ^{(2)},...,x ^{(n_{m})}}{min}\frac{1}{2}\sum_{i=1}^{n_{m}}\underset{j:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})^2+\frac{\lambda }{2}\sum_{i=1}^{n_{m}}\sum_{k=1}^{n}(x_{k} ^{(j)})^2\underset{\theta ^{(1)},\theta ^{(2)},...,\theta ^{(n_{u})}}{min}\frac{1}{2}\sum_{j=1}^{n_{u}}\underset{i:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})^2+\frac{\lambda }{2}\sum_{j=1}^{n_{u}}\sum_{k=1}^{n}(\theta_{k} ^{(j)})^2,那么我们可不可以将两者合为一了?当然是可以的,最终的结果是:J(\theta ^{(1)},...,\theta ^{(n_{u})},x^{(1)},...,x^{(n_{m})})=\frac{1}{2}\underset{(i,j):r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(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}^{(i)})^2\underset{\theta ^{(1)},...,\theta ^{(n_{u})},x^{(1)},...,x^{(n_{m})}}{min}J(\theta ^{(1)},...,\theta ^{(n_{u})},x^{(1)},...,x^{(n_{m})}),这样就不用反复去计算\theta和x了,这也是我们要讲的协同过滤算法的核心。

     下面就给大家总结下协同过滤算法的整个过程:

1.初始化\theta ^{(1)},\theta ^{(2)},...,\theta ^{(n_{u})}x^{(1)},x^{(2)},...,x^{(n_{m})}为很小的随机数,这个和之前神经网络中初始化权重因素\Theta一样。

2.最小化\underset{\theta ^{(1)},...,\theta ^{(n_{u})},x^{(1)},...,x^{(n_{m})}}{min}J(\theta ^{(1)},...,\theta ^{(n_{u})},x^{(1)},...,x^{(n_{m})})使用梯度下降法,对于每一个j=1,2,...,n_{u},i=1,2,...,n_{m}更新x_{k}^{(j)}:=x_{k}^{(j)}-\alpha (\underset{j:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})\theta _{k}^{(j)}+\lambda x_{k}^{(i)})\theta _{k}^{(j)}:=\theta _{k}^{(j)}-\alpha (\underset{i:r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(i)}-y^{(i,j)})x_{k}^{(i)}+\lambda \theta _{k}^{(j)})

3.用\theta ^{\top }x来进行预测分数。

14.4 向量化:低秩矩阵分解

     对于图1的数据,我们可以用一个矩阵来表示Y=\begin{bmatrix} 5 &5 &0 &0 \\5 & ? & ? &0 \\ ? & 4 &0 &? \\ 0 & 0 &5 &4 \\ 0 &0 &5 &0 \end{bmatrix},预测对应的每一个值我们也用一个矩阵表示\begin{bmatrix} (\theta ^{(1)})^{\top }(x^{(1)}) &(\theta ^{(2)})^{\top }(x^{(1)}) & ...&(\theta ^{(n_{u})})^{\top }(x^{(1)}) \\ (\theta ^{(1)})^{\top }(x^{(2)}) & (\theta ^{(2)})^{\top }(x^{(2)}) &...&(\theta ^{(n_{u})})^{\top }(x^{(2)}) \\ ...& ... & ...&... \\ (\theta ^{(1)})^{\top }(x^{(n_{m})}) & (\theta ^{(2)})^{\top }(x^{(n_{m})}) &... & (\theta ^{(n_{u})})^{\top }(x^{(n_{m})}) \end{bmatrix},而我们的X=\begin{bmatrix} (x^{(1)})^{\top }\\ (x^{(2)})^{\top } \\ ... \\ (x^{(n_{m})})^{\top } \end{bmatrix}\Theta =\begin{bmatrix} (\theta ^{(1)})^{\top }\\ (\theta ^{(2)})^{\top } \\ ... \\ (\theta ^{(n_{u})})^{\top } \end{bmatrix},这就是低秩分解,大家不懂的也可以不用理解,对于线性代数比较好的可以了解下。

       在前面也给大家提到过,推荐系统可以根据你的爱好推荐给你电影,那么怎样找到相关的电影了?对于每一部电影i,我们都需要通过学习去得到它的特征x^{(i)}\in R^{n},然后通过计算\left \| x^{(i)}-x^{(j)} \right \|,当两者最小时,即找到了和电影i相似的电影j。

14.5 细节的落实:均值归一化

      对于前面我们给出了数据矩阵Y,有时候会出现一种情况就是对于这5部电影,有的用户一部都没有看过,假设用户Eve一部电影也没看过,则Y=\begin{bmatrix} 5 &5 &0 &? \\5 & ? & ? &? \\ ? & 4 &0 &? \\ 0 & 0 &5 &? \\ 0 &0 &5 &? \end{bmatrix},对于\underset{(\theta ^{(1)},...,\theta ^{(n_{u})},x^{(1)},...,x^{(n_{m})})}{min}\frac{1}{2}\underset{(i,j):r(i,j)=1}{\sum }((\theta ^{(j)})^{\top }x^{(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}^{(i)})^2,前面一项没啥影响,而最后一项就是\frac{\lambda }{2}[(\theta _{1}^{(5)})^2+(\theta _{2}^{(5)})^2](n=2),所以使式子结果最小会得到\theta ^{(5)}=\begin{bmatrix} 0\\0 \end{bmatrix},我们根据(\theta ^{(5)})^{\top }x^{(i)}=0,就会得到最初的评分都为0,后面再更新时就会使得每个评分总是相等的,这就不符合我们想要的结果,所以我们对此进行的改进就是先得到每部电影的均值\mu =\begin{bmatrix} 2.5\\2.5 \\ 2 \\ 2.25 \\ 1.25 \end{bmatrix},然后再进行预测时通过(\theta ^{(j)})^{\top }x^{(i)}+\mu _{i},这样对于用户Eve,我们初始化得到的数据就是\begin{bmatrix} 2.5\\2.5 \\ 2 \\ 2.25 \\ 1.25 \end{bmatrix},这样再更新时就会避免发生那个问题了,这就是均值归一化。

猜你喜欢

转载自blog.csdn.net/qq_36417014/article/details/84642719