24 using namespace shogun;
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 ELabelType get_label_type() const =0
Class that models Gaussian likelihood.
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 const char * get_name() const
virtual ELikelihoodModelType get_model_type() const
virtual int32_t get_num_vectors() const =0
virtual SGMatrix< float64_t > get_cholesky()
#define SG_NOTIMPLEMENTED
virtual SGVector< float64_t > get_posterior_mean()
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()
virtual void check_members() 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 void update_train_kernel()
static void fill_vector(T *vec, int32_t len, T value)
static CGaussianLikelihood * obtain_from_generic(CLikelihoodModel *lik)
virtual SGVector< float64_t > get_parameter_derivative(const CFeatures *features, const TParameter *param, index_t index=-1)
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 check_members() const
virtual void update_deriv()
virtual EInferenceType get_inference_type() const
SGVector< T > get_diagonal_vector() const
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