⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsvd.c

📁 rsvd program for netflix
💻 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 + -