📄 rsvd.c
字号:
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "nrutil.h"
#define FEATURE 96
#define LRATE 0.001
#define LMDA 0.02
#define LMDA2 0.05
#define GM 3.6033
#define EPOCHS 50
#define MOVN 17770
#define CUSTN 480189
void RSVD2()
{
float** u=matrix(1, FEATURE, 1, CUSTN);
float r, y, py;
float** v=matrix(1, FEATURE, 1, MOVN);
float* c=vector(1, CUSTN);
float* d=vector(1, MOVN);
int* ci=ivector(1, CUSTN);
int* mi=ivector(1, MOVN);
int cid, mid;
int cindex, mindex;
int i, j, k;
FILE* pfindex;
pfindex=fopen("ci.txt", "r");
if(pfindex==NULL)
{
printf("Failed open customer index file!\n");
exit(1);
}
for(i=1;i<=CUSTN;i++)
{
fscanf(pfindex, "%d", &j);
*(ci+i)=j;
*(c+i)=0.00000001;
}
fclose(pfindex);
//pfindex=fopen("mi.txt", "r");
//if(pfindex==NULL)
//{
// printf("Failed open movie index file!\n");
// exit(1);
//}
for(i=1;i<=MOVN;i++)
{
//fscanf(pfindex, "%d", &j);
//*(mi+i)=j;
*(d+i)=0.00000001;
}
//fclose(pfindex);
for(i=1;i<=CUSTN;i++)
{
for(j=1;j<=FEATURE;j++)
{
*(*(u+i)+j)=(float)(2*rand()/RAND_MAX-1)/10;
}
}
for(i=1;i<=MOVN;i++)
{
for(j=1;j<=FEATURE;j++)
{
*(*(v+i)+j)=(float)(2*rand()/RAND_MAX-1)/10;
}
}
FILE* pfin;
pfin=fopen("train.txt", "r");
if(pfin==NULL)
{
printf("Failed to open train file!\n");
exit(1);
}
printf("begin train...\n");
int icountofrecord=0;
while(!feof(pfin))
{
fscanf(pfin, "%d %d %f", &cid, &mid, &y);
icountofrecord++;
//printf("%d %d %f\n", cid, mid, y);
for(i=1;i<=CUSTN;i++)
{
if(*(ci+i)==cid)
{
cindex=i;
break;
}
}
/*for(i=1;i<=MOVN;i++)
{
if(*(mi+i)==mid)
{
mindex=i;
break;
}
}*/
mindex=mid;
r=999.0;
int itmpcount=0;
while(1)
{
py=0.0;
for(i=1;i<=FEATURE;i++)
{
py+= (*(*(u+cindex)+i) * *(*(v+mindex)+i));
}
py+=(*(c+cindex) + *(d+mindex));
//printf("\n%f\n", y-py-r);
if(fabs(y-py-r)<0.000001)//||itmpcount>=EPOCHS))
{
if(icountofrecord%50000==0)
{
printf("%d records finished!\n", icountofrecord);
//printf("r=%f ----- count=%d\n",r,itmpcount);
}
break;
}
else
{
//if(itmpcount%30==0)
//printf("-----------r=%f\n",r);
itmpcount++;
r=y-py;
}
for(i=1;i<=FEATURE;i++)
{
*(*(u+cindex)+i)+=(LRATE*(r * *(*(v+mindex)+i) - LMDA * *(*(u+cindex)+i)));
*(*(v+mindex)+i)+=(LRATE*(r * *(*(u+cindex)+i) - LMDA * *(*(v+mindex)+i)));
}
*(c+cindex)=(LRATE*(r-LMDA2*(*(c+cindex)+*(d+mindex)-GM)));
*(d+mindex)=(LRATE*(r-LMDA2*(*(c+cindex)+*(d+mindex)-GM)));
}
}
fclose(pfin);
//begin predict
FILE* pfout;
pfin=fopen("test.txt", "r");
if(pfin==NULL)
{
printf("Failed open test file!\n");
exit(1);
}
pfout=fopen("predict.txt", "w");
if(pfout==NULL)
{
printf("Failed open predict file!\n");
exit(1);
}
printf("begin predict...\n");
while(!feof(pfin))
{
fscanf(pfin, "%d %d", &cid, &mid);
py=0.0;
for(i=1;i<=CUSTN;i++)
{
if(*(ci+i)==cid)
{
cindex=i;
break;
}
}
/*for(i=1;i<=MOVN;i++)
{
if(*(mi+i)==mid)
{
mindex=i;
break;
}
}
*/
mindex=mid;
for(i=1;i<=FEATURE;i++)
{
py+= *(*(u+cindex)+i) * *(*(v+mindex)+i);
}
py+=*(c+cindex) + *(d+mindex);
fprintf(pfout, "%d %d %f\n", cid, mid, py);
}
fclose(pfout);
fclose(pfin);
free_vector(c, 1, CUSTN);
free_vector(d, 1, MOVN);
free_ivector(ci, 1, CUSTN);
free_ivector(mi, i, MOVN);
printf("predict finished!\n");
printf("begin save u and v!\n");
pfout=fopen("u.txt", "w");
for(i=1;i<=CUSTN;i++)
{
for(j=1;j<=FEATURE;j++)
{
fprintf(pfout, "%f\n", *(*(u+i)+j));
}
}
fclose(pfout);
pfout=fopen("v.txt", "w");
for(i=1;i<=MOVN;i++)
{
for(j=1;j<=FEATURE;j++)
{
fprintf(pfout, "%f\n", *(*(v+i)+j));
}
}
fclose(pfout);
printf("save finished!\n");
free_matrix(u, 1, CUSTN, 1, FEATURE);
free_matrix(v, 1, MOVN, 1, FEATURE);
}
int main(int argc, char* argv[])
{
RSVD2();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -