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)+
184 LLT<MatrixXd> Luu(eigen_kuu*
CMath::sq(
m_scale)+m_ind_noise*MatrixXd::Identity(
192 eigen_chol_uu=Luu.matrixU();
195 MatrixXd V=eigen_chol_uu.triangularView<Upper>().adjoint().solve(eigen_ktru*
201 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
204 VectorXd::Ones(m_dg.
vlen)-(V.cwiseProduct(V)).colwise().sum().adjoint();
207 LLT<MatrixXd> Lu(V*((VectorXd::Ones(m_dg.
vlen)).cwiseQuotient(eigen_dg)).asDiagonal()*
213 Map<MatrixXd> eigen_chol_utr(m_chol_utr.matrix, m_chol_utr.num_rows,
214 m_chol_utr.num_cols);
215 eigen_chol_utr=Lu.matrixU();
224 VectorXd sqrt_dg=eigen_dg.array().
sqrt();
230 eigen_r=(eigen_y-eigen_m).cwiseQuotient(sqrt_dg);
234 Map<VectorXd> eigen_be(m_be.
vector, m_be.
vlen);
235 eigen_be=eigen_chol_utr.triangularView<Upper>().adjoint().solve(
236 V*eigen_r.cwiseQuotient(sqrt_dg));
239 MatrixXd iKuu=Luu.solve(MatrixXd::Identity(m_kuu.
num_rows, m_kuu.
num_cols));
242 MatrixXd eigen_prod=eigen_chol_utr*eigen_chol_uu;
246 eigen_chol=eigen_prod.triangularView<Upper>().adjoint().solve(
248 eigen_chol=eigen_prod.triangularView<Upper>().solve(eigen_chol)-iKuu;
255 Map<MatrixXd> eigen_chol_utr(m_chol_utr.
matrix, m_chol_utr.
num_rows,
257 Map<VectorXd> eigen_be(m_be.
vector, m_be.
vlen);
264 eigen_alpha=eigen_chol_utr.triangularView<Upper>().solve(eigen_be);
265 eigen_alpha=eigen_chol_uu.triangularView<Upper>().solve(eigen_alpha);
276 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
277 Map<VectorXd> eigen_be(m_be.
vector, m_be.
vlen);
288 MatrixXd V=eigen_Luu.triangularView<Upper>().adjoint().solve(eigen_Ktru*
293 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
296 eigen_al=((eigen_y-eigen_m)-(V.adjoint()*
297 eigen_Lu.triangularView<Upper>().solve(eigen_be))).cwiseQuotient(eigen_dg);
300 MatrixXd iKuu=eigen_Luu.triangularView<Upper>().adjoint().solve(
302 iKuu=eigen_Luu.triangularView<Upper>().solve(iKuu);
314 eigen_w=eigen_B*eigen_al;
321 eigen_W=eigen_Lu.triangularView<Upper>().adjoint().solve(V*VectorXd::Ones(
322 m_dg.
vlen).cwiseQuotient(eigen_dg).asDiagonal());
328 REQUIRE(!strcmp(param->
m_name,
"scale"),
"Can't compute derivative of "
329 "the nagative log marginal likelihood wrt %s.%s parameter\n",
333 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
334 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
345 Map<VectorXd> ddiagKi(deriv_trtr.
vector, deriv_trtr.
vlen);
355 MatrixXd R=2*dKui-dKuui*eigen_B;
358 VectorXd v=ddiagKi-R.cwiseProduct(eigen_B).colwise().sum().adjoint();
364 result[0]=(ddiagKi.dot(VectorXd::Ones(m_dg.
vlen).cwiseQuotient(eigen_dg))+
365 eigen_w.dot(dKuui*eigen_w-2*(dKui*eigen_al))-
366 eigen_al.dot(v.cwiseProduct(eigen_al))-
367 eigen_W.cwiseProduct(eigen_W).colwise().sum().dot(v)-
368 (R*eigen_W.adjoint()).cwiseProduct(eigen_B*eigen_W.adjoint()).sum())/2.0;
376 REQUIRE(!strcmp(param->
m_name,
"sigma"),
"Can't compute derivative of "
377 "the nagative log marginal likelihood wrt %s.%s parameter\n",
381 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
382 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
394 result[0]=
CMath::sq(sigma)*(VectorXd::Ones(m_dg.
vlen).cwiseQuotient(
395 eigen_dg).sum()-eigen_W.cwiseProduct(eigen_W).sum()-eigen_al.dot(eigen_al));
398 MatrixXd R=-dKuui*eigen_B;
399 VectorXd v=-R.cwiseProduct(eigen_B).colwise().sum().adjoint();
401 result[0]=result[0]+((eigen_w.dot(dKuui*eigen_w))-eigen_al.dot(
402 v.cwiseProduct(eigen_al))-eigen_W.cwiseProduct(eigen_W).colwise().sum().dot(v)-
403 (R*eigen_W.adjoint()).cwiseProduct(eigen_B*eigen_W.adjoint()).sum())/2.0;
412 Map<VectorXd> eigen_dg(m_dg.
vector, m_dg.
vlen);
413 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
424 "Length of the parameter %s should not be NULL\n", param->
m_name)
464 Map<VectorXd> ddiagKi(deriv_trtr.
vector, deriv_trtr.
vlen);
475 MatrixXd R=2*dKui-dKuui*eigen_B;
478 VectorXd v=ddiagKi-R.cwiseProduct(eigen_B).colwise().sum().adjoint();
482 result[i]=(ddiagKi.dot(VectorXd::Ones(m_dg.
vlen).cwiseQuotient(eigen_dg))+
483 eigen_w.dot(dKuui*eigen_w-2*(dKui*eigen_al))-
484 eigen_al.dot(v.cwiseProduct(eigen_al))-
485 eigen_W.cwiseProduct(eigen_W).colwise().sum().dot(v)-
486 (R*eigen_W.adjoint()).cwiseProduct(eigen_B*eigen_W.adjoint()).sum())/2.0;
496 Map<VectorXd> eigen_al(m_al.
vector, m_al.
vlen);
504 "Length of the parameter %s should not be NULL\n", param->
m_name)
522 Map<VectorXd> eigen_dmu(dmu.
vector, dmu.
vlen);
525 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