double HierarchicalGaussianProcess::negativeTotalLogLikelihood()
  {
    /*This is the restricted version. For the unrestricted, make p=0
      and remove the last term of loglik*/

    const matrixd K = computeCorrMatrix();
    const size_t n = K.size1();
    const size_t p = mFeatM.size1(); 
    matrixd L(n,n);
    utils::cholesky_decompose(K,L);

    matrixd KF(ublas::trans(mFeatM));
    inplace_solve(L,KF,ublas::lower_tag());
    
    matrixd FKF = prod(ublas::trans(KF),KF);
    matrixd L2(p,p);
    utils::cholesky_decompose(FKF,L2);

    vectord Ky(mGPY);
    inplace_solve(L,Ky,ublas::lower_tag());

    vectord wML = prod(Ky,KF);
    utils::cholesky_solve(L2,wML,ublas::lower());

    vectord alpha = mGPY - prod(wML,mFeatM);
    inplace_solve(L,alpha,ublas::lower_tag());
    double sigma = ublas::inner_prod(alpha,alpha)/(n-p);

    double loglik = .5*(n-p)*log(ublas::inner_prod(alpha,alpha)) 
      + utils::log_trace(L) + utils::log_trace(L2);
    return loglik;
  }
Пример #2
0
  void StudentTProcessJeffreys::precomputePrediction()
  {
    size_t n = mData.getNSamples();
    size_t p = mMean.nFeatures();

    mKn.resize(n);

    mKF = trans(mMean.mFeatM);
    inplace_solve(mL,mKF,ublas::lower_tag());

    matrixd FKF = prod(trans(mKF),mKF);
    mL2 = FKF;
    utils::cholesky_decompose(FKF,mL2);

    vectord Ky(mData.mY);
    inplace_solve(mL,Ky,ublas::lower_tag());

    mWML = prod(Ky,mKF);
    utils::cholesky_solve(mL2,mWML,ublas::lower());

    mAlphaF = mData.mY - prod(mWML,mMean.mFeatM);
    inplace_solve(mL,mAlphaF,ublas::lower_tag());
    mSigma = inner_prod(mAlphaF,mAlphaF)/(n-p);
    
    d_->setDof(n-p);  
  }
Пример #3
0
 void lu_substitute(matrix<SCALARTYPE, F, ALIGNMENT> const & A,
                    vector<SCALARTYPE, VEC_ALIGNMENT> & vec)
 {
   assert(A.size1() == A.size2() && bool("Matrix must be square"));
   inplace_solve(A, vec, unit_lower_tag());
   inplace_solve(A, vec, upper_tag());
 }
  ProbabilityDistribution* 
  GaussianProcessNormal::prediction(const vectord &query)
  {
    double kq = (*mKernel)(query, query);;
    vectord kn = computeCrossCorrelation(query);
    vectord phi = mMean->getFeatures(query);
  
    vectord v(kn);
    inplace_solve(mL,v,ublas::lower_tag());

    vectord rq = phi - prod(v,mKF);

    vectord rho(rq);
    inplace_solve(mD,rho,ublas::lower_tag());
    
    double yPred = inner_prod(phi,mWMap) + inner_prod(v,mVf);
    double sPred = sqrt( mSigma * (kq - inner_prod(v,v) 
			        + inner_prod(rho,rho)));

    if ((boost::math::isnan(yPred)) || (boost::math::isnan(sPred)))
      {
	FILE_LOG(logERROR) << "Error in prediction. NaN found.";
	exit(EXIT_FAILURE);
      }
					

    d_->setMeanAndStd(yPred,sPred);
    return d_;
  }
