26 using namespace shogun;
27 using namespace Eigen;
32 #ifndef DOXYGEN_SHOULD_SKIP_THIS
66 void set_sigma(
float64_t sigma) { m_sigma=sigma; }
119 void set_sigma(
float64_t sigma) { m_sigma=sigma; }
160 class CProductFunction :
public CFunction
176 virtual ~CProductFunction()
190 return (*m_f)(x)*(*m_g)(x);
205 CLinearFunction() { }
207 virtual ~CLinearFunction() { }
222 class CQuadraticFunction :
public CFunction
226 CQuadraticFunction() { }
228 virtual ~CQuadraticFunction() { }
252 REQUIRE(sigma>0.0,
"Scale parameter must be greater than zero\n")
253 REQUIRE(df>1.0,
"Number of degrees of freedom must be greater than one\n")
260 void CStudentsTLikelihood::init()
278 SG_SERROR(
"Provided likelihood is not of type CStudentsTLikelihood!\n")
294 Map<VectorXd> eigen_result(result.
vector, result.
vlen);
300 eigen_result+=
CMath::sq(m_sigma)*m_df/(m_df-2.0)*
301 VectorXd::Ones(result.
vlen);
311 REQUIRE(lab,
"Labels are required (lab should not be NULL)\n")
313 "Labels must be type of CRegressionLabels\n")
315 "length of the function vector\n")
317 Map<VectorXd> eigen_f(func.
vector, func.
vlen);
328 VectorXd::Ones(r.
vlen);
331 eigen_r=eigen_y-eigen_f;
332 eigen_r=eigen_r.cwiseProduct(eigen_r)/(m_df*
CMath::sq(m_sigma));
333 eigen_r=eigen_lZ-(m_df+1)*
334 (eigen_r+VectorXd::Ones(r.
vlen)).array().log().matrix()/2.0;
343 REQUIRE(lab,
"Labels are required (lab should not be NULL)\n")
345 "Labels must be type of CRegressionLabels\n")
347 "length of the function vector\n")
348 REQUIRE(i>=1 && i<=3,
"Index for derivative should be 1, 2 or 3\n")
350 Map<VectorXd> eigen_f(func.
vector, func.
vlen);
359 eigen_r=eigen_y-eigen_f;
360 VectorXd eigen_r2=eigen_r.cwiseProduct(eigen_r);
363 VectorXd a=eigen_r2+VectorXd::Ones(r.
vlen)*m_df*
CMath::sq(m_sigma);
369 eigen_r=(m_df+1)*eigen_r.cwiseQuotient(a);
375 VectorXd b=eigen_r2-VectorXd::Ones(r.
vlen)*m_df*CMath::sq(m_sigma);
377 eigen_r=(m_df+1)*b.cwiseQuotient(a.cwiseProduct(a));
383 VectorXd c=eigen_r2-VectorXd::Ones(r.
vlen)*3*m_df*CMath::sq(m_sigma);
384 VectorXd a2=a.cwiseProduct(a);
386 eigen_r=(m_df+1)*2*eigen_r.cwiseProduct(c).cwiseQuotient(
397 REQUIRE(lab,
"Labels are required (lab should not be NULL)\n")
399 "Labels must be type of CRegressionLabels\n")
401 "length of the function vector\n")
404 Map<VectorXd> eigen_r(r.vector, r.vlen);
406 Map<VectorXd> eigen_f(func.
vector, func.
vlen);
412 eigen_r=eigen_y-eigen_f;
413 VectorXd eigen_r2=eigen_r.cwiseProduct(eigen_r);
415 if (!strcmp(param->
m_name,
"df"))
423 eigen_r-=m_df*(VectorXd::Ones(r.vlen)+
424 eigen_r2/(m_df*
CMath::sq(m_sigma))).array().log().matrix()/2.0;
426 eigen_r+=(m_df/2.0+0.5)*eigen_r2.cwiseQuotient(
427 eigen_r2+VectorXd::Ones(r.vlen)*(m_df*
CMath::sq(m_sigma)));
429 eigen_r*=(1.0-1.0/m_df);
433 else if (!strcmp(param->
m_name,
"sigma"))
437 eigen_r=(m_df+1)*eigen_r2.cwiseQuotient(eigen_r2+
438 VectorXd::Ones(r.vlen)*(m_df*
CMath::sq(m_sigma)));
439 eigen_r-=VectorXd::Ones(r.vlen);
451 REQUIRE(lab,
"Labels are required (lab should not be NULL)\n")
453 "Labels must be type of CRegressionLabels\n")
455 "length of the function vector\n")
458 Map<VectorXd> eigen_r(r.vector, r.vlen);
460 Map<VectorXd> eigen_f(func.
vector, func.
vlen);
466 eigen_r=eigen_y-eigen_f;
467 VectorXd eigen_r2=eigen_r.cwiseProduct(eigen_r);
470 VectorXd a=eigen_r2+
CMath::sq(m_sigma)*m_df*VectorXd::Ones(r.vlen);
471 VectorXd a2=a.cwiseProduct(a);
473 if (!strcmp(param->
m_name,
"df"))
477 eigen_r=m_df*eigen_r.cwiseProduct(a-
CMath::sq(m_sigma)*(m_df+1.0)*
478 VectorXd::Ones(r.vlen)).cwiseQuotient(a2);
479 eigen_r*=(1.0-1.0/m_df);
483 else if (!strcmp(param->
m_name,
"sigma"))
487 eigen_r=-(m_df+1.0)*2*m_df*
CMath::sq(m_sigma)*
488 eigen_r.cwiseQuotient(a2);
500 REQUIRE(lab,
"Labels are required (lab should not be NULL)\n")
502 "Labels must be type of CRegressionLabels\n")
504 "length of the function vector\n")
507 Map<VectorXd> eigen_r(r.vector, r.vlen);
509 Map<VectorXd> eigen_f(func.
vector, func.
vlen);
515 eigen_r=eigen_y-eigen_f;
516 VectorXd eigen_r2=eigen_r.cwiseProduct(eigen_r);
519 VectorXd a=eigen_r2+
CMath::sq(m_sigma)*m_df*VectorXd::Ones(r.vlen);
520 VectorXd a3=(a.cwiseProduct(a)).cwiseProduct(a);
522 if (!strcmp(param->
m_name,
"df"))
528 eigen_r=m_df*(eigen_r2.cwiseProduct(eigen_r2-3*sigma2*(1.0+m_df)*
529 VectorXd::Ones(r.vlen))+(m_df*
CMath::sq(sigma2))*VectorXd::Ones(r.vlen));
530 eigen_r=eigen_r.cwiseQuotient(a3);
532 eigen_r*=(1.0-1.0/m_df);
536 else if (!strcmp(param->
m_name,
"sigma"))
540 eigen_r=(m_df+1.0)*2*m_df*
CMath::sq(m_sigma)*
541 (a-4.0*eigen_r2).cwiseQuotient(a3);
557 "Length of the vector of means (%d), length of the vector of "
558 "variances (%d) and number of labels (%d) should be the same\n",
561 "Labels must be type of CRegressionLabels\n")
568 "length of the vector of variances (%d) should be the same\n",
576 CNormalPDF* f=
new CNormalPDF();
579 CStudentsTPDF* g=
new CStudentsTPDF();
582 g->set_sigma(m_sigma);
585 CProductFunction* h=
new CProductFunction(f, g);
616 REQUIRE(lab,
"Labels are required (lab should not be NULL)\n")
618 "Length of the vector of means (%d), length of the vector of "
619 "variances (%d) and number of labels (%d) should be the same\n",
621 REQUIRE(i>=0 && i<=mu.
vlen,
"Index (%d) out of bounds!\n", i)
623 "Labels must be type of CRegressionLabels\n")
628 CNormalPDF* f=
new CNormalPDF(mu[i],
CMath::sqrt(s2[i]));
631 CStudentsTPDF* g=
new CStudentsTPDF(m_sigma, m_df, y[i]);
634 CProductFunction* h=
new CProductFunction(f, g);
637 CProductFunction* k=
new CProductFunction(
new CLinearFunction(), h);
658 REQUIRE(lab,
"Labels are required (lab should not be NULL)\n")
660 "Length of the vector of means (%d), length of the vector of "
661 "variances (%d) and number of labels (%d) should be the same\n",
663 REQUIRE(i>=0 && i<=mu.
vlen,
"Index (%d) out of bounds!\n", i)
665 "Labels must be type of CRegressionLabels\n")
670 CNormalPDF* f=
new CNormalPDF(mu[i],
CMath::sqrt(s2[i]));
673 CStudentsTPDF* g=
new CStudentsTPDF(m_sigma, m_df, y[i]);
676 CProductFunction* h=
new CProductFunction(f, g);
679 CProductFunction* k=
new CProductFunction(
new CLinearFunction(), h);
683 CProductFunction* p=
new CProductFunction(
new CQuadraticFunction(), h);