diff options
| -rw-r--r-- | model/ranksvmtn.cpp | 36 | ||||
| -rw-r--r-- | tools/dataProvider.h | 8 | 
2 files changed, 24 insertions, 20 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; diff --git a/tools/dataProvider.h b/tools/dataProvider.h index a740a65..586965e 100644 --- a/tools/dataProvider.h +++ b/tools/dataProvider.h @@ -98,14 +98,14 @@ public:          int a,b,n=getqSize();          a=x/n;          b=x%n; -        Eigen::VectorXd vec = uniq[a]->feature; +        Eigen::VectorXd vec;          if (b<a) -            vec=vec-uniq[b]->feature; +            vec=uniq[a]->feature-uniq[b]->feature;          else          if (b<uniq.size()-1) -            vec=vec-uniq[b+1]->feature; +            vec=uniq[a]->feature-uniq[b+1]->feature;          else -            vec=vec-other[b-uniq.size()+1]->feature; +            vec=uniq[a]->feature-other[b-uniq.size()+1]->feature;          return vec.cwiseAbs();      };      inline double getL(int x){  | 