Пример #5
0
  ProbabilityDistribution* StudentTProcessNIG::prediction(const vectord &query)
  {
    double kq = computeSelfCorrelation(query);
    vectord kn = computeCrossCorrelation(query);
    vectord phi = mMean.getFeatures(query);
  
    vectord v(kn);
    inplace_solve(mL,v,ublas::lower_tag());

    vectord rq = phi - prod(v,mKF);

    vectord rho(rq);
    inplace_solve(mD,rho,ublas::lower_tag());
    
    double yPred = inner_prod(phi,mWMap) + inner_prod(v,mVf);
    double sPred = sqrt( mSigma * (kq - inner_prod(v,v) 
				   + inner_prod(rho,rho)));

    if ((boost::math::isnan(yPred)) || (boost::math::isnan(sPred)))
      {
	throw std::runtime_error("Error in prediction. NaN found.");
      }
					

    d_->setMeanAndStd(yPred,sPred);
    return d_;
  }
Пример #6
0
 void lu_substitute(matrix<SCALARTYPE, F, ALIGNMENT> const & mat,
                    vector<SCALARTYPE, VEC_ALIGNMENT> & vec)
 {
   assert(mat.size1() == mat.size2());
   inplace_solve(mat, vec, unit_lower_tag());
   inplace_solve(mat, vec, upper_tag());
 }
  int GaussianProcessNormal::precomputePrediction()
  {
    size_t n = mGPXX.size();
    size_t p = mMean->nFeatures();

    mKF = trans(mFeatM);
    inplace_solve(mL,mKF,ublas::lower_tag());
    //TODO: make one line
    matrixd DD(p,p);
    DD = prod(trans(mKF),mKF);
    utils::addToDiagonal(DD,mInvVarW);
    utils::cholesky_decompose(DD,mD);

    vectord vn = mGPY;
    inplace_solve(mL,vn,ublas::lower_tag());
    mWMap = prod(mFeatM,vn) + utils::ublas_elementwise_prod(mInvVarW,mW0);
    utils::cholesky_solve(mD,mWMap,ublas::lower());

    mVf = mGPY - prod(trans(mFeatM),mWMap);
    inplace_solve(mL,mVf,ublas::lower_tag());

    if (boost::math::isnan(mWMap(0)))
      {
	FILE_LOG(logERROR) << "Error in precomputed prediction. NaN found.";
	return -1;
      }
    return 0;
  }
Пример #8
0
 void lu_substitute(matrix<SCALARTYPE, F1, ALIGNMENT_A> const & A,
                    matrix<SCALARTYPE, F2, ALIGNMENT_B> & B)
 {
   assert(A.size1() == A.size2());
   assert(A.size1() == A.size2());
   inplace_solve(A, B, unit_lower_tag());
   inplace_solve(A, B, upper_tag());
 }
Пример #9
0
  void StudentTProcessNIG::precomputePrediction()
  {
    size_t n = mData.getNSamples();
    size_t p = mMean.nFeatures();

    mKF = trans(mMean.mFeatM);
    inplace_solve(mL,mKF,ublas::lower_tag());
    //TODO: make one line
    matrixd DD(p,p);
    DD = prod(trans(mKF),mKF);
    utils::add_to_diagonal(DD,mInvVarW);
    utils::cholesky_decompose(DD,mD);

    vectord vn = mData.mY;
    inplace_solve(mL,vn,ublas::lower_tag());
    mWMap = prod(mMean.mFeatM,vn) + utils::ublas_elementwise_prod(mInvVarW,mW0);
    utils::cholesky_solve(mD,mWMap,ublas::lower());

    mVf = mData.mY - prod(trans(mMean.mFeatM),mWMap);
    inplace_solve(mL,mVf,ublas::lower_tag());

    vectord v0 = mData.mY - prod(trans(mMean.mFeatM),mW0);
    //TODO: check for "cheaper" version
    //matrixd KK = prod(mL,trans(mL));
    matrixd KK = computeCorrMatrix();
    matrixd WW = zmatrixd(p,p);  //TODO: diagonal matrix
    utils::add_to_diagonal(WW,mInvVarW);
    const matrixd FW = prod(trans(mMean.mFeatM),WW);
    KK += prod(FW,mMean.mFeatM);
    matrixd BB(n,n);
    utils::cholesky_decompose(KK,BB);
    inplace_solve(BB,v0,ublas::lower_tag());
    mSigma = (mBeta/mAlpha + inner_prod(v0,v0))/(n+2*mAlpha);
    
    int dof = static_cast<int>(n+2*mAlpha);
    
    if ((boost::math::isnan(mWMap(0))) || (boost::math::isnan(mSigma)))
      {
	throw std::runtime_error("Error in precomputed prediction. NaN found.");
      }


    if (dof <= 0)  
      {
	dof = n;
	FILE_LOG(logERROR) << "ERROR: Incorrect alpha. Dof invalid."
			   << "Forcing Dof <= num of points.";
      }

    d_->setDof(dof);  
  }
