机器学习:推荐算法(基于内容的推荐算法与协同过滤)

基于内容的推荐算法

这个问题的假设是,我们知道我们推荐的内容有若干特征值 x ( i ) x^{(i)} x(i),且我们也同时知道用户对一些内容的喜欢程度 y ( i ) y^{(i)} y(i),我们要做的就是预测用户对他/她没有看过的内容的喜欢程度。所以对于单个用户这就是个线性回归问题,对于用户群体这就是多个线性回归问题叠加。

假设用户数为 n u n_u nu,内容数 n m n_m nm,当用户看过该内容时 r ( i , j ) = 1 r(i,j)=1 r(i,j)=1 y ( i , j ) y^{(i,j)} y(i,j)表示用户 j j j对内容 i i i的喜爱程度, θ ( j ) \theta^{(j)} θ(j) j j j用户的参数向量, x ( i ) x^{(i)} x(i) i i i电影的特征值向量。则对单个用户来说,我们要最小化的代价函数就是
1 2 ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ∑ k = 1 n ( θ k ( j ) ) 2 \frac{1}{2}\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\sum_{k=1}^n(\theta_k^{(j)})^2 21i:r(i,j)=1((θ(j))Tx(i)y(i,j))2+2λk=1n(θk(j))2
对于用户群体就是再累加一层:
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 \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 21j=1nui:r(i,j)=1((θ(j))Tx(i)y(i,j))2+2λj=1nuk=1n(θk(j))2
而梯度则是
∂ ∂ θ k ( j ) J ( θ ( 1 ) , ⋯   , θ ( n u ) ) = { ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i ) , k = 0 ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i ) + λ θ k ( j ) , k ≠ 0 \frac{\partial}{\partial \theta_k^{(j)}}J(\theta^{(1)},\cdots,\theta^{(n_u)})=\left\{ \begin{aligned} &\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)x_k^{(i)}&&,k=0 \\ &\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)x_k^{(i)}+\lambda\theta_k^{(j)}&&,k\not=0 \end{aligned}\right. θk(j)J(θ(1),,θ(nu))=i:r(i,j)=1((θ(j))Tx(i)y(i,j))xk(i)i:r(i,j)=1((θ(j))Tx(i)y(i,j))xk(i)+λθk(j),k=0,k=0
跟线性回归约等于同一个算法。

协同过滤

通常而言,内容的特征值向量并不是那么好得到,尤其是得到一系列具体的数字。如果用户的喜好更容易调查出一点,我们反而可以靠用户的喜好来求解内容的特征值。所以,假设我们已知 y ( i , j ) y^{(i,j)} y(i,j) θ ( j ) \theta^{(j)} θ(j),不知道 x ( i ) x^{(i)} x(i),问题就变成寻找最可能的 x ( i ) x^{(i)} x(i)值使得 ( θ ( j ) ) T x ( i ) = y ( i , j ) (\theta^{(j)})^Tx^{(i)}=y^{(i,j)} (θ(j))Tx(i)=y(i,j),相当于参数与特征值的地位交换了,变成已知参数求特征值。所以代价函数变为
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 \frac{1}{2}\sum_{i=1}^{n_m}\sum_{j:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^n(x_k^{(i)})^2 21i=1nmj:r(i,j)=1((θ(j))Tx(i)y(i,j))2+2λi=1nmk=1n(xk(i))2
梯度变为
{ ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) θ k ( j ) , k = 0 ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) θ k ( j ) + λ x k ( i ) , k ≠ 0 \left\{ \begin{aligned} &\sum_{j:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)\theta_k^{(j)}&&,k=0 \\ &\sum_{j:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)\theta_k^{(j)}+\lambda x_k^{(i)}&&,k\not=0 \end{aligned}\right. j:r(i,j)=1((θ(j))Tx(i)y(i,j))θk(j)j:r(i,j)=1((θ(j))Tx(i)y(i,j))θk(j)+λxk(i),k=0,k=0
这样我们就有了已知 θ \theta θ x x x的手段,结合基于内容的推荐算法,我们就可以依靠 θ \theta θ推导 x x x,再通过 x x x修正 θ \theta θ……如此循环就能得到一个合理的推送结果。这实际上是借助用户的行为对内容进行评估,而评估的内容又能使得推送更加精确,集合每位用户的数据来优化推送,所以这个算法称之为协同过滤。

不过,我们实际上没必要循环地计算 θ \theta θ x x x,我们可以同时计算他们俩,让我们合并两个代价函数,得到
1 2 ∑ ( i , j ) : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) 2 + λ 2 ∑ j = 1 n u ∑ k = 1 n ( θ k ( j ) ) 2 + λ 2 ∑ i = 1 n m ∑ k = 1 n ( x k ( i ) ) 2 \frac{1}{2}\sum_{(i,j):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+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^n(x_k^{(i)})^2 21(i,j):r(i,j)=1((θ(j))Tx(i)y(i,j))2+2λj=1nuk=1n(θk(j))2+2λi=1nmk=1n(xk(i))2
同时我们不再定义截距 θ 0 \theta_0 θ0,相应地 x 0 x_0 x0也失去了意义,因为我们要同时优化这两个值,不需要使其恒等于一个值。

新的梯度为
∂ ∂ θ k ( j ) J ( θ ( 1 ) , ⋯   , θ ( n u ) , x ( 1 ) , ⋯   , x ( n m ) ) = ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) x k ( i ) + λ θ k ( j ) ∂ ∂ x k ( i ) J ( θ ( 1 ) , ⋯   , θ ( n u ) , x ( 1 ) , ⋯   , x ( n m ) ) = ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) θ k ( j ) + λ x k ( i ) \begin{aligned} &\frac{\partial}{\partial \theta_k^{(j)}}J(\theta^{(1)},\cdots,\theta^{(n_u)},x^{(1)},\cdots,x^{(n_m)})=\sum_{i:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)x_k^{(i)}+\lambda\theta_k^{(j)}\\ &\frac{\partial}{\partial x_k^{(i)}}J(\theta^{(1)},\cdots,\theta^{(n_u)},x^{(1)},\cdots,x^{(n_m)})=\sum_{j:r(i,j)=1}\left((\theta^{(j)})^Tx^{(i)}-y^{(i,j)}\right)\theta_k^{(j)}+\lambda x_k^{(i)} \end{aligned} θk(j)J(θ(1),,θ(nu),x(1),,x(nm))=i:r(i,j)=1((θ(j))Tx(i)y(i,j))xk(i)+λθk(j)xk(i)J(θ(1),,θ(nu),x(1),,x(nm))=j:r(i,j)=1((θ(j))Tx(i)y(i,j))θk(j)+λxk(i)
一般,我们对 θ \theta θ x x x进行随机初始化,这步跟神经网络比较相似,避免一些对称化的情况出现。

