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