summaryrefslogtreecommitdiff
path: root/model
diff options
context:
space:
mode:
Diffstat (limited to 'model')
-rw-r--r--model/ranksvmtn.cpp38
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;