22 #include <shogun/lib/external/brent.h>
25 using namespace shogun;
26 using namespace Eigen;
31 #ifndef DOXYGEN_SHOULD_SKIP_THIS
34 class CPsiLine :
public func_base
49 virtual double operator() (
double x)
51 Map<VectorXd> eigen_f(f->vector, f->vlen);
52 Map<VectorXd> eigen_m(m->vector, m->vlen);
55 (*alpha)=start_alpha+x*dalpha;
56 eigen_f=K*(*alpha)*
CMath::sq(scale)+eigen_m;
59 (*dlp)=lik->get_log_probability_derivative_f(lab, (*f), 1);
61 (*W)=lik->get_log_probability_derivative_f(lab, (*f), 2);
65 float64_t result = (*alpha).dot(eigen_f-eigen_m)/2.0-
86 void CLaplacianInferenceMethod::init()
90 m_opt_tolerance=1e-10;
122 Map<VectorXd> eigen_mu(m_mu.
vector, m_mu.
vlen);
128 Map<VectorXd> eigen_mean(mean.
vector, mean.
vlen);
136 if (eigen_W.minCoeff()<0)
144 result=(eigen_alpha.dot(eigen_mu-eigen_mean))/2.0-
145 lp+log(lu.determinant())/2.0;
149 result=eigen_alpha.
dot(eigen_mu-eigen_mean)/2.0-lp+
150 eigen_L.diagonal().array().log().sum();
199 MatrixXd eigen_V=eigen_L.triangularView<Upper>().adjoint().solve(
220 if (eigen_W.minCoeff() < 0)
223 VectorXd eigen_iW = (VectorXd::Ones(W.
vlen)).cwiseQuotient(eigen_W);
225 FullPivLU<MatrixXd> lu(
237 (eigen_sW*eigen_sW.transpose()).cwiseProduct(eigen_ktrtr*
CMath::sq(
m_scale))+
240 eigen_L = L.matrixU();
252 Map<VectorXd> eigen_mean(mean.
vector, mean.
vlen);
259 Map<VectorXd> eigen_mu(m_mu, m_mu.
vlen);
288 Psi_New=eigen_alpha.dot(eigen_mu-eigen_mean)/2.0-
294 if (Psi_Def < Psi_New)
314 while (Psi_Old-Psi_New>m_tolerance && iter<m_iter)
317 Map<VectorXd> eigen_dlp(dlp.
vector, dlp.
vlen);
322 if (eigen_W.minCoeff() < 0)
338 eigen_W+=(2.0/df)*eigen_dlp.cwiseProduct(eigen_dlp);
342 eigen_sW=eigen_W.cwiseSqrt();
344 LLT<MatrixXd> L((eigen_sW*eigen_sW.transpose()).cwiseProduct(eigen_ktrtr*
CMath::sq(
m_scale))+
347 VectorXd b=eigen_W.cwiseProduct(eigen_mu - eigen_mean)+eigen_dlp;
349 VectorXd dalpha=b-eigen_sW.cwiseProduct(
350 L.solve(eigen_sW.cwiseProduct(eigen_ktrtr*b*
CMath::sq(
m_scale))))-eigen_alpha;
358 func.start_alpha=eigen_alpha;
359 func.alpha=&eigen_alpha;
368 Psi_New=local_min(0, m_opt_max, m_opt_tolerance, func, x);
386 if (eigen_W.minCoeff()>0)
387 eigen_sW=eigen_W.cwiseSqrt();
397 Map<VectorXd> eigen_dlp(dlp.
vector, dlp.
vlen);
398 Map<VectorXd> eigen_d3lp(d3lp.
vector, d3lp.
vlen);
411 if (eigen_W.minCoeff()<0)
426 eigen_Z=eigen_L.triangularView<Upper>().adjoint().solve(
427 MatrixXd(eigen_sW.asDiagonal()));
428 eigen_Z=eigen_L.triangularView<Upper>().solve(eigen_Z);
429 eigen_Z=eigen_sW.asDiagonal()*eigen_Z;
432 MatrixXd C=eigen_L.triangularView<Upper>().adjoint().solve(
437 (C.cwiseProduct(C)).colwise().sum().adjoint())/2.0;
442 Map<VectorXd> eigen_dfhat(m_dfhat.
vector, m_dfhat.
vlen);
445 eigen_dfhat=eigen_g.cwiseProduct(eigen_d3lp);
451 REQUIRE(!strcmp(param->
m_name,
"scale"),
"Can't compute derivative of "
452 "the nagative log marginal likelihood wrt %s.%s parameter\n",
458 Map<VectorXd> eigen_dfhat(m_dfhat.
vector, m_dfhat.
vlen);
459 Map<VectorXd> eigen_dlp(dlp.
vector, dlp.
vlen);
465 MatrixXd dK=eigen_K*
m_scale*2.0;
468 result[0]=(eigen_Z.cwiseProduct(dK)).sum()/2.0-
469 (eigen_alpha.adjoint()*dK).dot(eigen_alpha)/2.0;
472 VectorXd b=dK*eigen_dlp;
487 Map<VectorXd> eigen_dfhat(m_dfhat.
vector, m_dfhat.
vlen);
498 Map<VectorXd> eigen_lp_dhyp(lp_dhyp.
vector, lp_dhyp.
vlen);
499 Map<VectorXd> eigen_dlp_dhyp(dlp_dhyp.
vector, dlp_dhyp.
vlen);
500 Map<VectorXd> eigen_d2lp_dhyp(d2lp_dhyp.
vector, d2lp_dhyp.
vlen);
505 VectorXd b=eigen_K*eigen_dlp_dhyp;
508 result[0]=-eigen_g.
dot(eigen_d2lp_dhyp)-eigen_lp_dhyp.sum()-
520 Map<VectorXd> eigen_dfhat(m_dfhat.
vector, m_dfhat.
vlen);
521 Map<VectorXd> eigen_dlp(dlp.
vector, dlp.
vlen);
530 "Length of the parameter %s should not be NULL\n", param->
m_name)
550 result[i]=(eigen_Z.cwiseProduct(eigen_dK)).sum()/2.0-
551 (eigen_alpha.adjoint()*eigen_dK).dot(eigen_alpha)/2.0;
554 VectorXd b=eigen_dK*eigen_dlp;
570 Map<VectorXd> eigen_dfhat(m_dfhat.
vector, m_dfhat.
vlen);
579 "Length of the parameter %s should not be NULL\n", param->
m_name)
597 Map<VectorXd> eigen_dmu(dmu.
vector, dmu.
vlen);
600 result[i]=-eigen_alpha.
dot(eigen_dmu)-eigen_dfhat.dot(eigen_dmu-