Пример #10
0
 void GaussianProcess::precomputePrediction()
 {
   const size_t n = mData.getNSamples();
 
   mAlphaV.resize(n,false);
   mAlphaV = mData.mY-mMean.muTimesFeat();
   inplace_solve(mL,mAlphaV,ublas::lower_tag());
 }
Пример #11
0
    vector<NumericT> solve(const matrix_expression< const matrix_base<NumericT>, const matrix_base<NumericT>, op_trans> & proxy,
                           const vector_base<NumericT> & vec,
                           SOLVERTAG const & tag)
    {
      // run an inplace solve on the result vector:
      vector<NumericT> result(vec);

      inplace_solve(proxy, result, tag);

      return result;
    }
Пример #12
0
    vector<NumericT> solve(const matrix_base<NumericT> & mat,
                           const vector_base<NumericT> & vec,
                           SOLVERTAG const & tag)
    {
      // do an inplace solve on the result vector:
      vector<NumericT> result(vec);

      inplace_solve(mat, result, tag);

      return result;
    }
Пример #13
0
    matrix_base<NumericT> solve(const matrix_base<NumericT> & A,
                                const matrix_base<NumericT> & B,
                                SOLVERTAG tag)
    {
      // do an inplace solve on the result vector:
      matrix_base<NumericT> result(B);

      inplace_solve(A, result, tag);

      return result;
    }
Пример #14
0
    matrix_base<NumericT> solve(const matrix_expression< const matrix_base<NumericT>, const matrix_base<NumericT>, op_trans> & proxy_A,
                                const matrix_expression< const matrix_base<NumericT>, const matrix_base<NumericT>, op_trans> & proxy_B,
                                SOLVERTAG tag)
    {
      // run an inplace solve on the result vector:
      matrix_base<NumericT> result(proxy_B);

      inplace_solve(proxy_A, result, tag);

      return result;
    }
Пример #15
0
 matrix<SCALARTYPE, F2, ALIGNMENT_B> solve(const matrix<SCALARTYPE, F1, ALIGNMENT_A> & A,
                                     const matrix<SCALARTYPE, F2, ALIGNMENT_B> & B,
                                     TAG const & tag)
 {
   // do an inplace solve on the result vector:
   matrix<SCALARTYPE, F2, ALIGNMENT_A> result(B.size1(), B.size2());
   result = B;
 
   inplace_solve(A, result, tag);
 
   return result;
 }
Пример #16
0
 vector<SCALARTYPE, VEC_ALIGNMENT> solve(const matrix<SCALARTYPE, F, ALIGNMENT> & mat,
                                     const vector<SCALARTYPE, VEC_ALIGNMENT> & vec,
                                     TAG const & tag)
 {
   // do an inplace solve on the result vector:
   vector<SCALARTYPE, VEC_ALIGNMENT> result(vec.size());
   result = vec;
 
   inplace_solve(mat, result, tag);
 
   return result;
 }
 vector<SCALARTYPE, VEC_ALIGNMENT> solve(compressed_matrix<SCALARTYPE, MAT_ALIGNMENT> const & L,
                                     const vector<SCALARTYPE, VEC_ALIGNMENT> & vec,
                                     viennacl::linalg::upper_tag const & tag)
 {
   // do an inplace solve on the result vector:
   vector<SCALARTYPE, VEC_ALIGNMENT> result(vec.size());
   result = vec;
 
   inplace_solve(L, result, tag);
 
   return result;
 }
