diff options
| author | Joe Zhao <ztuowen@gmail.com> | 2015-05-15 18:21:26 +0800 | 
|---|---|---|
| committer | Joe Zhao <ztuowen@gmail.com> | 2015-05-15 18:21:26 +0800 | 
| commit | 4a9b3f837b1e5e6175d2f1d3fa718c7ddffce964 (patch) | |
| tree | 2a413094aaa85a660b0ff34837c142fe6f362a3f /model | |
| parent | c3b31f1d3c0f74df01ed8fda7e9c68dd9fd378e5 (diff) | |
| download | ranksvm-4a9b3f837b1e5e6175d2f1d3fa718c7ddffce964.tar.gz ranksvm-4a9b3f837b1e5e6175d2f1d3fa718c7ddffce964.tar.bz2 ranksvm-4a9b3f837b1e5e6175d2f1d3fa718c7ddffce964.zip  | |
misc
Diffstat (limited to 'model')
| -rw-r--r-- | model/ranksvmtn.cpp | 36 | 
1 files changed, 20 insertions, 16 deletions
diff --git a/model/ranksvmtn.cpp b/model/ranksvmtn.cpp index 81b13ab..3436cce 100644 --- a/model/ranksvmtn.cpp +++ b/model/ranksvmtn.cpp @@ -7,7 +7,7 @@ using namespace std;  using namespace Eigen;  // Main terminating criteria -const int maxiter = 60; // max iteration count +const int maxiter = 40; // max iteration count  const double prec=1e-10; // precision  // conjugate gradient  const double cg_prec=1e-10; // precision @@ -19,22 +19,24 @@ const double line_turb=1e-15; // purturbation  int cal_Hs(RidList &D,const vector<int> &rank,const VectorXd &corr,const VectorXd &alpha,const VectorXd s,VectorXd &Hs)  { +    int n = D.getSize(); +    int q = D.getqSize();      Hs = VectorXd::Zero(s.rows()); -    VectorXd Ds(D.getSize()); -    for (int i=0;i<D.getSize();++i) +    VectorXd Ds(n); +    for (int i=0;i<n;++i)          Ds(i) = D.getVec(i).dot(s); -    VectorXd gamma(D.getSize()); -    for (int i=0;i<D.getSize();) +    VectorXd gamma(n); +    for (int i=0;i<n;)      {          double g=0; -        for (int j = D.getqSize()-1;j>=0;--j) +        for (int j = q-1;j>=0;--j)              if (corr[rank[i+j]]>0)                  gamma[rank[i+j]]=g;              else                  g+=Ds[rank[i+j]];          g=0; -        i+=D.getqSize(); -        for (int j = D.getqSize();j>0;--j) +        i+=q; +        for (int j = q;j>0;--j)              if (corr[rank[i-j]]<0)                  gamma[rank[i-j]]=g;              else @@ -42,7 +44,7 @@ int cal_Hs(RidList &D,const vector<int> &rank,const VectorXd &corr,const VectorX      }      VectorXd tmp = alpha.cwiseProduct(Ds)-gamma;      VectorXd res = 0*s; -    for (int i=0;i<D.getSize();++i) +    for (int i=0;i<n;++i)          res = res + D.getVec(i)*tmp[i];      Hs = s + C*res;      return 0; @@ -110,13 +112,14 @@ void ranksort(int l,int r,vector<int> &rank,VectorXd &ref)  int cal_alpha_beta(const VectorXd &dw,const VectorXd &corr,RidList &D,vector<int> &rank,VectorXd &yt,VectorXd &alpha,VectorXd &beta)  {      long n = dw.rows(); +    int q = D.getqSize();      yt = dw - corr;      alpha=VectorXd::Zero(n);      beta=VectorXd::Zero(n);      for (int i=0;i<n;++i) rank[i]=i; -    for (int i=0;i<D.getSize();i+=D.getqSize()) +    for (int i=0;i<n;i+=q)      { -        int ed=i+D.getqSize()-1; +        int ed=i+q-1;          ranksort(i,ed,rank,yt);          double a=0,b=0;          for (int j=i;j<=ed;++j) @@ -148,14 +151,15 @@ int cal_alpha_beta(const VectorXd &dw,const VectorXd &corr,RidList &D,vector<int  // line search using newton method  int line_search(const VectorXd &w,RidList &D,const VectorXd &corr,const VectorXd &step,double &t)  { -    VectorXd Dd(D.getSize()); -    for (int i=0;i<D.getSize();++i) +    int n=D.getSize(); +    VectorXd Dd(n); +    for (int i=0;i<n;++i)          Dd(i) = D.getVec(i).dot(step);      VectorXd alpha,beta,yt;      VectorXd grad;      VectorXd Hs; -    int n=D.getSize(); -    vector<int> rank(D.getSize()); + +    vector<int> rank(n);      int iter = 0;      double g,h; @@ -163,7 +167,7 @@ int line_search(const VectorXd &w,RidList &D,const VectorXd &corr,const VectorXd      while (1)      {          grad=w+t*step; -        for (int i=0;i<D.getSize();++i) +        for (int i=0;i<n;++i)              Dd(i) = D.getVec(i).dot(grad);          cal_alpha_beta(Dd,corr,D,rank,yt,alpha,beta);          VectorXd tmp = alpha.cwiseProduct(yt)-beta;  | 
