16 推荐系统

随声附和 提交于 2019-11-29 01:38:05

16 推荐系统

16.1 问题形式化

nu=no.users,用户数量
nm=no.movies,电影数量

r(i,j)=1 if user j has rated movie i
y(i,j)=rating given by user j to movie i (defined only if r(i,j)=1)

θ(j)=用户j的特征向量
x(i)=电影i的特征向量

m(j)=用户j评分的电影数量

16.2 开胃菜:基于内容的推荐系统

要推荐,先要知道用户喜欢什么,基于该用户已经评分的电影,去预测他对未评分电影可能的评分,如果评分高,就可以推荐给他。


基于内容的推系统必须预先知道要推荐的东西——电影的特征向量
除图片中的特征x1x2以外,设置特征x0=1
x(1)=[10.90]

特征数为n=2,则θ(j)=Rn+1,即R3
则预测用户j对电影i的评分:(θ(j))Tx(i)
对单个的用户j而言,这个一个线性回归问题,问题的关键在于学习到参数θ(j)

模型:

(θ(j))Tx(i)

最小化:
minθ(j)12m(j)i:r(i,j)=1[(θ(j))Tx(i)y(i,j)]2+λ2m(j)k=1n(θk(j))2

为了便于计算,去掉用户j评分的电影数量:

minθ(j)12i:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2k=1n(θk(j))2

对于所有用户 :
minθ(1),...,θ(nu)12j=1nui:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nuk=1n(θk(j))2

即代价函数:
J(θ(1),...,θ(nu))=12j=1nui:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nuk=1n(θk(j))2

最小化代价函数
梯度下降:
θk(j):=θk(j)αi;r(i,j)=1((θ(j))Tx(i)y(i))xk(i), (for k=0)

θk(j):=θk(j)α(i;r(i,j)=1((θ(j))Tx(i)y(i))xk(i)+λθk(j)), (for k0)

16.3 正餐:协同过滤collaborative filtering

基于内容的推荐系统必须预先对每一部电影都人为的给定一个特征向量,绝无可能把每部电影看完然后再做推荐系统。所以现实中面临的局面是:


没有电影的特征向量
也没有用户的特征向量
仅有用户对部分电影的评分
即:(θ(1))Tx(1)=5=y(1,1)

现在:
假设已知用户特征向量θ(1),...θ(nu),去学习x(i):

minx(i)12j:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2k=1n(xk(i))2

推广到所有电影:
minx(i)12i=1nmj:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2i=1nmk=1n(xk(i))2

结合16.2,给出θ,就能得到x,反过来,给出x,就能得到θ。但我们都没有,只有movie ratings电影评分。
那么,随机给定θ,然后:

θxθx...

这就是基本的协同过滤算法,根据每一个用户对一部分电影的评分,通过不断的优化θx,预测用户对电影的评分

16.4 再升级:实用算法

  • 改进:
    代价函数包含所有参数,同时优化θx:
    J(x(1),...,x(nm),θ(1),...,θ(nu))=12(i,j):r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2i=1nmk=1n(xk(i))2+λ2j=1nuk=1n(θk(j))2

    minx(1),...,x(nm),θ(1),...,θ(nu)J(x(1),...,x(nm),θ(1),...,θ(nu))
  • 优点:

    1. 同时优化,不需要再反复计算,即,不需要θxθx...
    2. 不再添加x0=1xRnθRn
  • 算法

    1. 初始化,用小的随机数初始化x(1),...,x(nm),θ(1),...,θ(1)
    2. 最小化代价函数,用梯度下降(或其他高级优化算法)
      for every j=1,...,nu,i=1,...,nm:
      θk(j):=θk(j)α(i:r(i,j)=1((θ(j))Tx(i)y(i))xk(i)+λθk(j))

      xk(i):=xk(i)α(j:r(i,j)=1((θ(j))Tx(i)y(i))θk(j)+λxk(i))
    3. 对于一个用户对某一部电影的评分,用户特征为θ,电影特征为x,则预测该用户对该电影的评分为:
      θTx

    16.5 向量化:低秩矩阵分解

    将用户对电影的评分情况写成矩阵:


    以及预测值矩阵:


    那么可以将预测值矩阵做低秩矩阵分解
    [(x(1))T(x(nm))T]

    [(θ(1))T(θ(nm))T]

    则predicted ratings = XΘT

16.5(2) 相似性:推荐

  • 电影j和电影i的相似性:
    x(i)x(j)

    如果小,则相似
  • 如果用户现在在看电影i,可以找5部x(i)x(j) 最小的电影甩到推荐页面上。
  • (θ(j))Tx(i)也是一种推荐手段

16.6 细节:均值归一化

  • 如果一个人,刚注册,还没有给任何电影评分,我们怎么去推荐?


    利用16.4协同过滤算法,代价函数的第一部分为0(没有标签y),正则化部分将用户5的特征最小化为
    θ(5)=[00]

    则由(θ(5))Tx(i),预测用户5对所有的电影评分均为0。
    没有办法进行推荐。
    用均值归一化解决。
    解决的思路就是假定该用户是大众口味,大家喜欢的,他也喜欢。
  • 均值归一化


    其中,μ为电影的均值,右侧是原始的评分矩阵减去均值。
    那么,在预测user j on movie i的评分时,应该是:
    (θ(j))Tx(i)+μ(i)

    那么新用户的评分就是均值μ
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!