Пример #18
0
  ProbabilityDistribution* GaussianProcessML::prediction( const vectord &query )
  {
    double kq = computeSelfCorrelation(query);
    vectord kn = computeCrossCorrelation(query);
    vectord phi = mMean.getFeatures(query);
  
    vectord v(kn);
    inplace_solve(mL,v,ublas::lower_tag());

    vectord rq = phi - prod(v,mKF);

    vectord rho(rq);
    inplace_solve(mL2,rho,ublas::lower_tag());
    
    double yPred = inner_prod(phi,mWML) + inner_prod(v,mAlphaF);
    double sPred = sqrt( mSigma * (kq - inner_prod(v,v) 
				   + inner_prod(rho,rho)));

    d_->setMeanAndStd(yPred,sPred);
    return d_;
  }
Пример #19
0
  double GaussianProcess::negativeLogLikelihood()
  {
    const matrixd K = computeCorrMatrix();
    const size_t n = K.size1();
    matrixd L(n,n);
    utils::cholesky_decompose(K,L);

    vectord alpha(mData.mY-mMean.muTimesFeat());
    inplace_solve(L,alpha,ublas::lower_tag());
    double loglik = ublas::inner_prod(alpha,alpha)/(2*mSigma);
    loglik += utils::log_trace(L);
    return loglik;
  }
Пример #20
0
 vector<SCALARTYPE, VEC_ALIGNMENT> solve(const matrix_expression< const matrix<SCALARTYPE, F, ALIGNMENT>,
                                                                  const matrix<SCALARTYPE, F, ALIGNMENT>,
                                                                  op_trans> & proxy,
                                         const vector<SCALARTYPE, VEC_ALIGNMENT> & vec,
                                         TAG const & tag)
 {
   // do an inplace solve on the result vector:
   vector<SCALARTYPE, VEC_ALIGNMENT> result(vec.size());
   result = vec;
 
   inplace_solve(proxy, result, tag);
 
   return result;
 }
Пример #21
0
 matrix<SCALARTYPE, F2, ALIGNMENT_B> solve(const matrix_expression< const matrix<SCALARTYPE, F1, ALIGNMENT_A>,
                                                                  const matrix<SCALARTYPE, F1, ALIGNMENT_A>,
                                                                  op_trans> & proxy,
                                         const matrix<SCALARTYPE, F2, ALIGNMENT_B> & B,
                                         TAG const & tag)
 {
   // do an inplace solve on the result vector:
   matrix<SCALARTYPE, F2, ALIGNMENT_B> result(B.size1(), B.size2());
   result = B;
 
   inplace_solve(proxy, result, tag);
 
   return result;
 }
Пример #22
0
  ProbabilityDistribution* 
  StudentTProcessJeffreys::prediction(const vectord &query )
  {
    clock_t start = clock();
    double kq = computeSelfCorrelation(query);
    //    vectord kn = computeCrossCorrelation(query);
    mKernel.computeCrossCorrelation(mData.mX,query,mKn);
    vectord phi = mMean.getFeatures(query);
  
    //    vectord v(mKn);
    inplace_solve(mL,mKn,ublas::lower_tag());

    vectord rho = phi - prod(mKn,mKF);

    //    vectord rho(rq);
    inplace_solve(mL2,rho,ublas::lower_tag());
    
    double yPred = inner_prod(phi,mWML) + inner_prod(mKn,mAlphaF);
    double sPred = sqrt( mSigma * (kq - inner_prod(mKn,mKn) 
				   + inner_prod(rho,rho)));

    d_->setMeanAndStd(yPred,sPred);
    return d_;
  }
Пример #23
0
  ProbabilityDistribution* GaussianProcess::prediction(const vectord &query)
  {
    const double kq = computeSelfCorrelation(query);
    const vectord kn = computeCrossCorrelation(query);
    

    vectord vd(kn);
    inplace_solve(mL,vd,ublas::lower_tag());
    double basisPred = mMean.muTimesFeat(query);
    double yPred = basisPred + ublas::inner_prod(vd,mAlphaV);
    double sPred = sqrt(mSigma*(kq - ublas::inner_prod(vd,vd)));
    
    d_->setMeanAndStd(yPred,sPred);
    return d_;
  }
