本周内容较多,故分为上下两篇文章。 本文为下篇。
下面将以推荐电影为例来介绍推荐系统的实现。
movie | Alice | Bob | Carol | Dave |
---|---|---|---|---|
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 & karate | 0 | 0 | 5 | ? |
上面的分数表示用户对该电影的评分(0~5分,?表示未获得评分数据) 为方便下面叙述,对如下符号进行说明:
上面例子中可以知道 \(n_u=4 \quad n_m=5 \quad y^{(1,1)}=5\)
movie | Alice | Bob | Carol | Dave | x1 | x2 |
---|---|---|---|---|---|---|
Love at last | 5 | 5 | 0 | 0 | 0.9 | 0.1 |
Romance forever | 5 | ? | ? | 0 | 1.0 | 0 |
Cute Puppies of love | ? | 4 | 0 | ? | 0.99 | 0.01 |
nonstop car chases | 0 | 0 | 5 | 4 | 0.1 | 0.9 |
swords & karate | 0 | 0 | 5 | ? | 0 | 1.0 |
由上表可知每部电影都可以用一组特征向量表示:
和线性回归一样,可以得到如下优化目标函数:
\[\min_{θ^{(j)}}\frac{1}{2}\sum_{i;r(i,j)=1}((θ^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + \frac{λ}{2}\sum_{k=1}^n (θ_k^{(j)})^2 \]
\[\min_{θ^{(1)},...,θ^{(n_u)}}\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}((θ^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + \frac{λ}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n (θ_k^{(j)})^2 \]
应用梯度下降:
\[当k=0,θ_k^{(j)}:=θ_k^{(j)}-α\sum_{i:r(i,j)=1}( (θ^{(j)})^Tx^{(i)}-y^{(i,j)} )x_k^{(i)}\] \[当k≠0,θ_k^{(j)}:=θ_k^{(j)}-α\sum_{i:r(i,j)=1}( (θ^{(j)})^Tx^{(i)}-y^{(i,j)} )x_k^{(i)}+λθ_k^{(j)}\]
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。即由θ求出x。
\[\min_{θ^{(1)},...,θ^{(n_m)}}\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}((θ^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + \frac{λ}{2}\sum_{j=1}^{n_m}\sum_{k=1}^n (θ_k^{(j)})^2 \]
注意累计符号的上限由\(n_u\)变成了\(n_m\)
但是如果我们既没有用户的参数也没有电影的特征该怎么办?这时协同过滤就可以起作用了,只需要对优化目标函数进行改进,如下:
\[J(x^{(1)},...,x^{(n_m)},θ^{(1)},...,θ^{(n_u)}) = \frac{1}{2}\sum_{(i,j):r(i,j)=1}((θ^{(j)})^Tx^{(i)}-y^{(i,j)})^2 \\ \quad\quad\quad\quad\quad\quad\quad +\frac{λ}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n (θ_k^{(j)})^2 \\ \quad\quad\quad\quad\quad\quad\quad+ \frac{λ}{2}\sum_{i=1}^{n_m}\sum_{k=1}^n (x_k^{(i)})^2\]
对代价函数求偏导结果如下: \[x_k^{(i)} := x_k^{(i)} - α(\sum_{j:r(i,j)=1}( (θ^{(j)})^Tx^{(i)}-y^{(i,j)} )θ_k^{(j)} +λx_k^{(i)} ) \] \[θ_k^{(j)} := θ_k^{(j)} - α(\sum_{i:r(i,j)=1}( (θ^{(j)})^Tx^{(i)}-y^{(i,j)} )x_k^{(i)} +λθ_k^{(j)} ) \]
协同过滤算法使用步骤如下:
movie | Alice | Bob | Carol | Dave |
---|---|---|---|---|
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 & karate | 0 | 0 | 5 | ? |
(同样的例子)很显然我们可以得到评分矩阵Y \[Y= \left[ \begin{array}{cccc} 5&5&0&0 \\ 5&?&?&0 \\ ?&4&0&? \\ 0&0&5&4 \\ 0&0&5&0 \\ \end{array} \right] \]
推出评分 \[ \begin{pmatrix} (θ^{(1)})^T(x^{(1)}) &(θ^{(2)})^T(x^{(1)})& \cdots & (θ^{(n_u)})^T(x^{(1)}) \\ (θ^{(1)})^T(x^{(2)}) &(θ^{(2)})^T(x^{(2)})& \cdots & (θ^{(n_u)})^T(x^{(2)}) \\ \vdots & \vdots& \ddots & \vdots \\ (θ^{(1)})^T(x^{(n_m)}) &(θ^{(2)})^T(x^{(n_m)})& \cdots & (θ^{(n_u)})^T(x^{(n_m)}) \\ \end{pmatrix} \]
如何寻找与电影i相关的电影j呢?满足\(||x^{(i)}-x^{(j)}||\)较小的前几部影片即可。
假如增加了一个用户marsggbo,他很单纯,这5部电影都还没看过,所以没有评分数据,这是可以通过均值正则化来初始化数据,具体实现如下:
movie | Alice | Bob | Carol | Dave | Marsggbo |
---|---|---|---|---|---|
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 & karate | 0 | 0 | 5 | ? | ? |
此时的评分矩阵为 \[Y= \left[ \begin{array}{cccc} 5&5&0&0&? \\ 5&?&?&0&? \\ ?&4&0&?&? \\ 0&0&5&4&? \\ 0&0&5&0&? \\ \end{array} \right] \]
首先求出每行的均值(未评分不用计算) \[μ=\left[ \begin{array} 2.5 \\ 2.5 \\ 2 \\ 2.25 \\ 1.25 \end{array} \right]→ Y= \left[ \begin{array}{cccc} 2.5&2.5&-2.5&-2.5&? \\ 2.5&?&?&-2.5&? \\ ?&2&-2&?&? \\ -2.25& -2.25&2.75&1.75&? \\ -1.25&-1.25&3.75&-1.25&? \\ \end{array} \right] \]
预测值为\((θ^{(j)})^T(x^{(i)})+μ_i\),因为优没有评分。所以化目的函数只需要\(min\frac{λ}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n (θ_k^{(j)})^2\),很显然\(θ=\vec0\),所以新增用户评分数据可初始化为均值,即 \[Y= \left[ \begin{array}{cccc} 5&5&0&0&2.5 \\ 5&?&?&0&2.5 \\ ?&4&0&?&2 \\ 0&0&5&4&2.25 \\ 0&0&5&0&1.25 \\ \end{array} \right] \]