9 #ifndef KERNELRIDGE_IMPL_H
10 #define KERNELRIDGE_IMPL_H
13 namespace regression {
18 template<
class KERNEL,
class T>
21 const arma::Row<T>& labels,
24 cov_(args...), lambda_(lambda)
26 Train(inputs, labels);
29 template<
class KERNEL,
class T>
32 const arma::Row<T>& labels ) :
35 Train(inputs, labels);
38 template<
class KERNEL,
class T>
40 const arma::Row<T>& labels )
44 arma::Mat<T> k_xx = cov_.GetMatrix(train_inp_,train_inp_);
46 arma::Mat<T> KLambda = k_xx+
47 (lambda_ + 1.e-6) * arma::eye<arma::Mat<T>>(k_xx.n_rows, k_xx.n_rows);
50 arma::conv_to<arma::Row<T>>::from(arma::solve(KLambda, labels.t()));
53 template<
class KERNEL,
class T>
55 arma::Row<T>& labels )
const
58 arma::Mat<T> k_xpx = cov_.GetMatrix(train_inp_,inputs);
59 labels = (parameters_ * k_xpx );
62 template<
class KERNEL,
class T>
64 const arma::Row<T>& labels )
const
67 Predict(inputs, temp);
68 const size_t n_points = inputs.n_cols;
72 const T cost = (arma::dot(temp, temp) / n_points);
80 template<
class KERNEL,
class T>
83 const arma::Row<T>& labels,
84 const Ts&... args ) : cov_(args...)
86 Train(inputs, labels);
89 template<
class KERNEL,
class T>
91 const arma::Row<T>& labels )
97 template<
class KERNEL,
class T>
99 arma::Row<T>& labels )
const
101 arma::Mat<T> sim = cov_.GetMatrix(train_inp_, inputs);
102 const size_t N = sim.n_rows;
103 for(
size_t i=0; i<N; i++)
105 sim.row(i) /= arma::sum(sim,0);
107 labels = train_lab_ * sim;
110 template<
class KERNEL,
class T>
112 const arma::Row<T>& labels )
const
115 Predict(inputs, temp);
116 const size_t n_points = inputs.n_cols;
118 temp = labels - temp;
120 const T cost = (arma::dot(temp, temp) / n_points);
128 template<
class KERNEL,
class FUNC,
class T>
129 template<
class... Ts>
132 const arma::Row<T>& labels,
134 const size_t num_funcs,
135 const Ts&... args ) :
136 cov_(args...), lambda_(lambda), M_(num_funcs), perc_(0.), func_(num_funcs)
138 Train(inputs, labels);
141 template<
class KERNEL,
class FUNC,
class T>
142 template<
class... Ts>
145 const arma::Row<T>& labels,
148 const Ts&... args ) :
150 cov_(args...), lambda_(lambda), M_(0), perc_(perc), func_(perc)
157 Train(inputs, labels);
160 template<
class KERNEL,
class FUNC,
class T>
162 const arma::Row<T>& labels )
165 N_ = train_inp_.n_cols;
167 psi_ = func_.Predict(inputs);
172 arma::Mat<T> k_xx = cov_.GetMatrix(train_inp_,train_inp_);
174 arma::Mat<T> K = k_xx +
175 (1.e-8) * arma::eye<arma::Mat<T>>(k_xx.n_rows, k_xx.n_rows);
177 arma::Mat<T> A = arma::join_rows(K, psi_.t());
178 arma::Mat<T> B = arma::join_cols(arma::join_rows(K,
179 arma::zeros<arma::Mat<T>>(N_,M_)),
180 arma::zeros<arma::Mat<T>>(M_,N_+M_));
182 parameters_ = arma::conv_to<arma::Row<T>>::from(
183 arma::solve(A.t() * A + lambda_ * B.t(), A.t() * (labels.t()-
184 func_.Mean(inputs).t())));
188 template<
class KERNEL,
class FUNC,
class T>
190 arma::Row<T>& labels )
192 arma::Mat<T> K = cov_.GetMatrix(inputs,train_inp_);
193 arma::Mat<T> psi = func_.Predict(inputs);
194 arma::Mat<T> A = arma::join_rows(K, psi.t());
195 labels = (A * parameters_.t()).t() + func_.Mean(inputs);
198 template<
class KERNEL,
class FUNC,
class T>
200 (
const arma::Mat<T>& inputs,
201 const arma::Row<T>& labels )
204 Predict(inputs, temp);
205 const size_t n_points = inputs.n_cols;
207 temp = labels - temp;
209 const T cost = (arma::dot(temp, temp) / n_points);
KernelRidge(const arma::Mat< T > &inputs, const arma::Row< T > &labels, const double &lambda, const Ts &... args)
T ComputeError(const arma::Mat< T > &points, const arma::Row< T > &responses) const
void Predict(const arma::Mat< T > &inputs, arma::Row< T > &labels) const
void Train(const arma::Mat< T > &inputs, const arma::Row< T > &labels)
T ComputeError(const arma::Mat< T > &points, const arma::Row< T > &responses) const
void Train(const arma::Mat< T > &inputs, const arma::Row< T > &labels)
Kernel(const arma::Mat< T > &inputs, const arma::Row< T > &labels, const Ts &... args)
void Predict(const arma::Mat< T > &inputs, arma::Row< T > &labels) const
void Predict(const arma::Mat< T > &inputs, arma::Row< T > &labels)
void Train(const arma::Mat< T > &inputs, const arma::Row< T > &labels)
SemiParamKernelRidge(const arma::Mat< T > &inputs, const arma::Row< T > &labels, const T lambda, const size_t num_funcs, const Ts &... args)
T ComputeError(const arma::Mat< T > &points, const arma::Row< T > &responses)