25 using namespace Eigen;
40 void CFITCInferenceMethod::init()
42 SG_ADD((
CSGObject**)&m_latent_features,
"latent_features",
"Latent features",
45 m_latent_features=NULL;
60 SG_SERROR(
"Provided inference is not of type CFITCInferenceMethod!\n")
79 "FITC inference method can only use Gaussian likelihood function\n")
81 "of CRegressionLabels\n")
82 REQUIRE(m_latent_features,
"Latent features should not be NULL\n")
84 "Number of latent features must be greater than zero\n")
110 Map<MatrixXd> eigen_chol_utr(m_chol_utr.
matrix, m_chol_utr.
num_rows,
112 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
114 Map<VectorXd> eigen_be(m_be.
vector, m_be.
vlen);
118 float64_t result=eigen_chol_utr.diagonal().array().log().sum()+
119 (eigen_dg.array().log().sum()+eigen_r.dot(eigen_r)-eigen_be.dot(eigen_be)+
182 LLT<MatrixXd> Luu(eigen_kuu*
CMath::sq(
m_scale)+m_ind_noise*MatrixXd::Identity(
190 eigen_chol_uu=Luu.matrixU();
193 MatrixXd V=eigen_chol_uu.triangularView<Upper>().adjoint().solve(eigen_ktru*
199 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
202 VectorXd::Ones(m_dg.
vlen)-(V.cwiseProduct(V)).colwise().sum().adjoint();
205 LLT<MatrixXd> Lu(V*((VectorXd::Ones(m_dg.
vlen)).cwiseQuotient(eigen_dg)).asDiagonal()*
211 Map<MatrixXd> eigen_chol_utr(m_chol_utr.matrix, m_chol_utr.num_rows,
212 m_chol_utr.num_cols);
213 eigen_chol_utr=Lu.matrixU();
222 VectorXd sqrt_dg=eigen_dg.array().
sqrt();
228 eigen_r=(eigen_y-eigen_m).cwiseQuotient(sqrt_dg);
232 Map<VectorXd> eigen_be(m_be.
vector, m_be.
vlen);
233 eigen_be=eigen_chol_utr.triangularView<Upper>().adjoint().solve(
234 V*eigen_r.cwiseQuotient(sqrt_dg));
237 MatrixXd iKuu=Luu.solve(MatrixXd::Identity(m_kuu.
num_rows, m_kuu.
num_cols));
240 MatrixXd eigen_prod=eigen_chol_utr*eigen_chol_uu;
244 eigen_chol=eigen_prod.triangularView<Upper>().adjoint().solve(
246 eigen_chol=eigen_prod.triangularView<Upper>().solve(eigen_chol)-iKuu;
253 Map<MatrixXd> eigen_chol_utr(m_chol_utr.
matrix, m_chol_utr.
num_rows,
255 Map<VectorXd> eigen_be(m_be.
vector, m_be.
vlen);
262 eigen_alpha=eigen_chol_utr.triangularView<Upper>().solve(eigen_be);
263 eigen_alpha=eigen_chol_uu.triangularView<Upper>().solve(eigen_alpha);
274 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
275 Map<VectorXd> eigen_be(m_be.
vector, m_be.
vlen);
286 MatrixXd V=eigen_Luu.triangularView<Upper>().adjoint().solve(eigen_Ktru*
291 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
294 eigen_al=((eigen_y-eigen_m)-(V.adjoint()*
295 eigen_Lu.triangularView<Upper>().solve(eigen_be))).cwiseQuotient(eigen_dg);
298 MatrixXd iKuu=eigen_Luu.triangularView<Upper>().adjoint().solve(
300 iKuu=eigen_Luu.triangularView<Upper>().solve(iKuu);
312 eigen_w=eigen_B*eigen_al;
319 eigen_W=eigen_Lu.triangularView<Upper>().adjoint().solve(V*VectorXd::Ones(
320 m_dg.
vlen).cwiseQuotient(eigen_dg).asDiagonal());
326 REQUIRE(!strcmp(param->
m_name,
"scale"),
"Can't compute derivative of " 327 "the nagative log marginal likelihood wrt %s.%s parameter\n",
331 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
332 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
343 Map<VectorXd> ddiagKi(deriv_trtr.
vector, deriv_trtr.
vlen);
353 MatrixXd R=2*dKui-dKuui*eigen_B;
356 VectorXd v=ddiagKi-R.cwiseProduct(eigen_B).colwise().sum().adjoint();
362 result[0]=(ddiagKi.dot(VectorXd::Ones(m_dg.
vlen).cwiseQuotient(eigen_dg))+
363 eigen_w.dot(dKuui*eigen_w-2*(dKui*eigen_al))-
364 eigen_al.dot(v.cwiseProduct(eigen_al))-
365 eigen_W.cwiseProduct(eigen_W).colwise().sum().dot(v)-
366 (R*eigen_W.adjoint()).cwiseProduct(eigen_B*eigen_W.adjoint()).sum())/2.0;
374 REQUIRE(!strcmp(param->
m_name,
"sigma"),
"Can't compute derivative of " 375 "the nagative log marginal likelihood wrt %s.%s parameter\n",
379 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
380 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
392 result[0]=
CMath::sq(sigma)*(VectorXd::Ones(m_dg.
vlen).cwiseQuotient(
393 eigen_dg).sum()-eigen_W.cwiseProduct(eigen_W).sum()-eigen_al.dot(eigen_al));
396 MatrixXd R=-dKuui*eigen_B;
397 VectorXd v=-R.cwiseProduct(eigen_B).colwise().sum().adjoint();
399 result[0]=result[0]+((eigen_w.dot(dKuui*eigen_w))-eigen_al.dot(
400 v.cwiseProduct(eigen_al))-eigen_W.cwiseProduct(eigen_W).colwise().sum().dot(v)-
401 (R*eigen_W.adjoint()).cwiseProduct(eigen_B*eigen_W.adjoint()).sum())/2.0;
410 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
411 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
422 "Length of the parameter %s should not be NULL\n", param->
m_name)
460 Map<VectorXd> ddiagKi(deriv_trtr.
vector, deriv_trtr.
vlen);
471 MatrixXd R=2*dKui-dKuui*eigen_B;
474 VectorXd v=ddiagKi-R.cwiseProduct(eigen_B).colwise().sum().adjoint();
478 result[i]=(ddiagKi.dot(VectorXd::Ones(m_dg.
vlen).cwiseQuotient(eigen_dg))+
479 eigen_w.dot(dKuui*eigen_w-2*(dKui*eigen_al))-
480 eigen_al.dot(v.cwiseProduct(eigen_al))-
481 eigen_W.cwiseProduct(eigen_W).colwise().sum().dot(v)-
482 (R*eigen_W.adjoint()).cwiseProduct(eigen_B*eigen_W.adjoint()).sum())/2.0;
492 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
500 "Length of the parameter %s should not be NULL\n", param->
m_name)
518 Map<VectorXd> eigen_dmu(dmu.
vector, dmu.
vlen);
521 result[i]=-eigen_dmu.
dot(eigen_al);
virtual const char * get_name() const =0
virtual bool init(CFeatures *lhs, CFeatures *rhs)
virtual void update_alpha()
virtual SGVector< float64_t > get_derivative_wrt_inference_method(const TParameter *param)
static float64_t dot(const bool *v1, const bool *v2, int32_t n)
compute dot product between v1 and v2 (blas optimized)
virtual void check_members() const
virtual ELabelType get_label_type() const =0
Class that models Gaussian likelihood.
virtual const char * get_name() const
Real Labels are real-valued labels.
SGVector< float64_t > m_alpha
The Inference Method base class.
virtual void update_chol()
virtual SGVector< float64_t > get_diagonal_vector()
The class Labels models labels, i.e. class assignments of objects.
real valued labels (e.g. for regression, classifier outputs)
virtual void update_train_kernel()
virtual ~CFITCInferenceMethod()
virtual int32_t get_num_vectors() const =0
virtual SGMatrix< float64_t > get_cholesky()
#define SG_NOTIMPLEMENTED
virtual SGVector< float64_t > get_posterior_mean()
virtual void check_members() const
void sqrt()
square root of vector elements
virtual SGVector< float64_t > get_mean_vector(const CFeatures *features) const =0
An abstract class of the mean function.
SGMatrix< float64_t > get_kernel_matrix()
virtual bool update_parameter_hash()
virtual float64_t get_negative_log_marginal_likelihood()
SGVector< T > get_diagonal_vector() const
SGMatrix< float64_t > m_L
Class SGObject is the base class of all shogun objects.
virtual SGVector< float64_t > get_derivative_wrt_kernel(const TParameter *param)
virtual ELikelihoodModelType get_model_type() const
virtual void update_train_kernel()
static void fill_vector(T *vec, int32_t len, T value)
virtual EInferenceType get_inference_type() const
static CGaussianLikelihood * obtain_from_generic(CLikelihoodModel *lik)
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
The class Features is the base class of all feature objects.
The Fully Independent Conditional Training inference method class.
virtual SGVector< float64_t > get_derivative_wrt_likelihood_model(const TParameter *param)
virtual SGMatrix< float64_t > get_parameter_gradient(const TParameter *param, index_t index=-1)
static float64_t log(float64_t v)
virtual void set_latent_features(CFeatures *feat)
virtual void update_deriv()
virtual SGVector< float64_t > get_derivative_wrt_mean(const TParameter *param)
virtual SGVector< float64_t > get_alpha()
The Likelihood model base class.
SGMatrix< float64_t > m_ktrtr
CLikelihoodModel * m_model
virtual SGMatrix< float64_t > get_posterior_covariance()
static CFITCInferenceMethod * obtain_from_generic(CInferenceMethod *inference)
static const float64_t PI