From 6c77acb550288883c25b3c2a769313d5466dda70 Mon Sep 17 00:00:00 2001 From: Joe Zhao Date: Sun, 12 Apr 2015 00:51:14 +0800 Subject: PRSVM+, tested --- main.cpp | 11 +---------- model/ranksvmtn.cpp | 38 ++++++++++++++++++++------------------ 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/main.cpp b/main.cpp index e89cfe1..eeb6b99 100644 --- a/main.cpp +++ b/main.cpp @@ -54,7 +54,7 @@ int predict() { rsvm->predict(D,L); } - LOG(INFO)<<"Training finished,saving prediction"; + LOG(INFO)<<"Finished,saving prediction"; std::ofstream fout(vm["output"].as().c_str()); for (int i=0; i &rank,const VectorXd &corr,const VectorXd &alpha,const vector &A1,const vector &A2,const double &C,const VectorXd s,VectorXd &Hs) +const double C=1e-2; // Compensating & scaling +// Main terminating criteria +const int maxiter = 10; // max iteration count +const double prec=1e-4; // precision +// conjugate gradient +const double cg_prec=1e-10; // precision +// line search +const double line_prec=1e-10; // precision +const double line_turb=1e-15; // purturbation + +int cal_Hs(const MatrixXd &D,const vector &rank,const VectorXd &corr,const VectorXd &alpha,const vector &A1,const vector &A2,const VectorXd s,VectorXd &Hs) { Hs = VectorXd::Zero(s.rows()); VectorXd Ds=D*s; @@ -33,17 +36,17 @@ int cal_Hs(const MatrixXd &D,const vector &rank,const VectorXd &corr,const else g+=Ds[rank[j]]; } - Hs = s + (D.transpose()*(alpha.cwiseProduct(Ds) - gamma)); + Hs = s + C*(D.transpose()*(alpha.cwiseProduct(Ds) - gamma)); return 0; } -int cg_solve(const MatrixXd &D,const vector &rank,const VectorXd &corr,const VectorXd &alph,const vector &A1,const vector &A2,const VectorXd &b,const double &C, VectorXd &x) +int cg_solve(const MatrixXd &D,const vector &rank,const VectorXd &corr,const VectorXd &alph,const vector &A1,const vector &A2,const VectorXd &b, VectorXd &x) { double alpha,beta,r_1,r_2; int step=0; VectorXd q; VectorXd Hs; - cal_Hs(D,rank,corr,alph,A1,A2,C,x,Hs); + cal_Hs(D,rank,corr,alph,A1,A2,x,Hs); VectorXd res = b - Hs; VectorXd p = res; while (1) @@ -56,7 +59,7 @@ int cg_solve(const MatrixXd &D,const vector &rank,const VectorXd &corr,cons beta = r_1 / r_2; p = res + p * beta; } - cal_Hs(D,rank,corr,alph,A1,A2,C,p,q); + cal_Hs(D,rank,corr,alph,A1,A2,p,q); alpha = r_1/p.dot(q); x=x+p*alpha; res=res-q*alpha; @@ -129,7 +132,6 @@ int cal_alpha_beta(const VectorXd &dw,const VectorXd &corr,const vector &A1 // line search using newton method int line_search(const VectorXd &w,const MatrixXd &D,const VectorXd &corr,const vector &A1,const vector &A2,const VectorXd &step,double &t) { - double wd=w.dot(step),dd=step.dot(step); VectorXd Dd = D*step; VectorXd Xd = VectorXd::Zero(A1.size()); VectorXd alpha,beta,yt; @@ -146,9 +148,9 @@ int line_search(const VectorXd &w,const MatrixXd &D,const VectorXd &corr,const v grad=w+t*step; Dd = D*(w + t*step); cal_alpha_beta(Dd,corr,A1,A2,rank,yt,alpha,beta); - grad = grad + (D.transpose()*(alpha.cwiseProduct(yt)-beta)); + grad = grad + C*(D.transpose()*(alpha.cwiseProduct(yt)-beta)); g = grad.dot(step); - cal_Hs(D,rank,corr,alpha,A1,A2,C,step,Hs); + cal_Hs(D,rank,corr,alpha,A1,A2,step,Hs); h = Hs.dot(step); g=g+line_turb; h = h+line_turb; @@ -186,11 +188,11 @@ int train_orig(int fsize, MatrixXd &D,const vector &A1,const vector &A cal_alpha_beta(dw,corr,A1,A2,rank,yt,alpha,beta); // Generate support vector matrix sv & gradient - obj = (weight.dot(weight) + (alpha.dot(yt.cwiseProduct(yt))-beta.dot(yt)))/2;// - grad = weight + (D.transpose()*(alpha.cwiseProduct(yt)-beta)); + obj = (weight.dot(weight) + C*(alpha.dot(yt.cwiseProduct(yt))-beta.dot(yt)))/2;// + grad = weight + C*(D.transpose()*(alpha.cwiseProduct(yt)-beta)); step = grad*0; // Solve - cg_solve(D,rank,corr,alpha,A1,A2,grad,C,step); + cg_solve(D,rank,corr,alpha,A1,A2,grad,step); // do line search line_search(weight,D,corr,A1,A2,step,t); weight=weight+step*t; -- cgit v1.2.3-70-g09d2