22 #include <shogun/lib/external/brent.h>
26 using namespace Eigen;
31 #ifndef DOXYGEN_SHOULD_SKIP_THIS
34 class CPsiLine :
public func_base
49 virtual double operator() (
double x)
55 (*alpha)=start_alpha+x*dalpha;
56 eigen_f=K*(*alpha)*
CMath::exp(log_scale*2.0)+eigen_m;
65 float64_t result = (*alpha).dot(eigen_f-eigen_m)/2.0-
86 void CSingleLaplacianInferenceMethod::init()
111 SG_SERROR(
"Provided inference is not of type CSingleLaplacianInferenceMethod\n")
142 if (eigen_W.minCoeff()<0)
150 result=(eigen_alpha.dot(eigen_mu-eigen_mean))/2.0-
151 lp+log(lu.determinant())/2.0;
155 result=eigen_alpha.dot(eigen_mu-eigen_mean)/2.0-lp+
156 eigen_L.diagonal().array().log().sum();
172 MatrixXd eigen_V=eigen_L.triangularView<Upper>().adjoint().solve(
198 if (eigen_W.minCoeff()>0)
199 eigen_sW=eigen_W.cwiseSqrt();
202 eigen_sW=((eigen_W.array().abs()+eigen_W.array())/2).sqrt()-((eigen_W.array().abs()-eigen_W.array())/2).sqrt();
211 if (eigen_W.minCoeff() < 0)
214 FullPivLU<MatrixXd> lu(
221 eigen_L=eigen_W.asDiagonal()*eigen_L;
230 eigen_L = L.matrixU();
283 Psi_New=eigen_alpha.dot(eigen_mu-eigen_mean)/2.0-
289 if (Psi_Def < Psi_New)
336 if (eigen_W.minCoeff() < 0)
352 eigen_W+=(2.0/df)*eigen_dlp.cwiseProduct(eigen_dlp);
356 eigen_sW=eigen_W.cwiseSqrt();
358 LLT<MatrixXd> L((eigen_sW*eigen_sW.transpose()).cwiseProduct(eigen_ktrtr*
CMath::exp(
m_log_scale*2.0))+
361 VectorXd b=eigen_W.cwiseProduct(eigen_mu - eigen_mean)+eigen_dlp;
363 VectorXd dalpha=b-eigen_sW.cwiseProduct(
372 func.start_alpha=eigen_alpha;
373 func.alpha=&eigen_alpha;
387 SG_WARNING(
"Max iterations (%d) reached, but convergence level (%f) is not yet below tolerance (%f)\n",
m_iter, Psi_Old-Psi_New,
m_tolerance);
413 if (eigen_W.minCoeff()<0)
428 eigen_Z=eigen_L.triangularView<Upper>().adjoint().solve(
430 eigen_Z=eigen_L.triangularView<Upper>().solve(eigen_Z);
431 eigen_Z=eigen_sW.asDiagonal()*eigen_Z;
434 MatrixXd C=eigen_L.triangularView<Upper>().adjoint().solve(
439 (C.cwiseProduct(C)).colwise().sum().adjoint())/2.0;
447 eigen_dfhat=eigen_g.cwiseProduct(eigen_d3lp);
453 REQUIRE(!strcmp(param->
m_name,
"log_scale"),
"Can't compute derivative of "
454 "the nagative log marginal likelihood wrt %s.%s parameter\n",
468 result[0]=(eigen_Z.cwiseProduct(eigen_K)).sum()/2.0-
469 (eigen_alpha.adjoint()*eigen_K).
dot(eigen_alpha)/2.0;
472 VectorXd b=eigen_K*eigen_dlp;
506 VectorXd b=eigen_K*eigen_dlp_dhyp;
509 result[0]=-eigen_g.dot(eigen_d2lp_dhyp)-eigen_lp_dhyp.sum()-
525 REQUIRE(param,
"Param not set\n");
527 int64_t len=
const_cast<TParameter *
>(param)->m_datatype.get_num_elements();
542 result[i]=(eigen_Z.cwiseProduct(eigen_dK)).sum()/2.0-
543 (eigen_alpha.adjoint()*eigen_dK).
dot(eigen_alpha)/2.0;
546 VectorXd b=eigen_dK*eigen_dlp;
566 REQUIRE(param,
"Param not set\n");
568 int64_t len=
const_cast<TParameter *
>(param)->m_datatype.get_num_elements();
583 result[i]=-eigen_alpha.dot(eigen_dmu)-eigen_dfhat.dot(eigen_dmu-
600 eigen_res=eigen_mu-eigen_mean;
virtual SGVector< float64_t > get_log_probability_f(const CLabels *lab, SGVector< float64_t > func) const =0
SGVector< float64_t > m_dlp
virtual void update_chol()
virtual void update_parameter_hash()
SGVector< float64_t > m_alpha
The Inference Method base class.
Vector::Scalar dot(Vector a, Vector b)
The class Labels models labels, i.e. class assignments of objects.
static const float64_t INFTY
infinity
virtual void update_alpha()
virtual SGVector< float64_t > get_second_derivative(const CLabels *lab, SGVector< float64_t > func, const TParameter *param) const
virtual int32_t get_num_labels() const =0
virtual void update_approx_cov()
virtual float64_t get_negative_log_marginal_likelihood()
virtual ELikelihoodModelType get_model_type() const
virtual void update_init()
The Laplace approximation inference method base class.
virtual SGVector< float64_t > get_mean_vector(const CFeatures *features) const =0
float64_t get_degrees_freedom() const
An abstract class of the mean function.
void scale(T alpha)
Scale vector inplace.
virtual SGVector< float64_t > get_derivative_wrt_mean(const TParameter *param)
virtual SGVector< float64_t > get_posterior_mean()
static CSingleLaplacianInferenceMethod * obtain_from_generic(CInferenceMethod *inference)
The SingleLaplace approximation inference method class for regression and binary Classification.
SGMatrix< float64_t > m_L
virtual SGVector< float64_t > get_derivative_wrt_inference_method(const TParameter *param)
virtual SGVector< float64_t > get_derivative_wrt_likelihood_model(const TParameter *param)
SGVector< float64_t > m_sW
SGVector< float64_t > m_d2lp
SGVector< float64_t > m_mu
static T sum(T *vec, int32_t len)
Return sum(vec)
Matrix< float64_t,-1,-1, 0,-1,-1 > MatrixXd
virtual void update_deriv()
SGVector< float64_t > m_dfhat
SGVector< float64_t > m_g
Class that models a Student's-t likelihood.
virtual SGVector< float64_t > get_parameter_derivative(const CFeatures *features, const TParameter *param, index_t index=-1)
all of classes and functions are contained in the shogun namespace
virtual ~CSingleLaplacianInferenceMethod()
The class Features is the base class of all feature objects.
float64_t m_opt_tolerance
static float64_t exp(float64_t x)
virtual SGMatrix< float64_t > get_parameter_gradient(const TParameter *param, index_t index=-1)
virtual SGVector< float64_t > get_diagonal_vector()
virtual SGVector< float64_t > get_derivative_wrt_kernel(const TParameter *param)
CSingleLaplacianInferenceMethod()
SGVector< T > clone() const
virtual EInferenceType get_inference_type() const
virtual SGVector< float64_t > get_log_probability_derivative_f(const CLabels *lab, SGVector< float64_t > func, index_t i) const =0
static void inverse(SGMatrix< float64_t > matrix)
inverses square matrix in-place
virtual SGVector< float64_t > get_third_derivative(const CLabels *lab, SGVector< float64_t > func, const TParameter *param) const
SGVector< float64_t > m_W
static CStudentsTLikelihood * obtain_from_generic(CLikelihoodModel *likelihood)
SGMatrix< float64_t > m_Sigma
virtual SGVector< float64_t > get_first_derivative(const CLabels *lab, SGVector< float64_t > func, const TParameter *param) const
SGVector< float64_t > m_d3lp
virtual void compute_gradient()
SGMatrix< float64_t > m_Z
virtual bool parameter_hash_changed()
The Likelihood model base class.
SGMatrix< float64_t > m_ktrtr
CLikelihoodModel * m_model
virtual const char * get_name() const