diff --git a/src/shogun/machine/gp/GaussianLikelihood.cpp b/src/shogun/machine/gp/GaussianLikelihood.cpp index dc429c8c656..e1befe575b8 100644 --- a/src/shogun/machine/gp/GaussianLikelihood.cpp +++ b/src/shogun/machine/gp/GaussianLikelihood.cpp @@ -70,7 +70,7 @@ SGVector CGaussianLikelihood::evaluate_variances(SGVector return result; } -float64_t CGaussianLikelihood::get_log_probability_f(CLabels* lab, +SGVector CGaussianLikelihood::get_log_probability_f(CLabels* lab, SGVector func) { REQUIRE(lab->get_label_type()==LT_REGRESSION, @@ -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 CGaussianLikelihood::get_log_probability_derivative_f( diff --git a/src/shogun/machine/gp/GaussianLikelihood.h b/src/shogun/machine/gp/GaussianLikelihood.h index 82b5e2a94af..2aba9b30df5 100644 --- a/src/shogun/machine/gp/GaussianLikelihood.h +++ b/src/shogun/machine/gp/GaussianLikelihood.h @@ -105,7 +105,7 @@ class CGaussianLikelihood: public CLikelihoodModel * * @return log likelihood */ - virtual float64_t get_log_probability_f(CLabels* lab, + virtual SGVector get_log_probability_f(CLabels* lab, SGVector func); /** get derivative of log likelihood \f$log(P(y|f))\f$ with diff --git a/src/shogun/machine/gp/LaplacianInferenceMethod.cpp b/src/shogun/machine/gp/LaplacianInferenceMethod.cpp index 7296f0ea2ad..9bfdfe876ca 100644 --- a/src/shogun/machine/gp/LaplacianInferenceMethod.cpp +++ b/src/shogun/machine/gp/LaplacianInferenceMethod.cpp @@ -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::sum(lik->get_log_probability_f(lab, *f)); return result; } @@ -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::sum(m_model->get_log_probability_f(m_labels, function)); } else { @@ -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::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::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::sum(m_model->get_log_probability_f(m_labels, function)); } } @@ -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::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); diff --git a/src/shogun/machine/gp/LikelihoodModel.h b/src/shogun/machine/gp/LikelihoodModel.h index 14d2b40be80..43ffed6af86 100644 --- a/src/shogun/machine/gp/LikelihoodModel.h +++ b/src/shogun/machine/gp/LikelihoodModel.h @@ -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. @@ -71,7 +73,7 @@ class CLikelihoodModel : public CSGObject * * @return log likelihood */ - virtual float64_t get_log_probability_f(CLabels* lab, + virtual SGVector get_log_probability_f(CLabels* lab, SGVector func)=0; /** get derivative of log likelihood \f$log(P(y|f))\f$ with @@ -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 diff --git a/src/shogun/machine/gp/StudentsTLikelihood.cpp b/src/shogun/machine/gp/StudentsTLikelihood.cpp index f9e37f58a7e..1b87583f896 100644 --- a/src/shogun/machine/gp/StudentsTLikelihood.cpp +++ b/src/shogun/machine/gp/StudentsTLikelihood.cpp @@ -85,7 +85,7 @@ SGVector CStudentsTLikelihood::evaluate_variances(SGVector return result; } -float64_t CStudentsTLikelihood::get_log_probability_f(CLabels* lab, +SGVector CStudentsTLikelihood::get_log_probability_f(CLabels* lab, SGVector func) { REQUIRE(lab->get_label_type()==LT_REGRESSION, @@ -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 CStudentsTLikelihood::get_log_probability_derivative_f( diff --git a/src/shogun/machine/gp/StudentsTLikelihood.h b/src/shogun/machine/gp/StudentsTLikelihood.h index 36c1d03dfb8..2f6fde68d80 100644 --- a/src/shogun/machine/gp/StudentsTLikelihood.h +++ b/src/shogun/machine/gp/StudentsTLikelihood.h @@ -125,7 +125,7 @@ class CStudentsTLikelihood: public CLikelihoodModel * * @return log likelihood */ - virtual float64_t get_log_probability_f(CLabels* lab, + virtual SGVector get_log_probability_f(CLabels* lab, SGVector func); /** get derivative of log likelihood \f$log(P(y|f))\f$ with diff --git a/tests/unit/machine/gp/GaussianLikelihood_unittest.cc b/tests/unit/machine/gp/GaussianLikelihood_unittest.cc index 33b04641a7a..461ef65d566 100644 --- a/tests/unit/machine/gp/GaussianLikelihood_unittest.cc +++ b/tests/unit/machine/gp/GaussianLikelihood_unittest.cc @@ -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 @@ -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::sum(likelihood->get_log_probability_f(labels, func)); // comparison of log likelihood with result from GPML package EXPECT_NEAR(lp, 4.2428, 1E-4); diff --git a/tests/unit/machine/gp/StudentsTLikelihood_unittest.cc b/tests/unit/machine/gp/StudentsTLikelihood_unittest.cc index c9d5a57e146..bd29aefe08e 100644 --- a/tests/unit/machine/gp/StudentsTLikelihood_unittest.cc +++ b/tests/unit/machine/gp/StudentsTLikelihood_unittest.cc @@ -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 @@ -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::sum(likelihood->get_log_probability_f(labels, func)); // comparison of log likelihood with result from GPML package EXPECT_NEAR(lp, 2.8647, 1E-4);