diff options
author | Joe Zhao <ztuowen@gmail.com> | 2015-04-12 00:51:14 +0800 |
---|---|---|
committer | Joe Zhao <ztuowen@gmail.com> | 2015-04-12 00:51:14 +0800 |
commit | 6c77acb550288883c25b3c2a769313d5466dda70 (patch) | |
tree | 6d06d5568e48b95f9a4175c77deb2d247ffcc10a /model | |
parent | 138634e6d4700fa6cc9e4e140d195be878074934 (diff) | |
download | ranksvm-6c77acb550288883c25b3c2a769313d5466dda70.tar.gz ranksvm-6c77acb550288883c25b3c2a769313d5466dda70.tar.bz2 ranksvm-6c77acb550288883c25b3c2a769313d5466dda70.zip |
PRSVM+, tested
Diffstat (limited to 'model')
-rw-r--r-- | model/ranksvmtn.cpp | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/model/ranksvmtn.cpp b/model/ranksvmtn.cpp index fec7935..cd58aa9 100644 --- a/model/ranksvmtn.cpp +++ b/model/ranksvmtn.cpp @@ -6,14 +6,17 @@ using namespace std; using namespace Eigen; -const int maxiter = 10; -const double prec=1e-4; -const double C=1; -const double cg_prec=1e-10; -const double line_prec=1e-10; -const double line_turb=1e-12; - -int cal_Hs(const MatrixXd &D,const vector<int> &rank,const VectorXd &corr,const VectorXd &alpha,const vector<int> &A1,const vector<int> &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<int> &rank,const VectorXd &corr,const VectorXd &alpha,const vector<int> &A1,const vector<int> &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<int> &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<int> &rank,const VectorXd &corr,const VectorXd &alph,const vector<int> &A1,const vector<int> &A2,const VectorXd &b,const double &C, VectorXd &x) +int cg_solve(const MatrixXd &D,const vector<int> &rank,const VectorXd &corr,const VectorXd &alph,const vector<int> &A1,const vector<int> &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<int> &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<int> &A1 // line search using newton method int line_search(const VectorXd &w,const MatrixXd &D,const VectorXd &corr,const vector<int> &A1,const vector<int> &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<int> &A1,const vector<int> &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; |