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 开胃菜:基于内容的推荐系统
要推荐,先要知道用户喜欢什么,基于该用户已经评分的电影,去预测他对未评分电影可能的评分,如果评分高,就可以推荐给他。
基于内容的推系统必须预先知道要推荐的东西——电影的特征向量
除图片中的特征
x1
、
x2
以外,设置特征
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(θ(j)k)2
为了便于计算,去掉用户
j
评分的电影数量:
minθ(j)12∑i:r(i,j)=1((θ(j))Tx(i)−y(i,j))2+λ2∑k=1n(θ(j)k)2
对于所有用户 :
minθ(1),...,θ(nu)12∑j=1nu∑i:r(i,j)=1((θ(j))Tx(i)−y(i,j))2+λ2∑j=1nu∑k=1n(θ(j)k)2
即代价函数:
J(θ(1),...,θ(nu))=12∑j=1nu∑i:r(i,j)=1((θ(j))Tx(i)−y(i,j))2+λ2∑j=1nu∑k=1n(θ(j)k)2
最小化代价函数
梯度下降:
θ(j)k:=θ(j)k−α∑i;r(i,j)=1((θ(j))Tx(i)−y(i))x(i)k, (for k=0)
θ(j)k:=θ(j)k−α(∑i;r(i,j)=1((θ(j))Tx(i)−y(i))x(i)k+λθ(j)k), (for k≠0)
16.3 正餐:协同过滤collaborative filtering
基于内容的推荐系统必须预先对每一部电影都人为的给定一个特征向量,绝无可能把每部电影看完然后再做推荐系统。所以现实中面临的局面是:
没有电影的特征向量
也没有用户的特征向量
仅有用户对部分电影的评分
即:
(θ(1))Tx(1)=5=y(1,1)
现在:
假设已知用户特征向量
θ(1),...θ(nu)
,去学习
x(i)
:
minx(i)12∑j:r(i,j)=1((θ(j))Tx(i)−y(i,j))2+λ2∑k=1n(x(i)k)2
推广到所有电影:
minx(i)12∑i=1nm∑j:r(i,j)=1((θ(j))Tx(i)−y(i,j))2+λ2∑i=1nm∑k=1n(x(i)k)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+λ2∑i=1nm∑k=1n(x(i)k)2+λ2∑j=1nu∑k=1n(θ(j)k)2
minx(1),...,x(nm),θ(1),...,θ(nu)J(x(1),...,x(nm),θ(1),...,θ(nu))
优点:
- 同时优化,不需要再反复计算,即,不需要
θ→x→θ→x...
- 不再添加
x0=1
,
x∈Rn
,
θ∈Rn
算法
- 初始化,用小的随机数初始化
x(1),...,x(nm),θ(1),...,θ(1)
- 最小化代价函数,用梯度下降(或其他高级优化算法)
for every
j=1,...,nu,i=1,...,nm
:
θ(j)k:=θ(j)k−α(∑i:r(i,j)=1((θ(j))Tx(i)−y(i))x(i)k+λθ(j)k)
x(i)k:=x(i)k−α(∑j:r(i,j)=1((θ(j))Tx(i)−y(i))θ(j)k+λx(i)k)
- 对于一个用户对某一部电影的评分,用户特征为
θ
,电影特征为
x
,则预测该用户对该电影的评分为:
θTx
16.5 向量化:低秩矩阵分解
将用户对电影的评分情况写成矩阵:
以及预测值矩阵:
那么可以将预测值矩阵做低秩矩阵分解:
⎡⎣⎢⎢⎢(x(1))T⋮(x(nm))T⎤⎦⎥⎥⎥
⎡⎣⎢⎢⎢(θ(1))T⋮(θ(nm))T⎤⎦⎥⎥⎥
则predicted ratings =
XΘT
16.5(2) 相似性:推荐
16.6 细节:均值归一化