From ddfbe260e76c4c5cf5e601e21d39c5f5cc67b2c6 Mon Sep 17 00:00:00 2001 From: Joe Zhao Date: Sat, 11 Apr 2015 19:32:30 +0800 Subject: A substituted --- model/ranksvmtn.cpp | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/model/ranksvmtn.cpp b/model/ranksvmtn.cpp index 959ea7d..105c3fe 100644 --- a/model/ranksvmtn.cpp +++ b/model/ranksvmtn.cpp @@ -39,22 +39,30 @@ int cg_solve(const MatrixXd &A, const VectorXd &b, VectorXd &x) } // Calculate objfunc gradient & support vectors -int objfunc_linear(const VectorXd &w,const MatrixXd &D,const MatrixXd &A,const double C,VectorXd &pred,VectorXd &grad, double &obj) +int objfunc_linear(const VectorXd &w,const MatrixXd &D,const vector &A1,const vector &A2,const double C,VectorXd &pred,VectorXd &grad, double &obj) { for (int i=0;i0?pred(i):0; obj = (pred.cwiseProduct(pred)*C).sum()/2 + w.dot(w)/2; - grad = w - (((pred*C).transpose()*A)*D).transpose(); + VectorXd pA = VectorXd::Zero(D.rows()); + for (int i=0;i &A1,const vector &A2,const VectorXd &step,VectorXd &pred,double &t) { double wd=w.dot(step),dd=step.dot(step); + VectorXd Dd = D*step; + VectorXd Xd = VectorXd::Zero(A1.size()); + for (int i=0;i &A1,vector &A2,VectorXd &weight){ int iter = 0; - long n=A.rows(); - LOG(INFO) << "training with feature size:" << fsize << " Data size:" << n << " Relation size:" << A.rows(); + long n=A1.size(); + LOG(INFO) << "training with feature size:" << fsize << " Data size:" << n << " Relation size:" << A1.size(); VectorXd grad(fsize); VectorXd step(fsize); VectorXd pred(n); double obj,t; - pred=VectorXd::Ones(n) - (A*(D*weight)); + VectorXd dw = D*weight; + pred=VectorXd::Zero(n); + for (int i=0;i0) { - VectorXd v = A.row(i)*D; + VectorXd v = D.row(A1[i])-D.row(A2[i]); H = H + C * (v * v.transpose()); } // Solve //cout< A1,A2; int i,j; LOG(INFO)<<"Processing input"; for (i=0;irank)>0;++v1) for (v2=i;(D.getData()[v2]->rank)<0;--v2) { - A(cnt,v1) = 1; - A(cnt,v2) = -1; + A1.push_back(v1); + A2.push_back(v2); ++cnt; } j = i+1; } ++i; } - train_orig(fsize,Data,A,model.weight); + train_orig(fsize,Data,A1,A2,model.weight); return 0; }; int RSVMTN::predict(DataList &D, vector &res){ - //TODO define A res.clear(); for (int i=0;ifeature).dot(model.weight)); -- cgit v1.2.3-70-g09d2