/*
* File: UnivariateMonteCarloIntegratorTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Feb 12, 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.montecarlo;
import gov.sandia.cognition.learning.function.scalar.PolynomialFunction.Linear;
import gov.sandia.cognition.statistics.distribution.UnivariateGaussian;
import gov.sandia.cognition.statistics.method.ConfidenceInterval;
import gov.sandia.cognition.statistics.method.StudentTConfidence;
import gov.sandia.cognition.util.DefaultWeightedValue;
import java.util.ArrayList;
import junit.framework.TestCase;
import java.util.Random;
/**
* Unit tests for UnivariateMonteCarloIntegratorTest.
*
* @author krdixon
*/
public class UnivariateMonteCarloIntegratorTest
extends TestCase
{
/**
* Random number generator to use for a fixed random seed.
*/
public final Random RANDOM = new Random( 1 );
/**
* Default tolerance of the regression tests, {@value}.
*/
public final double TOLERANCE = 1e-5;
/**
* Samples
*/
public int NUM_SAMPLES = 1000;
/**
* Tests for class UnivariateMonteCarloIntegratorTest.
* @param testName Name of the test.
*/
public UnivariateMonteCarloIntegratorTest(
String testName)
{
super(testName);
}
/**
* Tests the constructors of class UnivariateMonteCarloIntegratorTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
assertNotNull( UnivariateMonteCarloIntegrator.INSTANCE );
assertNotNull( new UnivariateMonteCarloIntegrator() );
}
/**
* Clone
*/
public void testClone()
{
System.out.println( "Clone" );
UnivariateMonteCarloIntegrator instance =
new UnivariateMonteCarloIntegrator();
UnivariateMonteCarloIntegrator clone =
(UnivariateMonteCarloIntegrator) instance.clone();
assertNotSame( instance, clone );
assertNotNull( clone );
}
/**
* Test of integrate method, of class UnivariateMonteCarloIntegrator.
*/
public void testIntegrate_Collection_Evaluator()
{
System.out.println("integrate");
double mean = RANDOM.nextGaussian();
double variance = RANDOM.nextDouble() * 3.0;
UnivariateGaussian.PDF targetDistribution =
new UnivariateGaussian.PDF( mean, variance );
UnivariateMonteCarloIntegrator instance =
new UnivariateMonteCarloIntegrator();
int num = 100;
ArrayList<Double> means = new ArrayList<Double>( num );
ArrayList<Double> variances = new ArrayList<Double>( num );
Linear linear = new Linear(0.0, 1.0);
for( int n = 0; n < num; n++ )
{
ArrayList<Double> samples =
targetDistribution.sample(RANDOM, NUM_SAMPLES);
UnivariateGaussian.PDF g =
instance.integrate(samples, linear);
means.add( g.getMean() );
variances.add( g.getVariance() );
}
UnivariateGaussian sampleMeanDistribution =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(means, 0.0);
UnivariateGaussian sampleVarianceDistribution =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(variances, 0.0);
ConfidenceInterval ci = StudentTConfidence.INSTANCE.computeConfidenceInterval(
sampleMeanDistribution.getMean(), sampleMeanDistribution.getVariance(), num, 0.95 );
double meanTarget = targetDistribution.getMean();
System.out.println( "====== Mean ========" );
System.out.println( "Target D = " + targetDistribution );
System.out.println( "Target = " + meanTarget );
System.out.println( "Sample = " + sampleMeanDistribution );
System.out.println( "Interval = " + ci );
assertTrue( ci.withinInterval( meanTarget ) );
ConfidenceInterval vi = StudentTConfidence.INSTANCE.computeConfidenceInterval(
sampleVarianceDistribution.getMean(), sampleVarianceDistribution.getVariance(), num, 0.95 );
double varianceTarget = targetDistribution.getVariance()/NUM_SAMPLES;
System.out.println( "====== Variance =======" );
System.out.println( "Target = " + varianceTarget );
System.out.println( "Sample = " + sampleVarianceDistribution );
System.out.println( "Interval = " + vi );
assertTrue( vi.withinInterval(varianceTarget) );
}
/**
* Test of integrate method, of class UnivariateMonteCarloIntegrator.
*/
public void testIntegrate_List_Evaluator()
{
System.out.println("integrate");
double mean = RANDOM.nextGaussian();
double variance = RANDOM.nextDouble() * 3.0;
UnivariateGaussian.PDF targetDistribution =
new UnivariateGaussian.PDF( mean, variance );
UnivariateGaussian.PDF importanceDistribution =
new UnivariateGaussian.PDF( mean+mean, 2.0*variance );
ImportanceSampler<Double> sampler =
new ImportanceSampler<Double>( importanceDistribution );
System.out.println( "Target = " + targetDistribution );
System.out.println( "Importance = " + importanceDistribution );
UnivariateMonteCarloIntegrator instance =
new UnivariateMonteCarloIntegrator();
int num = 100;
ArrayList<Double> means = new ArrayList<Double>( num );
ArrayList<Double> variances = new ArrayList<Double>( num );
Linear linear = new Linear(0.0, 1.0);
for( int n = 0; n < num; n++ )
{
UnivariateGaussian.PDF g =
instance.integrate( sampler.sample(targetDistribution, RANDOM, NUM_SAMPLES ), linear );
means.add( g.getMean() );
variances.add( g.getVariance() );
}
UnivariateGaussian sampleMeanDistribution =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(means, 0.0);
UnivariateGaussian sampleVarianceDistribution =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(variances, 0.0);
ConfidenceInterval ci = StudentTConfidence.INSTANCE.computeConfidenceInterval(
sampleMeanDistribution.getMean(), sampleMeanDistribution.getVariance(), num, 0.95 );
System.out.println( "====== Mean ========" );
System.out.println( "Target = " + targetDistribution );
System.out.println( "Sample = " + sampleMeanDistribution );
System.out.println( "Interval = " + ci );
assertTrue( ci.withinInterval( targetDistribution.getMean() ) );
ConfidenceInterval vi = StudentTConfidence.INSTANCE.computeConfidenceInterval(
sampleVarianceDistribution.getMean(), sampleVarianceDistribution.getVariance(), num, 0.95 );
double s2 = importanceDistribution.getVariance();
double s2hat = targetDistribution.getVariance();
double y = targetDistribution.getMean();
double m = importanceDistribution.getMean();
double mhat = (s2*m + s2hat*y) / (s2 + s2hat);
double varianceTarget = mhat/NUM_SAMPLES;
System.out.println( "====== Variance =======" );
System.out.println( "Target = " + varianceTarget );
System.out.println( "Sample = " + sampleVarianceDistribution );
System.out.println( "Interval = " + vi );
assertTrue( vi.withinInterval(varianceTarget) );
}
/**
* Test of getMean method, of class UnivariateMonteCarloIntegrator.
*/
public void testGetMean_Collection()
{
System.out.println("getMean");
double mean = RANDOM.nextGaussian();
double variance = RANDOM.nextDouble() * 3.0;
UnivariateGaussian.PDF targetDistribution =
new UnivariateGaussian.PDF( mean, variance );
UnivariateMonteCarloIntegrator instance =
new UnivariateMonteCarloIntegrator();
int num = 100;
ArrayList<Double> means = new ArrayList<Double>( num );
ArrayList<Double> variances = new ArrayList<Double>( num );
for( int n = 0; n < num; n++ )
{
UnivariateGaussian.PDF g =
instance.getMean( targetDistribution.sample(RANDOM, NUM_SAMPLES) );
means.add( g.getMean() );
variances.add( g.getVariance() );
}
UnivariateGaussian sampleMeanDistribution =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(means, 0.0);
UnivariateGaussian sampleVarianceDistribution =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(variances, 0.0);
ConfidenceInterval ci = StudentTConfidence.INSTANCE.computeConfidenceInterval(
sampleMeanDistribution.getMean(), sampleMeanDistribution.getVariance(), num, 0.95 );
System.out.println( "====== Mean ========" );
System.out.println( "Target = " + targetDistribution );
System.out.println( "Sample = " + sampleMeanDistribution );
System.out.println( "Interval = " + ci );
assertTrue( ci.withinInterval( targetDistribution.getMean() ) );
ConfidenceInterval vi = StudentTConfidence.INSTANCE.computeConfidenceInterval(
sampleVarianceDistribution.getMean(), sampleVarianceDistribution.getVariance(), num, 0.95 );
double varianceTarget = targetDistribution.getVariance()/NUM_SAMPLES;
System.out.println( "====== Variance =======" );
System.out.println( "Target = " + varianceTarget );
System.out.println( "Sample = " + sampleVarianceDistribution );
System.out.println( "Interval = " + vi );
assertTrue( vi.withinInterval(varianceTarget) );
}
/**
* Equivalence of Weighted/Unweighted methods
*/
public void testGetMean_Equivalence()
{
System.out.println( "Equivalence of Weighted/Unweighted methods" );
final double weight = RANDOM.nextDouble() * 10.0;
System.out.println( "Weight = " + weight );
double mean = RANDOM.nextGaussian();
double variance = RANDOM.nextDouble() * 3.0;
UnivariateGaussian.PDF targetDistribution =
new UnivariateGaussian.PDF( mean, variance );
ArrayList<Double> samples = targetDistribution.sample(RANDOM, NUM_SAMPLES);
ArrayList<DefaultWeightedValue<Double>> weightedSamples =
new ArrayList<DefaultWeightedValue<Double>>( samples.size() );
for( Double sample : samples )
{
weightedSamples.add( new DefaultWeightedValue<Double>( sample, weight ) );
}
UnivariateMonteCarloIntegrator instance =
new UnivariateMonteCarloIntegrator();
UnivariateGaussian ur = instance.getMean(samples);
UnivariateGaussian wr = instance.getMean(weightedSamples);
System.out.println( "Unweighted = " + ur );
System.out.println( "Weighted = " + wr );
System.out.println( "U/W Ratio = " + ur.getVariance() / wr.getVariance() );
assertEquals( ur.getVariance(), wr.getVariance(), TOLERANCE );
// Now add a whole bunch of samples to the weighted method with zero
// weights. This should return the sample variance.
weightedSamples.ensureCapacity( weightedSamples.size() + NUM_SAMPLES );
for( int n = 0; n < NUM_SAMPLES; n++ )
{
weightedSamples.add( new DefaultWeightedValue<Double>( samples.get(n), 0.0 ) );
}
UnivariateGaussian wr2 = instance.getMean(weightedSamples);
System.out.println( "Weighted2 = " + wr2 );
assertEquals( wr.getVariance(), wr2.getVariance(), TOLERANCE );
}
/**
* Test of getMean method, of class UnivariateMonteCarloIntegrator.
*/
public void testGetMean_List()
{
System.out.println("getMean");
double mean = RANDOM.nextGaussian();
double variance = RANDOM.nextDouble() * 3.0;
UnivariateGaussian.PDF targetDistribution =
new UnivariateGaussian.PDF( mean, variance );
UnivariateGaussian.PDF importanceDistribution =
new UnivariateGaussian.PDF( mean+mean, 2.0*variance );
ImportanceSampler<Double> sampler =
new ImportanceSampler<Double>( importanceDistribution );
System.out.println( "Target = " + targetDistribution );
System.out.println( "Importance = " + importanceDistribution );
UnivariateMonteCarloIntegrator instance =
new UnivariateMonteCarloIntegrator();
int num = 100;
ArrayList<Double> means = new ArrayList<Double>( num );
ArrayList<Double> variances = new ArrayList<Double>( num );
for( int n = 0; n < num; n++ )
{
UnivariateGaussian.PDF g =
instance.getMean( sampler.sample(targetDistribution, RANDOM, NUM_SAMPLES ) );
means.add( g.getMean() );
variances.add( g.getVariance() );
}
UnivariateGaussian sampleMeanDistribution =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(means, 0.0);
UnivariateGaussian sampleVarianceDistribution =
UnivariateGaussian.MaximumLikelihoodEstimator.learn(variances, 0.0);
ConfidenceInterval ci = StudentTConfidence.INSTANCE.computeConfidenceInterval(
sampleMeanDistribution.getMean(), sampleMeanDistribution.getVariance(), num, 0.95 );
System.out.println( "====== Mean ========" );
System.out.println( "Target = " + targetDistribution );
System.out.println( "Sample = " + sampleMeanDistribution );
System.out.println( "Interval = " + ci );
assertTrue( ci.withinInterval( targetDistribution.getMean() ) );
ConfidenceInterval vi = StudentTConfidence.INSTANCE.computeConfidenceInterval(
sampleVarianceDistribution.getMean(), sampleVarianceDistribution.getVariance(), num, 0.95 );
double s2 = importanceDistribution.getVariance();
double s2hat = targetDistribution.getVariance();
double y = targetDistribution.getMean();
double m = importanceDistribution.getMean();
double mhat = (s2*m + s2hat*y) / (s2 + s2hat);
double varianceTarget = mhat/NUM_SAMPLES;
System.out.println( "====== Variance =======" );
System.out.println( "Target = " + varianceTarget );
System.out.println( "Sample = " + sampleVarianceDistribution );
System.out.println( "Interval = " + vi );
assertTrue( vi.withinInterval(varianceTarget) );
}
}