参数
n
u
n_u
nu表示用户数量
n
m
n_m
nm表示电影数量
r
(
i
,
j
)
r(i,j)
r(i,j)表示用户j是否有评价电影i,若是,则值为1
y
(
i
,
j
)
y(i,j)
y(i,j)表示用户j对电影i的评分
基于内容的推荐
θ
(
j
)
\theta^{(j)}
θ(j)表示第j个用户的模型参数
x
(
i
)
x^{(i)}
x(i)表示第i个电影的输入特征
对于用户j来说,预测其对电影i的评分:
(
θ
(
j
)
)
(
x
(
i
)
)
(\theta^{(j)})(x^{(i)})
(θ(j))(x(i))
m
(
j
)
m^{(j)}
m(j)表示被用户j评分的电影的数量
其中, x ( i ) x^{(i)} x(i)中可以包括特征动作、爱情、喜剧等,先指定每部电影的特征,比如电影A动作0.9,爱情0.7,喜剧0.1。
用线性回归计算模型参数
θ
(
j
)
\theta^{(j)}
θ(j),其目标函数(去掉线性回归的目标函数中除以m的项):
同时计算各用户的模型参数
θ
(
1
)
,
θ
(
2
)
,
…
,
θ
(
n
u
)
\theta^{(1)},\theta^{(2)},\dots,\theta^{(n_u)}
θ(1),θ(2),…,θ(nu),其目标函数:
梯度下降算法:
基于用户的推荐
先指定模型参数 θ ( j ) \theta^{(j)} θ(j),再计算电影的特征
用线性回归计算电影i的特征
x
(
i
)
x^{(i)}
x(i),其目标函数:
同时计算各电影的特征
x
(
1
)
,
x
(
2
)
,
…
,
x
(
n
u
)
x^{(1)},x^{(2)},\dots,x^{(n_u)}
x(1),x(2),…,x(nu),其目标函数:
梯度下降:
x j ( i ) : = x j ( i ) − α ( ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) θ k ( i ) ) k = 0 x j ( i ) : = x j ( i ) − α ( ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T x ( i ) − y ( i , j ) ) θ k ( i ) + λ x j ( i ) ) k ̸ = 0 x^{(i)}_j:=x^{(i)}_j-\alpha(\sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})\theta^{(i)}_k) \quad k=0\\ x^{(i)}_j:=x^{(i)}_j-\alpha( \sum_{j:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})\theta^{(i)}_k+\lambda x^{(i)}_j) \quad k\not=0 xj(i):=xj(i)−α(j:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))θk(i))k=0xj(i):=xj(i)−α(j:r(i,j)=1∑((θ(j))Tx(i)−y(i,j))θk(i)+λxj(i))k̸=0
协同过滤算法
随机初始化模型参数 θ ( j ) \theta^{(j)} θ(j)和 x ( i ) x^{(i)} x(i)为 ( − ϵ , ϵ ) (-\epsilon,\epsilon) (−ϵ,ϵ),注意要像神经网络算法一样,破坏对称性,否则会得到相同的值
PS:这里不用设置 θ 0 ( j ) \theta^{(j)}_0 θ0(j)和 x 0 ( i ) x^{(i)}_0 x0(i),因为如果需要这两个参数,该算法会自己学习得到。
结合基于内容推荐和基于用户推荐两种算法,目标函数如下:
梯度下降:
得到各参数后,根据电影的输入特征,和用户的模型参数,预测用户评分 θ T x \theta^Tx θTx
低秩矩阵分解
左图是实际评分,右图是预测评分
其中,预测评分的矩阵可以分解为
X
Θ
T
X\Theta^T
XΘT:
X
=
[
(
x
(
1
)
)
T
(
x
(
2
)
)
T
⋮
(
x
(
n
m
)
)
T
]
Θ
=
[
(
θ
(
1
)
)
T
(
θ
(
2
)
)
T
⋮
(
θ
(
n
u
)
)
T
]
X = \begin{bmatrix} (x^{(1)})^T \\ (x^{(2)})^T\\ \vdots\\ (x^{(n_m)})^T \end{bmatrix} \quad \Theta = \begin{bmatrix} (\theta^{(1)})^T \\ (\theta^{(2)})^T\\ \vdots\\ (\theta^{(n_u)})^T \end{bmatrix}
X=⎣⎢⎢⎢⎡(x(1))T(x(2))T⋮(x(nm))T⎦⎥⎥⎥⎤Θ=⎣⎢⎢⎢⎡(θ(1))T(θ(2))T⋮(θ(nu))T⎦⎥⎥⎥⎤
如果要寻找特征相近的电影,可以通过算 ∣ x ( i ) − x ( j ) ∣ |x^{(i)}-x^{(j)}| ∣x(i)−x(j)∣得到
- 均值化
如果该用户一个电影都没有评分,那么,在梯度下降时,由于前项为0(没有评分数据),只剩下后项的惩罚项,这样的话,就会使惩罚项中的该用户的模型参数为零向量,则该用户在预测所有电影时的评分均为0,这是没有意义的,所有要对分值Y作均值化:
上图中,Y的行代表不同的电影,列代表不同的用户, μ \mu μ为各行,也即各电影,的平均分:评分总值/评分用户数。然后各行数据分别减去对应的平均分。得到右面的Y。
那么,在最终预测评分时,需要加上对应的电影的平均分 μ i \mu_i μi,那么,在最后预测时,就不会出现0分的情况。
PS:另一种情况,电影无人评分,所以它的输入特征也全是0,预测用户的评分肯定都是0,同理,将Y的各列进行均值化,就是求每个用户的平均分,再每列的评分分别去减对应的平均分,最后在算分时再把对应的用户的平均分 μ j \mu_j μj加上去,那么该电影的评分起码是个均分。