コード例 #1
0
// 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);
	}
}
コード例 #2
0
ファイル: GLinear.cpp プロジェクト: b2020b/waffles
// 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++;
	}
}
コード例 #3
0
ファイル: GNaiveInstance.cpp プロジェクト: skn123/waffles
// 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]);
	}
}
コード例 #4
0
ファイル: GLinear.cpp プロジェクト: kslazarev/waffles
// 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++;
	}
}
コード例 #5
0
ファイル: GKNN.cpp プロジェクト: darthsuogles/GestureUI
// 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);
	}
}