// virtual void GGaussianProcess::predictDistribution(const GVec& in, GPrediction* out) { if(!m_pBuf) m_pBuf = new GMatrix(2, m_pStoredFeatures->rows()); else if(m_pBuf->rows() < 2) m_pBuf->newRow(); // Compute k* GVec& k = m_pBuf->row(0); for(size_t i = 0; i < m_pStoredFeatures->rows(); i++) k[i] = m_weightsPriorVar * m_pKernel->apply(m_pStoredFeatures->row(i), in); // Compute the prediction GVec pred; m_pAlpha->multiply(m_pBuf->row(0), pred, true); // Compute the variance GVec& v = m_pBuf->row(1); m_pLInv->multiply(k, v); double variance = m_pKernel->apply(k, k) - v.squaredMagnitude(); // Store the results for(size_t i = 0; i < m_pAlpha->cols(); i++) { GNormalDistribution* pNorm = out->makeNormal(); pNorm->setMeanAndVariance(pred[i], variance); } }
// virtual void GLinearDistribution::predictDistribution(const GVec& in, GPrediction* out) { m_pAInv->multiply(in, m_buf); double v = in.dotProduct(m_buf); for(size_t i = 0; i < m_pWBar->rows(); i++) { GNormalDistribution* pNorm = (*out).makeNormal(); double m = m_pWBar->row(i).dotProduct(in); pNorm->setMeanAndVariance(m, v); out++; } }
// virtual void GNaiveInstance::predictDistribution(const GVec& pIn, GPrediction* pOut) { GVec::setAll(m_pWeightSums, 0.0, m_pRelLabels->size()); GVec::setAll(m_pValueSums, 0.0, m_pRelLabels->size()); for(size_t i = 0; i < m_pRelFeatures->size(); i++) evalInput(i, pIn[i]); for(size_t i = 0; i < m_pRelLabels->size(); i++) { GNormalDistribution* pNorm = pOut[i].makeNormal(); pNorm->setMeanAndVariance(m_pValueSums[i] / m_pWeightSums[i], 1.0 / m_pWeightSums[i]); } }
// virtual void GLinearDistribution::predictDistributionInner(const double* pIn, GPrediction* pOut) { size_t dims = m_pAInv->rows(); m_pAInv->multiply(pIn, m_pBuf); double v = GVec::dotProduct(pIn, m_pBuf, dims); for(size_t i = 0; i < m_pWBar->rows(); i++) { GNormalDistribution* pNorm = (*pOut).makeNormal(); double m = GVec::dotProduct(m_pWBar->row(i), pIn, dims); pNorm->setMeanAndVariance(m, v); pOut++; } }
// virtual void GInstanceTable::predictDistribution(const double* pIn, GPrediction* pOut) { size_t pos = 0; for(int i = 0; i < m_dims; i++) { size_t n = (size_t)floor(pIn[i] + 0.5); if(n >= m_pDims[i]) ThrowError("dim=", gformat(i), ", index=", gformat(pIn[i]), ", out of range. Expected >= 0 and < ", gformat(m_pDims[i])); pos += n * m_pScales[i]; } int values = m_pRelation->valueCount(m_dims); if(values == 0) { GNormalDistribution* pNorm = pOut->makeNormal(); pNorm->setMeanAndVariance(m_pTable[pos], 1.0); } else { GCategoricalDistribution* pCat = pOut->makeCategorical(); pCat->setSpike(values, (int)m_pTable[pos], 1); } }