- 清洗数据
- 这个矩阵是个稀疏矩阵,如果使用矩阵存储会浪费大量空间,我们使用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)