这样我们就得到了完整的协同过滤算法,已知量只有用户对内容的喜好程度 y ( i , j ) y^{(i,j)} y(i,j),这也更接近现实中的情况。

要向量化协同过滤,可以令
X = [ − ( x ( 1 ) ) T − − ( x ( 2 ) ) T − ⋮ − ( x ( n m ) ) T − ] , Θ = [ − ( θ ( 1 ) ) T − − ( θ ( 2 ) ) T − ⋮ − ( θ ( n u ) ) T − ] X=\left[\begin{matrix} -(x^{(1)})^T-\\ -(x^{(2)})^T-\\ \vdots\\ -(x^{(n_m)})^T-\\ \end{matrix}\right], \Theta=\left[\begin{matrix} -(\theta^{(1)})^T-\\ -(\theta^{(2)})^T-\\ \vdots\\ -(\theta^{(n_u)})^T-\\ \end{matrix}\right] X=(x(1))T(x(2))T(x(nm))T,Θ=(θ(1))T(θ(2))T(θ(nu))T
那么我们的预测值矩阵就可写作
H θ = X Θ T H_\theta=X\Theta^T Hθ=XΘT

相似推荐

得到内容的特征值向量 x ( i ) x^{(i)} x(i)后,要推荐相似内容就很简单了,我们只需要寻找两个特征值向量比较接近,如 ∣ ∣ x ( i ) − x ( j ) ∣ ∣ ||x^{(i)}-x^{(j)}|| x(i)x(j)较小的内容。

均值归一化

均值归一化对于我们完全不知道其喜好的用户比较有用,对于一个我们完全不知道喜好的用户,他/她的 r ( i , j ) r(i,j) r(i,j)全都是0,因此代价函数里只剩两个正则项,而 x x x的正则项由我们掌握的内容信息决定,影响最大的就是 θ \theta θ的正则项。所以,为了最小化代价函数,算法会将该用户的喜好参数 θ \theta θ全部设定为0,由此我们预测的喜好程度 θ T x \theta^Tx θTx也会是0,这样我们得到的结果就是该用户对任何内容都特别不喜欢,让推荐算法束手无策。

但如果我们应用了均值归一化( y : = y − μ σ y:=\frac{y-\mu}{\sigma} y:=σyμ),所有喜好程度 y y y被均值归一化后均值都变成0,这样即使我们预测出的喜好程度都是0,再复原均值归一化( y : = y × σ + μ y:=y\times\sigma+\mu y:=y×σ+μ)的时候,预测值就会变成 μ \mu μ,即所有用户喜好的平均值,这对于一个我们完全不知道喜好的用户来说就是合理的了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值