/*
* File: UnivariateGaussianMeanVarianceBayesianEstimatorTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Mar 22, 2010, Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the U.S. Government.
* Export of this program may require a license from the United States
* Government. See CopyrightHistory.txt for complete details.
*
*/
package gov.sandia.cognition.statistics.bayesian.conjugate;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.statistics.distribution.NormalInverseGammaDistribution;
import gov.sandia.cognition.statistics.distribution.StudentTDistribution;
import gov.sandia.cognition.statistics.distribution.UnivariateGaussian;
import gov.sandia.cognition.statistics.method.KolmogorovSmirnovConfidence;
import java.util.ArrayList;
import java.util.Collection;
/**
* Unit tests for UnivariateGaussianMeanVarianceBayesianEstimatorTest.
*
* @author krdixon
*/
public class UnivariateGaussianMeanVarianceBayesianEstimatorTest
extends ConjugatePriorBayesianEstimatorTestHarness<Double,Vector,NormalInverseGammaDistribution>
{
/**
* Tests for class UnivariateGaussianMeanVarianceBayesianEstimatorTest.
* @param testName Name of the test.
*/
public UnivariateGaussianMeanVarianceBayesianEstimatorTest(
String testName)
{
super(testName);
}
/**
* Tests the constructors of class UnivariateGaussianMeanVarianceBayesianEstimatorTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
UnivariateGaussianMeanVarianceBayesianEstimator instance =
new UnivariateGaussianMeanVarianceBayesianEstimator();
assertNotNull( instance.getInitialBelief() );
}
@Override
public UnivariateGaussianMeanVarianceBayesianEstimator createInstance()
{
return new UnivariateGaussianMeanVarianceBayesianEstimator();
}
@Override
public UnivariateGaussian createConditionalDistribution()
{
double mean = RANDOM.nextGaussian();
double variance = RANDOM.nextDouble() * 3.0;
return new UnivariateGaussian( mean, variance );
}
@Override
public void testKnownValues()
{
System.out.println( "Known Values" );
UnivariateGaussianMeanVarianceBayesianEstimator instance =
this.createInstance();
UnivariateGaussian conditional = this.createConditionalDistribution();
Collection<? extends Double> data = this.createData(conditional);
NormalInverseGammaDistribution posterior = instance.learn(data);
assertEquals( conditional.getMean(), posterior.getMean().getElement(0), 1e-1 );
assertEquals( conditional.getVariance(), posterior.getMean().getElement(1), 1e-2 );
}
/**
* createPredictiveDistribution
*/
public void testCreatePredictiveDistribution2()
{
System.out.println( "createPredictiveDistribution" );
UnivariateGaussian target = this.createConditionalDistribution();
ArrayList<? extends Double> samples = target.sample(RANDOM,NUM_SAMPLES);
UnivariateGaussianMeanVarianceBayesianEstimator instance =
this.createInstance();
NormalInverseGammaDistribution posterior = instance.learn(samples);
StudentTDistribution.PDF predictiveDistribution =
instance.createPredictiveDistribution(posterior).getProbabilityFunction();
ArrayList<? extends Vector> parameters =
posterior.sample(RANDOM,NUM_SAMPLES);
ArrayList<Double> results = new ArrayList<Double>( samples.size() );
ArrayList<Double> empiricals = new ArrayList<Double>( samples.size() );
for( Double sample : samples )
{
// This is computing the integral of the predictive distribution
// p(sample | data) = integral{ p(sample|data,parameter) * p(parameter|data) dparameter }
// We're using Monte Carlo integration by sampling from the
// posterior and multiplying by the conditional distribution.
double sum = 0.0;
for( Vector parameter : parameters )
{
UnivariateGaussian prediction =
instance.createConditionalDistribution(parameter);
sum += prediction.getProbabilityFunction().evaluate( sample );
}
double empirical = sum/parameters.size();
empiricals.add( empirical );
double estimate = predictiveDistribution.evaluate(sample);
results.add( estimate );
results.add( sum / parameters.size() );
}
KolmogorovSmirnovConfidence.Statistic kstest =
KolmogorovSmirnovConfidence.INSTANCE.evaluateNullHypothesis(results,empiricals);
System.out.println( "K-S Test: " + kstest );
assertEquals( 1.0, kstest.getNullHypothesisProbability(), 0.95 );
}
}