1 /** 2
3 评分矩阵R如下 4
5 D1 D2 D3 D4 6
7 U1 5 3 - 1 8
9 U2 4 - - 1 10
11 U3 1 1 - 5 12
13 U4 1 - - 4 14
15 U5 - 1 5 4 16
17 ***/
18
19 #include<iostream>
20
21 #include<cstdio>
22
23 #include<cstdlib>
24
25 #include<cmath>
26
27 using namespace std; 28
29
30
31 void matrix_factorization(double *R,double *P,double *Q,int N,int M,int K,int steps=5000,float alpha=0.0002,float beta=0.02) 32
33 { 34
35 for(int step =0;step<steps;++step) 36
37 { 38
39 for(int i=0;i<N;++i) 40
41 { 42
43 for(int j=0;j<M;++j) 44
45 { 46
47 if(R[i*M+j]>0) 48
49 { 50
51 //这里面的error 就是公式6里面的e(i,j)
52
53 double error = R[i*M+j]; 54
55 for(int k=0;k<K;++k) 56
57 error -= P[i*K+k]*Q[k*M+j]; 58
59
60
61 //更新公式6
62
63 for(int k=0;k<K;++k) 64
65 { 66
67 P[i*K+k] += alpha * (2 * error * Q[k*M+j] - beta * P[i*K+k]); 68
69 Q[k*M+j] += alpha * (2 * error * P[i*K+k] - beta * Q[k*M+j]); 70
71 } 72
73 } 74
75 } 76
77 } 78
79 double loss=0; 80
81 //计算每一次迭代后的,loss大小,也就是原来R矩阵里面每一个非缺失值跟预测值的平方损失
82
83 for(int i=0;i<N;++i) 84
85 { 86
87 for(int j=0;j<M;++j) 88
89 { 90
91 if(R[i*M+j]>0) 92
93 { 94
95 double error = 0; 96
97 for(int k=0;k<K;++k) 98
99 error += P[i*K+k]*Q[k*M+j]; 100
101 loss += pow(R[i*M+j]-error,2); 102
103 for(int k=0;k<K;++k) 104
105 loss += (beta/2) * (pow(P[i*K+k],2) + pow(Q[k*M+j],2)); 106
107 } 108
109 } 110
111 } 112
113 if(loss<0.001) 114
115 break; 116
117 if (step%1000==0) 118
119 cout<<"loss:"<<loss<<endl; 120
121 } 122
123 } 124
125
126
127 int main(int argc,char ** argv) 128
129 { 130
131 int N=5; //用户数
132
133 int M=4; //物品数
134
135 int K=2; //主题个数
136
137 double *R=new double[N*M]; 138
139 double *P=new double[N*K]; 140
141 double *Q=new double[M*K]; 142
143 R[0]=5,R[1]=3,R[2]=0,R[3]=1,R[4]=4,R[5]=0,R[6]=0,R[7]=1,R[8]=1,R[9]=1; 144
145 R[10]=0,R[11]=5,R[12]=1,R[13]=0,R[14]=0,R[15]=4,R[16]=0,R[17]=1,R[18]=5,R[19]=4; 146
147
148
149 cout<< "R矩阵" << endl; 150
151 for(int i=0;i<N;++i) 152
153 { 154
155 for(int j=0;j<M;++j) 156
157 cout<< R[i*M+j]<<','; 158
159 cout<<endl; 160
161 } 162
163
164
165 //初始化P,Q矩阵,这里简化了,通常也可以对服从正态分布的数据进行随机数生成
166
167 srand(1); 168
169 for(int i=0;i<N;++i) 170
171 for(int j=0;j<K;++j) 172
173 P[i*K+j]=rand()%9; 174
175
176
177 for(int i=0;i<K;++i) 178
179 for(int j=0;j<M;++j) 180
181 Q[i*M+j]=rand()%9; 182
183 cout <<"矩阵分解 开始" << endl; 184
185 matrix_factorization(R,P,Q,N,M,K); 186
187 cout <<"矩阵分解 结束" << endl; 188
189
190
191 cout<< "重构出来的R矩阵" << endl; 192
193 for(int i=0;i<N;++i) 194
195 { 196
197 for(int j=0;j<M;++j) 198
199 { 200
201 double temp=0; 202
203 for (int k=0;k<K;++k) 204
205 temp+=P[i*K+k]*Q[k*M+j]; 206
207 cout<<temp<<','; 208
209 } 210
211 cout<<endl; 212
213 } 214
215 free(P),free(Q),free(R); 216
217 return 0; 218
219 }
执行的结果如下图所示,