/* PMF.cpp : 定义控制台应用程序的入口点。
(1)从MAT文件读取数据
(2)梯度下降算法迭代处理
*/
#include "stdafx.h"
#include "math.h"
#include "conio.h"
#include "ctype.h"
#include "atlstr.h"
#include "mat.h"
#include "engine.h"
//#include "mclmcr.h" // mxArray 类型声明
#define D 10 /*dimension*/
#define U 6040 /*User number*/
#define M 3952 /*Movie number*/
#define R 900000 /*train rate number*/
#define TN 100000 /*test rate number*/
#define MAXEPOCH 50 /*epoch times*/
struct rate
{
int Pid;
int Mid;
double Rating;
double PredRating;
//double cRating;
};
rate trainRate[R]; /*Rating data*/
rate testRate[R]; /*Rating data*/
double w1_M1[M][D]; //movie feature matrix
double zw1_M1[D][M]; //movie 转置
double w1_P1[U][D]; //person feature matrix
double pRate[U][M];
double w1_M1_inc[M][D];
double w1_P1_inc[U][D];
double Ix_m[R][D]; //movie feature matrix
double Ix_p[R][D]; //person feature matrix
int randnumber[MAXEPOCH][R];
double pred_out[R];
double p_out[R];
/*paramater */
double epsilon=500; /* Learning rate */
double lambda = 0.01; /* Regularization parameter */
double momentum=0.8;
int _tmain(int argc, _TCHAR* argv[])
{
int row,col;
int ii;
int nn[10];
double meanRating=0;
double lsum=0;
double ltsum=0;
int lPid;
int lMid;
/*matlab Engine*/
Engine *ep;
mxArray *T = NULL;
mxArray *tmp = NULL;
/*read MATFile*/
MATFile *Pfile=NULL;
mxArray *pMxArray=NULL;
int ch;
int *dMat; //buffer for rated data
double *dMat_f;
int *dMat_i;
int i,j,k;
/*initial variable*/
for(i=0;i<U;i++)
{
for(int j=0;j<D;j++)
{
w1_P1_inc[i][j]=0.0;
}
}
for(i=0;i<M;i++)
{
for(int j=0;j<D;j++)
{
w1_M1_inc[i][j]=0.0;
}
}
/*产生均值为0,方差为0.01的高斯分布*/
/*启动MATLAB引擎*/
printf("make initial feature matrix...\n");
if (!(ep = engOpen("/0")))
{
printf("/nCan't start MATLAB engine/n");
ch=_getch();
return(1);
}
T = mxCreateDoubleMatrix(M, D, mxREAL);
ch=engPutVariable(ep,"T",T);
ch=engEvalString(ep, "T=0.1*randn(size(T));");
T=engGetVariable(ep,"T");
row = (int)mxGetM(T);
col = (int)mxGetN(T);
//printf(" rol*col is %d %d\n",row,col);
dMat_f = new double[row*col];
dMat_f = (double *)mxGetData(T);
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
w1_M1[i][j]=dMat_f[j*row+i];
//printf("%f ",w1_M1[i][j]);//E
}
//printf("\n");
}
ch=engEvalString(ep, "T=0.1*randn(size(T));");
T=engGetVariable(ep,"T");
row = (int)mxGetM(T);
col = (int)mxGetN(T);
//printf(" rol*col is %d %d\n",row,col);
dMat_f = new double[row*col];
dMat_f = (double *)mxGetData(T);
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
w1_P1[i][j]=dMat_f[j*row+i];
//printf("%f ",w1_P1[i][j]);//E
}
//printf("\n");
}
//产生1~R的随机排列数randnumber
mxDestroyArray(T);
T = mxCreateNumericMatrix(1,R, mxINT32_CLASS,mxREAL);
ch=engPutVariable(ep,"T",T);
for(k=0;k<MAXEPOCH;k++)
{
tmp = mxCreateNumericMatrix(1,1, mxINT32_CLASS,mxREAL);
nn[0]=R;
memcpy((int *)mxGetPr(tmp),(int *)nn, 4);
ch=engPutVariable(ep,"R",tmp);
ch=engEvalString(ep, "T=int32(randperm(R));");
T=engGetVariable(ep,"T");
row = (int)mxGetM(T); //row=1
col = (int)mxGetN(T);
//printf(" rol*col is %d %d\n",row,col);
dMat_i = new int[row*col];
dMat_i = (int *)mxGetData(T);
for(j=0;j<col;j++)
{
randnumber[k][j]=dMat_i[j]-1; //从0开始
//printf("%d ",dMat_i[j]);
}
//printf("\n");
}
mxDestroyArray(T);
mxDestroyArray(tmp);
engClose(ep);
//===============================================
printf("Get Train Data...\n");
//1.1 Open MAT File
Pfile=matOpen("moviedata.mat","r"); //A
if (Pfile == NULL)
{
print�
评论0