机器学习—推荐系统

推荐系统

上期内容

异常检测

问题举例

  假设我们有5部电影和4个用户,我们要求用户为电影打分,得到:

movie A B C D
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 ?

可以看出,A、B两人更倾向于前三部那种爱情片,C、D两人更倾向于后两部动作片。
  为了方便接下来对于算法的介绍,这里引入一些符号:
   n u n_u nu​代表用户数量;
   n m n_m nm​代表电影数量;
   r ( i , j ) = 1 r(i,j)=1 r(i,j)=1时表示用户 j j j给电影 i i i评过分;
   y ( i , j ) y^{(i,j)} y(i,j)代表用户 j j j给电影 i i i的评分;
   m j m_j mj​代表用户 j j j评过分的电影数;

基于内容的推荐系统

movie A B C D x1 x2
Love at last 5 5 0 0 0.9 0
Romance forever 5 ? ? 0 1.0 0.01
Cute puppies of love ? 4 0 ? 0.99 0
Nonstop car chases 0 0 5 4 0.1 1.0
Swords vs. karate 0 0 5 ? 0 0.9

其中, x 1 x_1 x1​、 x 2 x_2 x2​代表电影的两个特征,分别是:romance和action。

基于电影特征推荐

  我们用 θ j \theta_j θj​表示用户 j j j的参数向量; x ( i ) x^{(i)} x(i)表示电影 i i i的特征向量;对于用户 j j j和电影 i i i,我们预测评分为 ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i)。针对用户 j j j,该线性回归模型的代价函数可以表示如下:
m i n θ j   1 2 ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ( θ k ( j ) ) 2 min_{\theta_j}\ \frac12\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}(\theta_k^{(j)})^2 minθj​​ 21​i:r(i,j)=1∑​((θ(j))Tx(i)−y(i,j))2+2λ​(θk(j)​)2
其中, i : r ( i , j ) i:r(i,j) i:r(i,j)表示我们只计算用户 j j j评过分的电影。为了学习所有的用户,我们将所有用户的代价函数求和:
m i n ( θ ( 1 ) , . . . , θ ( n u ) )   1 2 ∑ j = 1 n u ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ∑ j = 1 n u ∑ k = 1 n ( θ k ( j ) ) 2 min_{({\theta^{(1)}},...,\theta^{(n_u)})}\ \frac12\sum^{n_u}_{j=1}\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum^{n_u}_{j=1}\sum^n_{k=1}(\theta_k^{(j)})^2 min(θ(1),...,θ(nu​))​ 21​j=1∑nu​​i:r(i,j)=1∑​((θ(j))Tx(i)−y(i,j))2+2λ​j=1∑nu​​k=1∑n​(θk(j)​)2接下来用梯度下降算法求最优解:
θ k ( j ) : = θ k ( j ) − α ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i )         f o r   k = 0 \theta_k^{(j)}:=\theta_k^{(j)}-\alpha\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_k^{(i)}\ \ \ \ \ \ \ for\ k=0 θk(j)​:=θk(j)​−αi:r(i,j)=1∑​((θ(j))Tx(i)−y(i,j))xk(i)​       for k=0 θ k ( j ) : = θ k ( j ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i ) + λ θ k ( j ) )         f o r   k ≠ 0 \theta_k^{(j)}:=\theta_k^{(j)}-\alpha(\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_k^{(i)}+\lambda\theta_k^{(j)})\ \ \ \ \ \ \ for\ k\neq0 θk(j)​:=θk(j)​−α(i:r(i,j)=1∑​((θ(j))Tx(i)−y(i,j))xk(i)​+λθk(j)​)       for k​=0

基于用户参数推荐

  相反地,当我们拥有用户的参数时,我们可以学习得出电影的特征:
m i n x ( 1 ) , . . . , x ( n m )   1 2 ∑ i = 1 n m ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ∑ i = 1 n m ∑ k = 1 n ( x k ( i ) ) 2 min_{x^{(1)},...,x^{(n_m)}}\ \frac12\sum^{n_m}_{i=1}\sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum^{n_m}_{i=1}\sum^n_{k=1}(x_k^{(i)})^2 minx(1),...,x(nm​)​ 21​i=1∑nm​​j:r(i,j)=1∑​((θ(j))Tx(i)−y(i,j))2+2λ​i=1∑nm​​k=1∑n​(xk(i)​)2

协同过滤

  在搭建一个推荐系统时,如果我们既没有用户参数,也没有电影的特征时,可以通过协同过滤算法来同时学习这两者。代价函数改为:
J ( x ( 1 ) , . . . , x ( n m ) , θ ( 1 ) , . . . , θ ( n u ) ) = 1 2 ∑ ( r : j ) : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ∑ i = 1 n m ∑ k = 1 n ( x k ( i ) ) 2 + λ 2 ∑ j = 1 n u ∑ k = 1 n ( θ k ( j ) ) 2 J(x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta^{(n_u)})=\frac12\sum_{(r:j):r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum^{n_m}_{i=1}\sum^n_{k=1}(x_k^{(i)})^2+\frac{\lambda}{2}\sum^{n_u}_{j=1}\sum^n_{k=1}(\theta_k^{(j)})^2 J(x(1),...,x(nm​),θ(1),...,θ(nu​))=21​(r:j):r(i,j)=1∑​((θ(j))Tx(i)−y(i,j))2+2λ​i=1∑nm​​k=1∑n​(xk(i)​)2+2λ​j=1∑nu​​k=1∑n​(θk(j)​)2对代价函数求偏导,结果如下:
x k ( i ) : = x k ( i ) − α ( ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) θ k ( j ) + λ x k ( i ) ) x_k^{(i)}:=x_k^{(i)}-\alpha(\sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})\theta_k^{(j)}+\lambda x_k^{(i)}) xk(i)​:=xk(i)​−α(j:r(i,j)=1∑​((θ(j))Tx(i)−y(i,j))θk(j)​+λxk(i)​) θ k ( j ) : = θ k ( j ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i ) + λ θ k ( j ) ) \theta_k^{(j)}:=\theta_k^{(j)}-\alpha(\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_k^{(i)}+\lambda\theta_k^{(j)}) θk(j)​:=θk(j)​−α(i:r(i,j)=1∑​((θ(j))Tx(i)−y(i,j))xk(i)​+λθk(j)​)协同过滤算法使用步骤如下:

  1. 初始化 X X X、 Θ \Theta Θ为一些随机小值
  2. 使用梯度下降算法最小化代价函数
  3. 训练完后,使用 ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i)为用户 j j j给电影 i i i评分

均值归一化

  如果我们新增一名新用户E,并且E未曾对任何电影进行评分,那我们的推荐过程可以如下进行:

  1. 对已有用户评分结果进行均值归一化处理
  2. 系统将会认为E对电影的评分是该电影的平均分
  3. 接下来的步骤同上述推荐算法
上一篇:2021-07-11谓词执行


下一篇:ThreadX学习(9)——消息队列