Skip to content

Commit

Permalink
adding periodic covariance function
Browse files Browse the repository at this point in the history
  • Loading branch information
mblum committed Jul 4, 2013
1 parent d6a194c commit 2a80dea
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 2 deletions.
2 changes: 1 addition & 1 deletion include/cov_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ namespace libgp {
* @param input_dim input vector dimensionality
* @param key string representation of covariance function
* @return instance of CovarianceFunction */
CovarianceFunction* create(size_t input_dim, const std::string key);
libgp::CovarianceFunction* create(size_t input_dim, const std::string key);

/** Returns a string vector of available covariance functions. */
std::vector<std::string> list();
Expand Down
30 changes: 30 additions & 0 deletions include/cov_periodic.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// libgp - Gaussian process library for Machine Learning
// Copyright (c) 2013, Manuel Blum <[email protected]>
// All rights reserved.

#ifndef __COV_PERIODIC_H__
#define __COV_PERIODIC_H__

#include "cov.h"

namespace libgp
{
class CovPeriodic : public CovarianceFunction
{
public:
CovPeriodic ();
virtual ~CovPeriodic ();
bool init(int n);
double get(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2);
void grad(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, Eigen::VectorXd &grad);
void set_loghyper(const Eigen::VectorXd &p);
virtual std::string to_string();
private:
double ell;
double sf2;
double T;
};

}

#endif
4 changes: 3 additions & 1 deletion src/cov_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "cov_sum.h"
#include "cov_prod.h"
#include "cov_periodic_matern3_iso.h"
#include "cov_periodic.h"
#include "input_dim_filter.h"

namespace libgp {
Expand All @@ -34,12 +35,13 @@ namespace libgp {
registry["CovSum"] = & create_func<CovSum>;
registry["CovProd"] = & create_func<CovProd>;
registry["CovPeriodicMatern3iso"] = & create_func<CovPeriodicMatern3iso>;
registry["CovPeriodic"] = & create_func<CovPeriodic>;
registry["InputDimFilter"] = & create_func<InputDimFilter>;
}

CovFactory::~CovFactory () {};

CovarianceFunction* CovFactory::create(size_t input_dim, const std::string key) {
libgp::CovarianceFunction* CovFactory::create(size_t input_dim, const std::string key) {

CovarianceFunction * covf = NULL;

Expand Down
50 changes: 50 additions & 0 deletions src/cov_periodic.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// libgp - Gaussian process library for Machine Learning
// Copyright (c) 2013, Manuel Blum <[email protected]>
// All rights reserved.

#include "cov_periodic.h"
#include <cmath>

namespace libgp
{

CovPeriodic::CovPeriodic() {}

CovPeriodic::~CovPeriodic() {}

bool CovPeriodic::init(int n)
{
input_dim = n;
param_dim = 3;
loghyper.resize(param_dim);
loghyper.setZero();
return true;
}

double CovPeriodic::get(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2)
{
double s = sin(M_PI * (x1-x2).norm() / T) / ell;
return sf2*exp(-2*s*s);
}

void CovPeriodic::grad(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, Eigen::VectorXd &grad)
{
double k = M_PI * (x1-x2).norm() / T;
double s = sin(k) / ell;
grad << 4*sf2*exp(-2*s*s)*s*s, 2*sf2*exp(-2*s*s), 0;// 4*sf2/ell*exp(-2*s*s)*s*cos(k)*k;
}

void CovPeriodic::set_loghyper(const Eigen::VectorXd &p)
{
CovarianceFunction::set_loghyper(p);
ell = exp(loghyper(0));
sf2 = exp(2*loghyper(1));
T = fabs(loghyper(2));
}

std::string CovPeriodic::to_string()
{
return "CovPeriodic";
}

}

0 comments on commit 2a80dea

Please sign in to comment.