Пример #24
0
 typename viennacl::enable_if<    viennacl::is_any_dense_nonstructured_matrix<M1>::value
                               && viennacl::is_any_dense_nonstructured_matrix<M2>::value,
                               typename detail::extract_embedded_type<M2>::type
                             >::type
 solve(const M1 & A, const M2 & B, SOLVERTAG tag)
 {
   typedef typename detail::extract_embedded_type<M2>::type             MatrixType;
   
   // do an inplace solve on the result vector:
   MatrixType result(B);
 
   inplace_solve(A, result, tag);
 
   return result;
 }
Пример #25
0
 typename viennacl::enable_if<    viennacl::is_any_dense_nonstructured_matrix<M1>::value
                               && viennacl::is_any_dense_nonstructured_vector<V1>::value,
                               typename detail::extract_embedded_type<V1>::type
                             >::type
 solve(const M1 & mat,
       const V1 & vec,
       SOLVERTAG const & tag)
 {
   // do an inplace solve on the result vector:
   typename detail::extract_embedded_type<V1>::type result(vec);
 
   inplace_solve(mat, result, tag);
 
   return result;
 }
Пример #26
0
 typename viennacl::enable_if<    viennacl::is_any_dense_nonstructured_matrix<M1>::value
                               && viennacl::is_any_dense_nonstructured_matrix<M2>::value,
                               typename detail::extract_embedded_type<M2>::type
                             >::type
 solve(const matrix_expression< const M1, const M1, op_trans> & proxy_A,
       const matrix_expression< const M2, const M2, op_trans> & proxy_B,
       SOLVERTAG tag)
 {
   typedef typename detail::extract_embedded_type<M2>::type             MatrixType;
                  
   // do an inplace solve on the result vector:
   MatrixType result(proxy_B);
 
   inplace_solve(proxy_A, result, tag);
 
   return result;
 }
  double GaussianProcessNormal::negativeLogLikelihood()
  {
    matrixd KK = computeCorrMatrix();
    const size_t n = KK.size1();
    const size_t p = mMean->nFeatures();
  
    vectord v0 = mGPY - prod(trans(mFeatM),mW0);
    matrixd WW = zmatrixd(p,p);  //TODO: diagonal matrix
    utils::addToDiagonal(WW,mInvVarW);
    matrixd FW = prod(trans(mFeatM),WW);
    KK += prod(FW,mFeatM);
    matrixd BB(n,n);
    utils::cholesky_decompose(KK,BB);
    inplace_solve(BB,v0,ublas::lower_tag());
    double zz = inner_prod(v0,v0);

    double lik = 1/(2*mSigma) * zz;
    lik += utils::log_trace(BB);
    return lik;
  }
Пример #28
0
  double StudentTProcessNIG::negativeLogLikelihood()
  {
    matrixd KK = computeCorrMatrix();
    const size_t n = KK.size1();
    const size_t p = mMean.nFeatures();
    const size_t nalpha = (n+2*mAlpha);

    vectord v0 = mData.mY - prod(trans(mMean.mFeatM),mW0);
    matrixd WW = zmatrixd(p,p);  //TODO: diagonal matrix
    utils::add_to_diagonal(WW,mInvVarW);
    matrixd FW = prod(trans(mMean.mFeatM),WW);
    KK += prod(FW,mMean.mFeatM);
    matrixd BB(n,n);
    utils::cholesky_decompose(KK,BB);
    inplace_solve(BB,v0,ublas::lower_tag());
    double zz = inner_prod(v0,v0);
    double sigmaMap = (mBeta/mAlpha + zz)/nalpha;

    double lik = nalpha/2 * std::log(1+zz/(2*mBeta*sigmaMap));
    lik += utils::log_trace(BB);
    lik += n/2 * std::log(sigmaMap);
    return lik;
  }
Пример #29
0
 //==========================================================================
 // Solver interface
 //==========================================================================
 template<class XPR> result_type solve(const XPR& b ) const
 {
   result_type bb = b;
   inplace_solve(bb);
   return bb;
 }