- 清洗数据
- 这个矩阵是个稀疏矩阵,如果使用矩阵存储会浪费大量空间,我们使用map<int,map<int,float>>的数据结构来存储矩阵中的数据。
- 用户id和艺术家id是不连续的,我们先将这些id变成连续的,使用字典。
UV分解的公式推导:
我们的问题如下:
开始推导:
我们的目标是令
M
=
U
∗
V
(1)
M=U*V\tag{1}
M=U∗V(1)
假设我们的
U
r
s
U{r}{s}
Urs设为x,我们想通过寻找通过这次变化使得RMSE最小的x
假设
U
∗
V
=
P
(2)
U*V=P\tag{2}
U∗V=P(2)
U
r
s
U{r}{s}
Urs变化影响的是
P
r
j
,
j
属
于
[
1
,
m
]
P{r}{j},j属于[1,m]
Prj,j属于[1,m]
Δ
R
M
S
E
=
∑
j
=
1
m
(
M
r
j
−
P
r
j
)
2
=
∑
j
=
1
m
(
∑
k
=
1
m
k
≠
s
U
r
k
∗
V
k
j
+
x
∗
V
s
j
−
M
r
j
)
2
(3)
\Delta RMSE=\sum_{j=1}^{m}(M{r}{j}-P{r}{j})^2=\sum_{j=1}{m}(\sum_{k=1}^{m}k\neq s U{r}{k}*V{k}{j}+x*V{s}{j}-M{r}{j})^2 \tag{3}
ΔRMSE=j=1∑m(Mrj−Prj)2=j=1∑m(k=1∑mk=sUrk∗Vkj+x∗Vsj−Mrj)2(3)
令
δ
Δ
R
M
S
E
δ
x
=
0
(4)
令\frac{\delta \Delta RMSE}{\delta x}=0 \tag{4}
令δxδΔRMSE=0(4)
得到
x
=
∑
j
=
1
m
(
M
r
j
−
∑
k
=
1
d
k
≠
s
U
r
k
∗
V
k
j
)
∑
j
=
1
m
(
V
s
j
)
2
(5)
x=\frac{\sum_{j=1}^{m}(M{r}{j}-\sum_{k=1}^{d}k\neq s U{r}{k}*V{k}{j})}{\sum_{j=1}^{m}(V{s}{j})^2} \tag{5}
x=∑j=1m(Vsj)2∑j=1m(Mrj−∑k=1dk=sUrk∗Vkj)(5)