16 推荐系统
16.1 问题形式化
nu=no.users
n
u
=
n
o
.
u
s
e
r
s
,用户数量
nm=no.movies
n
m
=
n
o
.
m
o
v
i
e
s
,电影数量
r(i,j)=1 if user j has rated movie i
r
(
i
,
j
)
=
1
i
f
u
s
e
r
j
h
a
s
r
a
t
e
d
m
o
v
i
e
i
y(i,j)=rating given by user j to movie i (defined only if r(i,j)=1)
y
(
i
,
j
)
=
r
a
t
i
n
g
g
i
v
e
n
b
y
u
s
e
r
j
t
o
m
o
v
i
e
i
(
d
e
f
i
n
e
d
o
n
l
y
i
f
r
(
i
,
j
)
=
1
)
θ(j)=
θ
(
j
)
=
用户
j
j
的特征向量
电影
i
i
的特征向量
用户 j j 评分的电影数量
16.2 开胃菜:基于内容的推荐系统
要推荐,先要知道用户喜欢什么,基于该用户已经评分的电影,去预测他对未评分电影可能的评分,如果评分高,就可以推荐给他。
基于内容的推系统必须预先知道要推荐的东西——电影的特征向量
除图片中的特征、
x2
x
2
以外,设置特征
x0=1
x
0
=
1
则
特征数为n=2,则 θ(j)=Rn+1 θ ( j ) = R n + 1 ,即 R3 R 3
则预测用户 j j 对电影的评分: (θ(j))Tx(i) ( θ ( j ) ) T x ( i )
对单个的用户 j j 而言,这个一个线性回归问题,问题的关键在于学习到参数
模型:
最小化:
为了便于计算,去掉用户 j j 评分的电影数量:
对于所有用户 :
即代价函数:
最小化代价函数
梯度下降:
16.3 正餐:协同过滤collaborative filtering
基于内容的推荐系统必须预先对每一部电影都人为的给定一个特征向量,绝无可能把每部电影看完然后再做推荐系统。所以现实中面临的局面是:
没有电影的特征向量
也没有用户的特征向量
仅有用户对部分电影的评分
即:
(θ(1))Tx(1)=5=y(1,1)
(
θ
(
1
)
)
T
x
(
1
)
=
5
=
y
(
1
,
1
)
现在:
假设已知用户特征向量
θ(1),...θ(nu)
θ
(
1
)
,
.
.
.
θ
(
n
u
)
,去学习
x(i)
x
(
i
)
:
推广到所有电影:
结合16.2,给出
θ
θ
,就能得到
x
x
,反过来,给出,就能得到
θ
θ
。但我们都没有,只有movie ratings电影评分。
那么,随机给定
θ
θ
,然后:
这就是基本的协同过滤算法,根据每一个用户对一部分电影的评分,通过不断的优化 θ θ 和 x x ,预测用户对电影的评分
16.4 再升级:实用算法
- 改进:
代价函数包含所有参数,同时优化和 x x :
minx(1),...,x(nm),θ(1),...,θ(nu)J(x(1),...,x(nm),θ(1),...,θ(nu)) m i n x ( 1 ) , . . . , x ( n m ) , θ ( 1 ) , . . . , θ ( n u ) J ( x ( 1 ) , . . . , x ( n m ) , θ ( 1 ) , . . . , θ ( n u ) )优点:
- 同时优化,不需要再反复计算,即,不需要 θ→x→θ→x... θ → x → θ → x . . .
- 不再添加 x0=1 x 0 = 1 , x∈Rn x ∈ R n , θ∈Rn θ ∈ R n
算法
- 初始化,用小的随机数初始化 x(1),...,x(nm),θ(1),...,θ(1) x ( 1 ) , . . . , x ( n m ) , θ ( 1 ) , . . . , θ ( 1 )
- 最小化代价函数,用梯度下降(或其他高级优化算法)
for every j=1,...,nu,i=1,...,nm j = 1 , . . . , n u , i = 1 , . . . , n m :
θ(j)k:=θ(j)k−α(∑i:r(i,j)=1((θ(j))Tx(i)−y(i))x(i)k+λθ(j)k) θ k ( j ) := θ k ( j ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i ) ) x k ( i ) + λ θ k ( j ) )
x(i)k:=x(i)k−α(∑j:r(i,j)=1((θ(j))Tx(i)−y(i))θ(j)k+λx(i)k) x k ( i ) := x k ( i ) − α ( ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i ) ) θ k ( j ) + λ x k ( i ) ) - 对于一个用户对某一部电影的评分,用户特征为
θ
θ
,电影特征为
x
x
,则预测该用户对该电影的评分为:
16.5 向量化:低秩矩阵分解
将用户对电影的评分情况写成矩阵:
以及预测值矩阵:
那么可以将预测值矩阵做低秩矩阵分解:
⎡⎣⎢⎢⎢(x(1))T⋮(x(nm))T⎤⎦⎥⎥⎥ [ ( x ( 1 ) ) T ⋮ ( x ( n m ) ) T ]
⎡⎣⎢⎢⎢(θ(1))T⋮(θ(nm))T⎤⎦⎥⎥⎥ [ ( θ ( 1 ) ) T ⋮ ( θ ( n m ) ) T ]
则predicted ratings = XΘT X Θ T16.5(2) 相似性:推荐
- 电影
j
j
和电影的相似性:
‖‖x(i)−x(j)‖‖ ‖ x ( i ) − x ( j ) ‖
如果小,则相似 - 如果用户现在在看电影 i i ,可以找5部最小的电影甩到推荐页面上。
- (θ(j))Tx(i) ( θ ( j ) ) T x ( i ) 也是一种推荐手段
16.6 细节:均值归一化
- 如果一个人,刚注册,还没有给任何电影评分,我们怎么去推荐?
利用16.4协同过滤算法,代价函数的第一部分为0(没有标签y),正则化部分将用户5的特征最小化为θ(5)=[00] θ ( 5 ) = [ 0 0 ]
则由 (θ(5))Tx(i) ( θ ( 5 ) ) T x ( i ) ,预测用户5对所有的电影评分均为0。
没有办法进行推荐。
用均值归一化解决。
解决的思路就是假定该用户是大众口味,大家喜欢的,他也喜欢。 - 均值归一化
其中, μ μ 为电影的均值,右侧是原始的评分矩阵减去均值。
那么,在预测user j on movie i的评分时,应该是:
(θ(j))Tx(i)+μ(i) ( θ ( j ) ) T x ( i ) + μ ( i )
那么新用户的评分就是均值 μ μ 。
- 电影
j
j
和电影的相似性: