Learning Curve Plus Plus (LCPP)
gp_impl.h
Go to the documentation of this file.
1 /**
2  * @file gp_impl.h
3  * @author Ozgur Taylan Turan
4  *
5  * Gaussian Process Implementation
6  *
7  */
8 #ifndef GP_IMPL_H
9 #define GP_IMPL_H
10 
11 namespace algo {
12 namespace regression {
13 
14 //-----------------------------------------------------------------------------
15 // Gaussian Process Regression
16 //-----------------------------------------------------------------------------
17 template<class K, class T>
18 template<class... Ts>
19 GaussianProcess<K,T>::GaussianProcess ( const arma::Mat<T>& inputs,
20  const arma::Row<T>& labels,
21  const T lambda,
22  const Ts&... args ) :
23  cov_(args...), lambda_(lambda)
24 {
25  Train(inputs, labels);
26 }
27 ///////////////////////////////////////////////////////////////////////////////
28 template<class K, class T>
29 GaussianProcess<K,T>::GaussianProcess ( const arma::Mat<T>& inputs,
30  const arma::Row<T>& labels) :
31  cov_(), lambda_(0.)
32 {
33  Train(inputs, labels);
34 }
35 ///////////////////////////////////////////////////////////////////////////////
36 template<class K, class T>
37 void GaussianProcess<K,T>::Train ( const arma::Mat<T>& inputs,
38  const arma::Row<T>& labels )
39 {
40  train_inp_ = inputs;
41  N_ = inputs.n_cols;
42 
43  arma::Mat<T> k_xx = cov_.GetMatrix(train_inp_,train_inp_);
44 
45  arma::Mat<T> KLambda = k_xx+
46  (lambda_ + 1.e-6) * arma::eye<arma::Mat<T>>(k_xx.n_rows, k_xx.n_rows);
47 
48  L_ = arma::chol(KLambda, "lower");
49  parameters_ = arma::solve(L_.t(), arma::solve(L_,labels.t()));
50 }
51 ///////////////////////////////////////////////////////////////////////////////
52 template<class K,class T>
53 void GaussianProcess<K,T>::Predict ( const arma::Mat<T>& inputs,
54  arma::Row<T>& labels ) const
55 {
56  arma::Mat<T> k_xpx = cov_.GetMatrix(inputs,train_inp_);
57  labels = (k_xpx * parameters_).t();
58 }
59 ///////////////////////////////////////////////////////////////////////////////
60 template<class K,class T>
61 void GaussianProcess<K,T>::PredictVariance ( const arma::Mat<T>& inputs,
62  arma::Mat<T>& labels )
63 {
64  arma::Mat<T> k_xpx = cov_.GetMatrix(inputs,train_inp_);
65  arma::Mat<T> k_xpxp = cov_.GetMatrix(inputs,inputs);
66  arma::Mat<T> v = arma::solve(L_,k_xpx.t());
67  labels = arma::conv_to<arma::Mat<T>>::from((k_xpxp - v.t()*v));
68 }
69 ///////////////////////////////////////////////////////////////////////////////
70 template<class K, class T>
71 T GaussianProcess<K,T>::ComputeError ( const arma::Mat<T>& inputs,
72  const arma::Row<T>& labels ) const
73 {
74  arma::Row<T> temp;
75  Predict(inputs, temp);
76  const size_t n_points = inputs.n_cols;
77 
78  temp = labels - temp;
79 
80  const T cost = arma::dot(temp, temp) / n_points;
81 
82  return cost;
83 }
84 ///////////////////////////////////////////////////////////////////////////////
85 template<class K, class T>
86 T GaussianProcess<K,T>::LogLikelihood ( const arma::Mat<T>& inputs,
87  const arma::Row<T>& labels ) const
88 {
89  return -0.5*arma::dot(labels,parameters_) - arma::trace(arma::log(L_))
90  - 0.5*T(N_)*std::log(2.*M_PI);
91 }
92 ///////////////////////////////////////////////////////////////////////////////
93 template<class K, class T>
95  const arma::Mat<T>& inputs,
96  arma::Mat<T>& labels )
97 {
98  arma::Row<T> mean;
99  arma::Mat<T> cov;
100  Predict(inputs, mean);
101  PredictVariance(inputs, cov);
102  cov.diag() += 1e-6; // jitter addition
103  labels = arma::mvnrnd(mean.t(), cov, M).t();
104 }
105 ///////////////////////////////////////////////////////////////////////////////
106 template<class K,class T>
107 void GaussianProcess<K,T>::SamplePrior ( const size_t M,
108  const arma::Mat<T>& inputs,
109  arma::Mat<T>& labels ) const
110 {
111  size_t N = inputs.n_cols;
112  arma::Mat<T> cov = cov_.GetMatrix(inputs,inputs);
113  cov.diag() += 1e-6 + lambda_; // jitter addition
114  arma::Col<T> mean(N);
115  labels = arma::mvnrnd(mean, cov, M).t();
116 }
117 ///////////////////////////////////////////////////////////////////////////////
118 
119 } // namespace regression
120 } // namespace algo
121 
122 #endif
T LogLikelihood(const arma::Mat< T > &inputs, const arma::Row< T > &labels) const
Definition: gp_impl.h:86
void PredictVariance(const arma::Mat< T > &inputs, arma::Mat< T > &labels)
Definition: gp_impl.h:61
GaussianProcess(const Ts &... args)
Definition: gp.h:29
T ComputeError(const arma::Mat< T > &inputs, const arma::Row< T > &labels) const
Definition: gp_impl.h:71
void Train(const arma::Mat< T > &inputs, const arma::Row< T > &labels)
Definition: gp_impl.h:37
void SamplePosterior(const size_t k, const arma::Mat< T > &inputs, arma::Mat< T > &labels)
Definition: gp_impl.h:94
void Predict(const arma::Mat< T > &inputs, arma::Row< T > &labels) const
Definition: gp_impl.h:53
void SamplePrior(const size_t k, const arma::Mat< T > &inputs, arma::Mat< T > &labels) const
Definition: gp_impl.h:107