32#include <libcmaes/eo_matrix.h> 
   48  double K(
const dVec &x1, 
const dVec &x2);
 
   49  void init(
const dMat &x) {};
 
 
   64  double K(
const dVec &x1, 
const dVec &x2) { 
return x1.transpose()*x2; }
 
 
   70template <
int d,
int c=1>
 
   80  double K(
const dVec &x1, 
const dVec &x2) { 
return pow((x1.transpose()*x2 + c),d); }
 
 
   95  double K(
const dVec &x1, 
const dVec &x2) { 
return exp(-_gamma*((x1-x2).squaredNorm())); }
 
   97  void init(
const dMat &x)
 
  100    for (
int i=0;i<x.cols();i++)
 
  101      for (
int j=i+1;j<x.cols();j++)
 
  102    avgdist += (x.col(i)-x.col(j)).norm();
 
  103    avgdist /= 0.5*(x.cols()*(x.cols()-1.0));
 
  104    double sigma = _sigma_a * std::pow(avgdist,_sigma_pow);
 
  105    _gamma = 1.0/(2.0*sigma*sigma);
 
  113  double _sigma_a = 1.0;
 
  114  double _sigma_pow = 1.0;
 
 
  120template<
class TKernel=RBFKernel>
 
  126    _udist = std::uniform_real_distribution<>(0,1);
 
  152    int nalphas = x.cols()-1;
 
  153    _C = dMat::Constant(nalphas,1,
_Cval);
 
  154    for (
int i=0;i<nalphas;i++)
 
  155      _C(nalphas-1-i) = 
_Cval*pow(nalphas-i,2);
 
  156    _dKij = dMat::Zero(nalphas,nalphas);
 
  157    _alpha = dVec::Zero(nalphas);
 
 
  188    fit = dVec::Zero(x_test.cols());
 
  191    encode(x_train,covinv,xmean);
 
  192    encode(x_test,covinv,xmean);
 
  194#pragma omp parallel for 
  195    for (
int i=0;i<x_test.cols();i++)
 
  197    dVec Kvals(x_train.cols());
 
  198    for (
int j=0;j<x_train.cols();j++)
 
  199      Kvals(j) = 
_kernel.K(x_test.col(i),x_train.col(j));
 
  201    for (
int j=0;j<x_train.cols()-1;j++)
 
  202      curfit += 
_alpha(j) * (Kvals(j)-Kvals(j+1));
 
 
  221    for (
int i=0;i<x.cols();i++)
 
  223    if (covinv.cols() > 1)
 
  227    for (
int i=0;i<x.cols();i++)
 
  228      x.col(i) = covinv.cwiseProduct(x.col(i));
 
 
  239    _K = dMat::Zero(x.cols(),x.cols());
 
  240#pragma omp parallel for 
  241      for (
int i=0;i<
_K.rows();i++)
 
  242    for (
int j=i;j<
_K.cols();j++)
 
 
  259    dVec sum_alphas = dVec::Zero(_dKij.cols());
 
  260    dMat div_dKij = dMat::Zero(_dKij.rows(),_dKij.cols());
 
  264      for (
int i=0;i<_dKij.rows();i++)
 
  266      for (
int j=0;j<_dKij.cols();j++)
 
  268          _dKij(i,j) = 
_K(i,j) - 
_K(i,j+1) - 
_K(i+1,j) + 
_K(i+1,j+1);
 
  270      double fact = _udist(_rng);
 
  271      _alpha(i) = 
_C(i) * (0.95 + 0.05*fact);
 
  274      for (
int i=0;i<_dKij.rows();i++)
 
  276      double sum_alpha = 0.0;
 
  277      for (
int j=0;j<_dKij.cols();j++)
 
  279          sum_alpha += 
_alpha(j) * _dKij(i,j);
 
  280          div_dKij(i,j) = _dKij(i,j) / _dKij(j,j);
 
  282      sum_alphas(i) = (_epsilon - sum_alpha) / _dKij(i,i);
 
  289    double old_alpha = 0.0, new_alpha = 0.0, delta_alpha = 0.0;
 
  290    for (
int i=0;i<niter;i++)
 
  292    i1 = i % _dKij.cols();
 
  294    new_alpha = old_alpha + sum_alphas(i1);
 
  295    new_alpha = std::max(std::min(new_alpha,
_C(i1)),0.0);
 
  296    delta_alpha = new_alpha - old_alpha;
 
  297    double dL = delta_alpha * _dKij(i1,i1) * (sum_alphas(i1) - 0.5*delta_alpha + _epsilon);
 
  300        sum_alphas -= delta_alpha * div_dKij.row(i1);
 
 
  325    predict(fit,x_test,x_train,covinv,xmean);
 
  330    for (
int i=0;i<ref_fit.size();i++)
 
  332    for (
int j=0;j<ref_fit.size();j++)
 
  336        err += ((ref_fit(i) > ref_fit(j) && fit(i) < fit(j)) || (ref_fit(i) < ref_fit(j) && fit(i) > fit(j))) ? 1 : 0;
 
  341    err /= 
static_cast<double>((ref_fit.size()*ref_fit.size())-ref_fit.size());
 
 
  353  double _epsilon = 1.0;
 
  358  std::uniform_real_distribution<> _udist;
 
 
linear kernel
Definition rankingsvm.hpp:56
Polynomial kernel.
Definition rankingsvm.hpp:72
Radial Basis Function kernel.
Definition rankingsvm.hpp:87
Ranking SVM algorithm with support for custom kernels.
Definition rankingsvm.hpp:122
double _Cval
Definition rankingsvm.hpp:352
TKernel _kernel
Definition rankingsvm.hpp:355
double error(dMat &x_test, dMat &x_train, const dVec &ref_fit, const dMat &covinv, const dVec &xmean)
computes the ranker's error over a dataset
Definition rankingsvm.hpp:318
void train(dMat &x, const int &niter, const dMat &covinv, const dVec &xmean)
trains a ranker from a set of points
Definition rankingsvm.hpp:142
void predict(dVec &fit, dMat &x_test, dMat &x_train, const dMat &covinv, const dVec &xmean)
predicts a ranking from a learnt ranker
Definition rankingsvm.hpp:180
void compute_training_kernel(dMat &x)
pre-computation of the kernel values for every examples and coordinates
Definition rankingsvm.hpp:236
dMat _C
Definition rankingsvm.hpp:351
dMat _K
Definition rankingsvm.hpp:348
void optimize(const dMat &x, const int &niter)
optimizes a ranker's model given a training set x
Definition rankingsvm.hpp:255
dVec _alpha
Definition rankingsvm.hpp:349
void encode(dMat &x, const dMat &covinv, const dVec &xmean)
encoding a set of point in a transformed space
Definition rankingsvm.hpp:217
bool _encode
Definition rankingsvm.hpp:346
Kernel base class.
Definition rankingsvm.hpp:43