Skip to content

Commit

Permalink
Merge pull request #1214 from votjakovr/feature/gp_refactoring
Browse files Browse the repository at this point in the history
refactor get_log_probability_f()
  • Loading branch information
karlnapf committed Jul 7, 2013
2 parents e827211 + 9c4453f commit 370764d
Show file tree
Hide file tree
Showing 8 changed files with 22 additions and 21 deletions.
4 changes: 2 additions & 2 deletions src/shogun/machine/gp/GaussianLikelihood.cpp
Expand Up @@ -70,7 +70,7 @@ SGVector<float64_t> CGaussianLikelihood::evaluate_variances(SGVector<float64_t>
return result;
}

float64_t CGaussianLikelihood::get_log_probability_f(CLabels* lab,
SGVector<float64_t> CGaussianLikelihood::get_log_probability_f(CLabels* lab,
SGVector<float64_t> func)
{
REQUIRE(lab->get_label_type()==LT_REGRESSION,
Expand All @@ -89,7 +89,7 @@ float64_t CGaussianLikelihood::get_log_probability_f(CLabels* lab,
eigen_result=-eigen_result.cwiseProduct(eigen_result)/(2*CMath::sq(m_sigma))-
VectorXd::Ones(result.vlen)*log(2*CMath::PI*CMath::sq(m_sigma))/2.0;

return eigen_result.sum();
return result;
}

SGVector<float64_t> CGaussianLikelihood::get_log_probability_derivative_f(
Expand Down
2 changes: 1 addition & 1 deletion src/shogun/machine/gp/GaussianLikelihood.h
Expand Up @@ -105,7 +105,7 @@ class CGaussianLikelihood: public CLikelihoodModel
*
* @return log likelihood
*/
virtual float64_t get_log_probability_f(CLabels* lab,
virtual SGVector<float64_t> get_log_probability_f(CLabels* lab,
SGVector<float64_t> func);

/** get derivative of log likelihood \f$log(P(y|f))\f$ with
Expand Down
14 changes: 7 additions & 7 deletions src/shogun/machine/gp/LaplacianInferenceMethod.cpp
Expand Up @@ -62,8 +62,8 @@ namespace shogun
W->scale(-1.0);

// compute psi=alpha'*(f-m)/2-lp
float64_t result = (*alpha).dot(eigen_f-eigen_m)/2.0-
lik->get_log_probability_f(lab, *f);
float64_t result = (*alpha).dot(eigen_f-eigen_m)/2.0
-SGVector<float64_t>::sum(lik->get_log_probability_f(lab, *f));

return result;
}
Expand Down Expand Up @@ -443,7 +443,7 @@ void CLaplacianInferenceMethod::update_alpha()
W=m_model->get_log_probability_derivative_f(m_labels, function, 2);
W.scale(-1.0);

Psi_New=-m_model->get_log_probability_f(m_labels, function);
Psi_New=-SGVector<float64_t>::sum(m_model->get_log_probability_f(m_labels, function));
}
else
{
Expand All @@ -457,16 +457,16 @@ void CLaplacianInferenceMethod::update_alpha()
W.scale(-1.0);

Psi_New=eigen_temp_alpha.dot(eigen_function-eigen_m_means)/2.0-
m_model->get_log_probability_f(m_labels, function);
SGVector<float64_t>::sum(m_model->get_log_probability_f(m_labels, function));

Psi_Def=-m_model->get_log_probability_f(m_labels, m_means);
Psi_Def=-SGVector<float64_t>::sum(m_model->get_log_probability_f(m_labels, m_means));

// if default is better, then use it
if (Psi_Def < Psi_New)
{
temp_alpha.zero();
eigen_function=eigen_m_means;
Psi_New=-m_model->get_log_probability_f(m_labels, function);
Psi_New=-SGVector<float64_t>::sum(m_model->get_log_probability_f(m_labels, function));
}
}

Expand Down Expand Up @@ -542,7 +542,7 @@ void CLaplacianInferenceMethod::update_alpha()
eigen_function=eigen_ktrtr*CMath::sq(m_scale)*eigen_temp_alpha+eigen_m_means;

// get log probability
lp=m_model->get_log_probability_f(m_labels, function);
lp=SGVector<float64_t>::sum(m_model->get_log_probability_f(m_labels, function));

// get log probability derivatives
dlp=m_model->get_log_probability_derivative_f(m_labels, function, 1);
Expand Down
9 changes: 5 additions & 4 deletions src/shogun/machine/gp/LikelihoodModel.h
Expand Up @@ -23,7 +23,9 @@ enum ELikelihoodModelType
{
LT_NONE = 0,
LT_GAUSSIAN = 10,
LT_STUDENTST = 20
LT_STUDENTST = 20,
LT_LOGIT = 30,
LT_PROBIT = 40
};

/** @brief The Likelihood model base class.
Expand Down Expand Up @@ -71,7 +73,7 @@ class CLikelihoodModel : public CSGObject
*
* @return log likelihood
*/
virtual float64_t get_log_probability_f(CLabels* lab,
virtual SGVector<float64_t> get_log_probability_f(CLabels* lab,
SGVector<float64_t> func)=0;

/** get derivative of log likelihood \f$log(P(y|f))\f$ with
Expand Down Expand Up @@ -118,8 +120,7 @@ class CLikelihoodModel : public CSGObject

/** get derivative of the second derivative of log likelihood with
* respect to function location, i.e. \f$\frac{\partial^{2}
* log(P(y|f))}{\partial f^{2}}\f$ with respect to given
* parameter
* log(P(y|f))}{\partial f^{2}}\f$ with respect to given parameter
*
* @param lab labels used
* @param param parameter
Expand Down
4 changes: 2 additions & 2 deletions src/shogun/machine/gp/StudentsTLikelihood.cpp
Expand Up @@ -85,7 +85,7 @@ SGVector<float64_t> CStudentsTLikelihood::evaluate_variances(SGVector<float64_t>
return result;
}

float64_t CStudentsTLikelihood::get_log_probability_f(CLabels* lab,
SGVector<float64_t> CStudentsTLikelihood::get_log_probability_f(CLabels* lab,
SGVector<float64_t> func)
{
REQUIRE(lab->get_label_type()==LT_REGRESSION,
Expand All @@ -110,7 +110,7 @@ float64_t CStudentsTLikelihood::get_log_probability_f(CLabels* lab,
eigen_r=eigen_lZ-(m_df+1)*
(eigen_r+VectorXd::Ones(r.vlen)).array().log().matrix()/2.0;

return eigen_r.sum();
return r;
}

SGVector<float64_t> CStudentsTLikelihood::get_log_probability_derivative_f(
Expand Down
2 changes: 1 addition & 1 deletion src/shogun/machine/gp/StudentsTLikelihood.h
Expand Up @@ -125,7 +125,7 @@ class CStudentsTLikelihood: public CLikelihoodModel
*
* @return log likelihood
*/
virtual float64_t get_log_probability_f(CLabels* lab,
virtual SGVector<float64_t> get_log_probability_f(CLabels* lab,
SGVector<float64_t> func);

/** get derivative of log likelihood \f$log(P(y|f))\f$ with
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/machine/gp/GaussianLikelihood_unittest.cc
Expand Up @@ -19,7 +19,7 @@

using namespace shogun;

TEST(GaussianLikelihood,get_log_probability_f)
TEST(GaussianLikelihood,get_log_probability_f_sum)
{
// create some easy data:
// f(x) approximately equals to (x^3 + sin(x)^2)/10, y = f(x) + noise
Expand All @@ -46,7 +46,7 @@ TEST(GaussianLikelihood,get_log_probability_f)
// Gaussian likelihood with sigma = 0.13
CGaussianLikelihood* likelihood=new CGaussianLikelihood(0.13);

float64_t lp=likelihood->get_log_probability_f(labels, func);
float64_t lp=SGVector<float64_t>::sum(likelihood->get_log_probability_f(labels, func));

// comparison of log likelihood with result from GPML package
EXPECT_NEAR(lp, 4.2428, 1E-4);
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/machine/gp/StudentsTLikelihood_unittest.cc
Expand Up @@ -19,7 +19,7 @@

using namespace shogun;

TEST(StudentsTLikelihood,get_log_probability_f)
TEST(StudentsTLikelihood,get_log_probability_f_sum)
{
// create some easy data:
// f(x) approximately equals to (x^3 + sin(x)^2)/10, y = f(x) + noise
Expand All @@ -46,7 +46,7 @@ TEST(StudentsTLikelihood,get_log_probability_f)
// Stundent's-t likelihood with sigma = 0.17, df = 3
CStudentsTLikelihood* likelihood=new CStudentsTLikelihood(0.17, 3);

float64_t lp=likelihood->get_log_probability_f(labels, func);
float64_t lp=SGVector<float64_t>::sum(likelihood->get_log_probability_f(labels, func));

// comparison of log likelihood with result from GPML package
EXPECT_NEAR(lp, 2.8647, 1E-4);
Expand Down

0 comments on commit 370764d

Please sign in to comment.