/*
* File: ScalarMixtureDensityModelTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Apr 12, 2011, 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.distribution;
import gov.sandia.cognition.math.UnivariateStatisticsUtil;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.statistics.SmoothUnivariateDistributionTestHarness;
import gov.sandia.cognition.statistics.method.KolmogorovSmirnovConfidence;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
/**
* Tests for class ScalarMixtureDensityModelTest.
* @author krdixon
*/
public class ScalarMixtureDensityModelTest
extends SmoothUnivariateDistributionTestHarness
{
/**
* Default Constructor
* @param testName Test name
*/
public ScalarMixtureDensityModelTest(
String testName )
{
super( testName );
}
@Override
public ScalarMixtureDensityModel createInstance()
{
ScalarMixtureDensityModel instance = new ScalarMixtureDensityModel(
new UnivariateGaussian.PDF( 1.0, 1.0 ),
new UnivariateGaussian.PDF( -1.0, 0.5 ) );
instance.getPriorWeights()[0] = RANDOM.nextDouble();
instance.getPriorWeights()[1] = RANDOM.nextDouble();
return instance;
}
/**
* Tests the case of 2 Gaussians
*/
public void testLearner2Gaussians()
{
System.out.println( "Learner 2 Gaussians" );
ScalarMixtureDensityModel target = this.createInstance();
ArrayList<Double> samples = target.sample(RANDOM, NUM_SAMPLES);
ScalarMixtureDensityModel.EMLearner learner =
new ScalarMixtureDensityModel.EMLearner(
2, new UnivariateGaussian.WeightedMaximumLikelihoodEstimator(), RANDOM );
ScalarMixtureDensityModel estimate = learner.learn(samples);
System.out.println( "Estimate: " + estimate );
KolmogorovSmirnovConfidence.Statistic kstest =
KolmogorovSmirnovConfidence.evaluateNullHypothesis( samples, estimate.getCDF() );
System.out.println( "K-S Test: " + kstest );
assertEquals( 1.0, kstest.getNullHypothesisProbability(), CONFIDENCE );
}
public void testLearner3Distribution()
{
System.out.println( "Learner 3 Distributions" );
RANDOM.setSeed(1234);
ScalarMixtureDensityModel target = new ScalarMixtureDensityModel(
new UnivariateGaussian( 1.0, 1.0 ),
new ExponentialDistribution( 10.0 ),
new LaplaceDistribution( -1.0, 2.0 ) );
ArrayList<Double> samples = target.sample(RANDOM, NUM_SAMPLES);
System.out.println("Samples: " + samples);
System.out.println("Mean: " + UnivariateStatisticsUtil.computeMean(samples));
@SuppressWarnings("unchecked")
ScalarMixtureDensityModel.EMLearner learner =
new ScalarMixtureDensityModel.EMLearner(
RANDOM,
Arrays.asList(
new UnivariateGaussian.WeightedMaximumLikelihoodEstimator(),
new ExponentialDistribution.WeightedMaximumLikelihoodEstimator(),
new LaplaceDistribution.WeightedMaximumLikelihoodEstimator() ));
ScalarMixtureDensityModel estimate = learner.learn(samples);
System.out.println( "Estimate: " + estimate );
KolmogorovSmirnovConfidence.Statistic kstest =
KolmogorovSmirnovConfidence.evaluateNullHypothesis( samples, estimate.getCDF() );
System.out.println( "K-S Test: " + kstest );
assertEquals( 1.0, kstest.getNullHypothesisProbability(), CONFIDENCE );
}
@Override
public void testDistributionConstructors()
{
System.out.println( "Constructors" );
ScalarMixtureDensityModel instance = new ScalarMixtureDensityModel();
assertEquals( 1, instance.getDistributionCount() );
assertEquals( 1.0, instance.getPriorWeights()[0] );
assertTrue( instance.getDistributions().get(0) instanceof UnivariateGaussian );
UnivariateGaussian g1 = new UnivariateGaussian();
ExponentialDistribution e1 = new ExponentialDistribution();
instance = new ScalarMixtureDensityModel( g1, e1 );
assertEquals( 2, instance.getDistributionCount() );
assertSame( g1, instance.getDistributions().get(0) );
assertSame( e1, instance.getDistributions().get(1) );
assertEquals( instance.getPriorWeights()[0], instance.getPriorWeights()[1] );
ScalarMixtureDensityModel i2 = new ScalarMixtureDensityModel( instance );
assertNotSame( i2.getDistributions(), instance.getDistributions() );
assertNotSame( i2.getPriorWeights(), instance.getPriorWeights() );
assertTrue( Arrays.equals(i2.getPriorWeights(), instance.getPriorWeights() ) );
try
{
instance = new ScalarMixtureDensityModel( Arrays.asList( g1 ), new double[]{ 1.0, 2.0 } );
fail( "Must be same size!" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public void testCDFConstructors()
{
System.out.println( "CDF Constructors" );
ScalarMixtureDensityModel.CDF instance = new ScalarMixtureDensityModel.CDF();
assertEquals( 1, instance.getDistributionCount() );
assertEquals( 1.0, instance.getPriorWeights()[0] );
assertTrue( instance.getDistributions().get(0) instanceof UnivariateGaussian );
UnivariateGaussian g1 = new UnivariateGaussian();
ExponentialDistribution e1 = new ExponentialDistribution();
instance = new ScalarMixtureDensityModel.CDF( g1, e1 );
assertEquals( 2, instance.getDistributionCount() );
assertSame( g1, instance.getDistributions().get(0) );
assertSame( e1, instance.getDistributions().get(1) );
assertEquals( instance.getPriorWeights()[0], instance.getPriorWeights()[1] );
ScalarMixtureDensityModel i2 = new ScalarMixtureDensityModel( instance );
assertNotSame( i2.getDistributions(), instance.getDistributions() );
assertNotSame( i2.getPriorWeights(), instance.getPriorWeights() );
assertTrue( Arrays.equals(i2.getPriorWeights(), instance.getPriorWeights() ) );
try
{
instance = new ScalarMixtureDensityModel.CDF(
Arrays.asList( g1 ), new double[]{ 1.0, 2.0 } );
fail( "Must be same size!" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public void testPDFConstructors()
{
System.out.println( "PDF Constructors" );
ScalarMixtureDensityModel.PDF instance = new ScalarMixtureDensityModel.PDF();
assertEquals( 1, instance.getDistributionCount() );
assertEquals( 1.0, instance.getPriorWeights()[0] );
assertTrue( instance.getDistributions().get(0) instanceof UnivariateGaussian );
UnivariateGaussian g1 = new UnivariateGaussian();
ExponentialDistribution e1 = new ExponentialDistribution();
instance = new ScalarMixtureDensityModel.PDF( g1, e1 );
assertEquals( 2, instance.getDistributionCount() );
assertSame( g1, instance.getDistributions().get(0) );
assertSame( e1, instance.getDistributions().get(1) );
assertEquals( instance.getPriorWeights()[0], instance.getPriorWeights()[1] );
ScalarMixtureDensityModel i2 = new ScalarMixtureDensityModel( instance );
assertNotSame( i2.getDistributions(), instance.getDistributions() );
assertNotSame( i2.getPriorWeights(), instance.getPriorWeights() );
assertTrue( Arrays.equals(i2.getPriorWeights(), instance.getPriorWeights() ) );
try
{
instance = new ScalarMixtureDensityModel.PDF(
Arrays.asList( g1 ), new double[]{ 1.0, 2.0 } );
fail( "Must be same size!" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public void testPDFKnownValues()
{
System.out.println( "PDF Known Values" );
ScalarMixtureDensityModel.PDF pdf = new ScalarMixtureDensityModel.PDF(
Arrays.asList( new UnivariateGaussian( 0.0, 1.0 ),
new UnivariateGaussian( 5.0, 2.0 ) ),
new double[]{ 0.7, 0.3 } );
// Dan Morrow calculated these...
assertEquals(0.279422967598279, pdf.evaluate(0.0), TOLERANCE);
assertEquals(0.074871303008531, pdf.evaluate(5.7), TOLERANCE);
assertEquals(0.119962166165605, pdf.evaluate(-1.3), TOLERANCE);
}
@Override
public void testCDFKnownValues()
{
System.out.println( "CDF Known Values" );
ScalarMixtureDensityModel.CDF cdf = new ScalarMixtureDensityModel.CDF(
Arrays.asList( new UnivariateGaussian( 0.0, 1.0 ),
new UnivariateGaussian( 5.0, 2.0 ) ),
new double[]{ 0.7, 0.3 } );
// Dan Morrow calculated these...
assertEquals(0.215991370396509, cdf.evaluate(-0.5), TOLERANCE);
assertEquals(0.3500610428078071, cdf.evaluate(0.0), TOLERANCE);
assertEquals(0.633573006281660, cdf.evaluate(1.3), TOLERANCE);
assertEquals(0.906907303841087, cdf.evaluate(5.7), TOLERANCE);
assertEquals(0.999996686425450, cdf.evaluate(11.0), TOLERANCE);
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "Known convertToVector" );
ScalarMixtureDensityModel instance = this.createInstance();
Vector p = instance.convertToVector();
Vector d1 = instance.getDistributions().get(0).convertToVector();
Vector d2 = instance.getDistributions().get(1).convertToVector();
assertEquals( 6, p.getDimensionality() );
int index = 0;
assertEquals( instance.getPriorWeights()[0], p.getElement(index++) );
assertEquals( instance.getPriorWeights()[1], p.getElement(index++) );
assertEquals( d1.getElement(0), p.getElement(index++) );
assertEquals( d1.getElement(1), p.getElement(index++) );
assertEquals( d2.getElement(0), p.getElement(index++) );
assertEquals( d2.getElement(1), p.getElement(index++) );
}
@Override
public void testPDFMonteCarlo()
{
double temp = MONTE_CARLO_FACTOR;
MONTE_CARLO_FACTOR = 10.0;
super.testPDFMonteCarlo();
MONTE_CARLO_FACTOR = temp;
}
}