推荐系统

1、概述

推荐系统是现实生活中应用最广泛的积极学习问题,通过对历史数据的分析,把用户感兴趣的商品、服务推荐给用户。

2、基于内容的推荐算法

基于内容的推荐算法,其实就是已知商品的特征,根据特征建立模型,实现推荐系统的方式。
我们以一个案例来介绍推荐算法,这个案例讲贯穿整章内容。

2.1 电影推荐案例

推荐系统
介绍一下上述表格的组成部分:

  • 第一列:代表电影的名称,一共有5个电影。
  • 第二列:分成4个小列,代表每个人对各个电影的评分。问号代表用户没有进行评分。
  • 第三列:电影的特征值,x1x_1代表电影是爱情电影的概率;x2x_2代表是动作电影的概率。

2.2 符号说明

为了描述方便,我们把本章使用到的符号做个定义:

  • nnn_n:用户数量。
  • nmn_m:电影数量。
  • r(i,j)=1:代表用户j对电影i进行了评价。
  • y(i,j):代表用户j对电影i的评分。
  • m(j)m^{(j)}:代表用户j评价的电影数量。
  • θ(j)\theta^{(j)}:用户j的向量参数。
  • x(i)x^{(i)}:电影i的特征向量。
  • nun_u:代表θ\theta的数量。
  • nmn_m:代表特征x的数量。

2.3 基本原理

我们假设用户j对电影i的评分为:(θ(j))TX(i)(\theta^{(j)})^T*X^{(i)}。具体原因,恕我无可奉告。

在已知θ\theta和X的前提下,就能计算每个用户对每个电影的评分了。
这就是基于内容的推荐算法。

θ\theta如何计算呢,请看下节。

2.4 θ\theta的计算

θ\theta 是拟合参数,需要保证预测值与真实值最接近的情况下,求最小值,公式为:

minθj12m(j)i:r(i,j)=1((θj)TX(i)y(i,j))2+λ2m(j)k=1n(θk(j))2min_{\theta_j} :\frac{1}{2m^{(j)}}\sum_{i:r(i,j)=1}((\theta^j)^TX^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2m^{(j)}}\sum_{k=1}^n(\theta_k^{(j)})^2

m(j)m^{(j)}代表用户评价的电影的数量,是一个常量,可以从商户公式中去掉:
minθj12i:r(i,j)=1((θj)TX(i)y(i,j))2+λ2k=1n(θk(j))2min_{\theta_j} :\frac{1}{2}\sum_{i:r(i,j)=1}((\theta^j)^TX^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{k=1}^n(\theta_k^{(j)})^2

求所有的θ\theta值:
J(θ(1),θ(2),θ(3)......θ(nu))=12j=1nui:r(i,j)=1((θj)TX(i)y(i,j))2+λ2j=1nuk=1n(θk(j))2J(\theta^{(1)},\theta^{(2)},\theta^{(3)}......\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
θk(j):=θk(j)α(i:r(i,j)=1((θ(j))TX(i)y(i,j))xk(i))(for 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)+λθk(j))(for 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!=0)

3、协同过滤

上面介绍的是已知特征的情况下,可以推导出θ\theta,从而构建推荐模型。
本节讲的是另外一种情况,假设θ\theta是已知的,特征是未知的,通过θ\theta来自动构建特征的过程,这种方式称为协同过滤。

3.1 前提

前提:每个用户都对数个电影进行了评分,通过观察大量的数据,得到每个电影的特征值,相当于每个用户都在协助改进算法。

3.2 原理

根据之前的定义我们知道用户j对电影i的评分为(θ(j))TX(i)(\theta^{(j)})^TX^{(i)},现在已知θ\theta、评分求解X,则公式为:

minx(i)min_x^{(i)}:12j:r(i,j)=1((θ(j))TX(i)y(i,j))2+λ2k=1n(xk(i))2\frac{1}{2}\sum_{j:r(i,j)=1}((\theta^{(j)})^TX^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{k=1}^n(x_k^{(i)})^2

求解所有的X:
minx(1),x(2)...x(nm)min_{x^{(1)},x^{(2)}...x^{(n_m)}}12i=1nmj:r(i,j)=1((θ(j))TX(i)y(i,j))2+λ2i=1nmk=1n(xk(i))2\frac{1}{2}\sum_{i=1}^{n_m}\sum_{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

3.3 计算步骤

  1. 先取一个随机的θ\theta
  2. 根据上述公式计算出X。
  3. θ\theta进行优化。
  4. 重新计算x

3.4 同时计算θX\theta、 X

有一种同时计算θX\theta X的方式,公式为:
J(x(1),x(2),x(3)...,x(nm),θ(1),θ(2),θ(3)......θ(nu))=12(i,j):r(i,j)=1((θj)TX(i)y(i,j))2+λ2j=1nuk=1n(θk(j))2+λ2i=1nmk=1n(xk(i))2J(x^{(1)},x^{(2)},x^{(3)}...,x^{(n_m)},\theta^{(1)},\theta^{(2)},\theta^{(3)}......\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_{j=1}^{n_u}\sum_{k=1}^n(\theta_k^{(j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^n(x_k^{(i)})^2

注意:该算法中,不包含x0θ0x_0 \theta_0的值。

计算步骤为:

  1. 随机初始化θ x\theta \ x为较小的值。
  2. 使用梯度下降算法优化θ x\theta \ x

θk(j):=θk(j)α(i:r(i,j)=1((θ(j))TX(i)y(i,j))xk(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)} )

xk(i):=xk(i)α(i:r(i,j)=1((θ(j))TX(i)y(i,j))θk(j)+λX(i))x_k^{(i)}:=x_k^{(i)}-\alpha(\sum_{i:r(i,j)=1}((\theta^{(j)})^TX^{(i)}-y^{(i,j)})\theta_k^{(j)}+\lambda{X^{(i)}})

4、矢量化实现

矢量化是一种表示方式的变化。
推荐系统
我们来看一下上面的这张图:

  1. Y:每行代表每个用户对一个电影的评分结果。
  2. Predicted ratings:预测的公式,(θ(j))2x(i)(\theta^{(j)})^2x^{(i)}。用这个来预测Y的值。
  3. 假设X Θ\Theta 为两个矩阵,则Y=XΘTY=X\Theta^T
    这就是矢量化表示方式,也称为“低秩矩阵分解算法”。

5、均值归一化

有些用户从来不对电影进行评分,针对于这种用户,如何进行推送呢?

通过上面的方式,因为r(i,j)!=1,所以该用户对所有电影的评分结果计算出来都是0,这对于推荐系统没有任何意义,而均值归一化是一种解决思路。

均值归一化:就是计算所有用户对电影的评分的平均值,作为该用户的评分返回。
推荐系统

介绍一下上图的元素:

  1. Y:代表用户对电影的评分,可以看出最后一个用户,没有进行任何评分。
  2. μ\mu代表每个电影评分的平均值。
  3. 使用Y减去平均值得到新的Y。
  4. 预测评分的公式为:(θ(j))Tx(i)(\theta^{(j)})^T{x^{(i)}},由于每个y值都减去了平均值,所以公式需要加上平均值:(θ(j))Tx(i)+μi(\theta^{(j)})^T{x^{(i)}} +\mu_i
  5. 所以没有评分的用户的评分:(θ(j))Tx(i)+μi=0+μi=μi(\theta^{(j)})^T{x^{(i)}} +\mu_i=0+\mu_i=\mu_i