/* * File: MultivariateMixtureDensityModelTest.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.matrix.Matrix; import gov.sandia.cognition.math.matrix.MatrixFactory; import gov.sandia.cognition.statistics.MultivariateClosedFormComputableDistributionTestHarness; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.VectorFactory; import java.util.ArrayList; import java.util.Arrays; import java.util.Random; /** * * @author krdixon */ public class MultivariateMixtureDensityModelTest extends MultivariateClosedFormComputableDistributionTestHarness<Vector> { /** * stuff * @param testName */ public MultivariateMixtureDensityModelTest( String testName ) { super( testName ); } @Override public MixtureOfGaussians.PDF createInstance() { return createMixture(3, 2, RANDOM); } public static MixtureOfGaussians.PDF createMixture( int numGaussians, int numDimensions, Random random) { double range = 10.0; ArrayList<MultivariateGaussian.PDF> gaussians = new ArrayList<MultivariateGaussian.PDF>(numGaussians); for (int i = 0; i < numGaussians; i++) { Vector mean = VectorFactory.getDefault().createUniformRandom(numDimensions, -range, range, random); Matrix covariance = MatrixFactory.getDefault().createIdentity( numDimensions, numDimensions).scale(0.5 * range); gaussians.add(new MultivariateGaussian.PDF(mean, covariance)); } if (random.nextBoolean() == true) { double[] prior = new double[ numGaussians ]; for( int i = 0; i < numGaussians; i++ ) { prior[i] = random.nextDouble(); } return new MixtureOfGaussians.PDF(gaussians, prior); } else { return new MixtureOfGaussians.PDF(gaussians); } } @Override public void testDistributionGetProbabilityFunction() { } @Override public void testGetMean() { double temp = TOLERANCE; TOLERANCE = 5e-1; super.testGetMean(); TOLERANCE = temp; } @Override public void testConstructors() { System.out.println( "Constructors" ); MultivariateGaussian g1 = new MultivariateGaussian(); MultivariateMixtureDensityModel<MultivariateGaussian> instance = new MultivariateMixtureDensityModel<MultivariateGaussian>( Arrays.asList(g1) ); assertEquals( 1, instance.getDistributionCount() ); assertSame( g1, instance.getDistributions().get(0) ); assertEquals( 1.0, instance.getPriorWeights()[0] ); MultivariateGaussian g2 = new MultivariateGaussian(); MultivariateMixtureDensityModel<MultivariateGaussian> i2 = new MultivariateMixtureDensityModel<MultivariateGaussian>( Arrays.asList(g1, g2) ); instance = new MultivariateMixtureDensityModel<MultivariateGaussian>( i2 ); assertEquals( i2.getDistributionCount(), instance.getDistributionCount() ); assertNotSame( i2.getDistributions(), instance.getDistributions() ); assertNotSame( i2.getPriorWeights(), instance.getPriorWeights() ); assertEquals( i2.getPriorWeightSum(), instance.getPriorWeightSum() ); } @Override public void testProbabilityFunctionConstructors() { System.out.println( "PDF Constructors" ); MultivariateGaussian g1 = new MultivariateGaussian(); MultivariateMixtureDensityModel.PDF<MultivariateGaussian> instance = new MultivariateMixtureDensityModel.PDF<MultivariateGaussian>( Arrays.asList(g1) ); assertEquals( 1, instance.getDistributionCount() ); assertSame( g1, instance.getDistributions().get(0) ); assertEquals( 1.0, instance.getPriorWeights()[0] ); MultivariateGaussian g2 = new MultivariateGaussian(); MultivariateMixtureDensityModel.PDF<MultivariateGaussian> i2 = new MultivariateMixtureDensityModel.PDF<MultivariateGaussian>( Arrays.asList(g1, g2) ); instance = new MultivariateMixtureDensityModel.PDF<MultivariateGaussian>( i2 ); assertEquals( i2.getDistributionCount(), instance.getDistributionCount() ); assertNotSame( i2.getDistributions(), instance.getDistributions() ); assertNotSame( i2.getPriorWeights(), instance.getPriorWeights() ); assertEquals( i2.getPriorWeightSum(), instance.getPriorWeightSum() ); } @Override public void testProbabilityFunctionKnownValues() { int numGaussians = 5; int numDimensions = 2; MultivariateMixtureDensityModel.PDF<MultivariateGaussian> mog = createMixture(numGaussians, numDimensions, RANDOM); double r = 2.0; Vector input = VectorFactory.getDefault().createUniformRandom( numDimensions, -r, r, RANDOM ); double sum = 0.0; for( int i = 0; i < numGaussians; i++ ) { sum += mog.getDistributions().get(i).getProbabilityFunction().evaluate(input) * mog.getPriorWeights()[i]; } assertEquals( sum/mog.getPriorWeightSum(), mog.evaluate(input),TOLERANCE ); } @Override public void testKnownConvertToVector() { System.out.println( "Known convertToVector" ); MixtureOfGaussians.PDF instance = this.createInstance(); Vector p = instance.convertToVector(); assertEquals( VectorFactory.getDefault().copyArray(instance.getPriorWeights()), p ); assertNotSame( instance.getPriorWeights(), p ); } @Override public void testKnownValues() { this.testProbabilityFunctionKnownValues(); } }