/* * File: MaximumLikelihoodDistributionEstimatorTest.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright Jul 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.method; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.VectorReader; import gov.sandia.cognition.statistics.ClosedFormComputableDistribution; import gov.sandia.cognition.statistics.ClosedFormDiscreteUnivariateDistribution; import gov.sandia.cognition.statistics.SmoothUnivariateDistribution; import gov.sandia.cognition.statistics.distribution.BetaDistribution; import gov.sandia.cognition.statistics.distribution.CauchyDistribution; import gov.sandia.cognition.statistics.distribution.ExponentialDistribution; import gov.sandia.cognition.statistics.distribution.InverseGammaDistribution; import gov.sandia.cognition.statistics.distribution.LaplaceDistribution; import gov.sandia.cognition.statistics.distribution.LogNormalDistribution; import gov.sandia.cognition.statistics.distribution.ParetoDistribution; import gov.sandia.cognition.statistics.distribution.StudentTDistribution; import gov.sandia.cognition.statistics.distribution.UniformDistribution; import gov.sandia.cognition.statistics.distribution.UnivariateGaussian; import gov.sandia.cognition.statistics.distribution.WeibullDistribution; import java.io.File; import java.io.FileReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.List; import junit.framework.TestCase; import java.util.Random; /** * Unit tests for MaximumLikelihoodDistributionEstimatorTest. * * @author krdixon */ public class MaximumLikelihoodDistributionEstimatorTest 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; /** * Tests for class MaximumLikelihoodDistributionEstimatorTest. * @param testName Name of the test. */ public MaximumLikelihoodDistributionEstimatorTest( String testName) { super(testName); } /** * Tests the constructors of class MaximumLikelihoodDistributionEstimatorTest. */ public void testConstructors() { System.out.println( "Constructors" ); MaximumLikelihoodDistributionEstimator<Double> instance = new MaximumLikelihoodDistributionEstimator<Double>(); assertNull( instance.getDistributions() ); Collection<UnivariateGaussian> gs = Arrays.asList(new UnivariateGaussian()); instance = new MaximumLikelihoodDistributionEstimator<Double>( gs ); assertSame( gs, instance.getDistributions() ); } /** * Test of clone method, of class MaximumLikelihoodDistributionEstimator. */ public void testClone() { System.out.println("clone"); Collection<UnivariateGaussian> gs = Arrays.asList(new UnivariateGaussian()); MaximumLikelihoodDistributionEstimator<Double> instance = new MaximumLikelihoodDistributionEstimator<Double>( gs ); MaximumLikelihoodDistributionEstimator<Double> clone = instance.clone(); assertNotSame( instance, clone ); assertNotSame( instance.getDistributions(), clone.getDistributions() ); assertEquals( instance.getDistributions().size(), clone.getDistributions().size() ); } /** * Test of getDistributions method, of class MaximumLikelihoodDistributionEstimator. */ public void testGetDistributions() { System.out.println("getDistributions"); Collection<UnivariateGaussian> gs = Arrays.asList(new UnivariateGaussian()); MaximumLikelihoodDistributionEstimator<Double> instance = new MaximumLikelihoodDistributionEstimator<Double>(gs); assertSame( gs, instance.getDistributions() ); } /** * Test of setDistributions method, of class MaximumLikelihoodDistributionEstimator. */ public void testSetDistributions() { System.out.println("setDistributions"); Collection<UnivariateGaussian> gs = Arrays.asList(new UnivariateGaussian()); MaximumLikelihoodDistributionEstimator<Double> instance = new MaximumLikelihoodDistributionEstimator<Double>(gs); assertSame( gs, instance.getDistributions() ); instance.setDistributions(null); assertNull( instance.getDistributions() ); instance.setDistributions(gs); assertSame( gs, instance.getDistributions() ); } /** * Test of learn method, of class MaximumLikelihoodDistributionEstimator. */ public void testLearn() { System.out.println("learn"); WeibullDistribution target = new WeibullDistribution( 5.0, 1.0 ); ArrayList<Double> samples = target.sample(RANDOM,10); Collection<? extends ClosedFormComputableDistribution<Double>> distributions = Arrays.asList( new UnivariateGaussian(), // new WeibullDistribution(), // new GammaDistribution(), new BetaDistribution(), new ExponentialDistribution(), new InverseGammaDistribution(), new LaplaceDistribution(), new LogNormalDistribution(), new ParetoDistribution(), new StudentTDistribution(), new UniformDistribution(), new CauchyDistribution() ); MaximumLikelihoodDistributionEstimator<Double> estimator = new MaximumLikelihoodDistributionEstimator<Double>( distributions ); ClosedFormComputableDistribution<Double> best = estimator.learn(samples); System.out.println( "Best: " + best.getClass().getSimpleName() + ", Parameters: " + best.convertToVector() ); } public void testGetDistributionClasses() throws Exception { System.out.println( "getDistributionClasses" ); System.out.println( "\n=========== Smooth =========" ); LinkedList<SmoothUnivariateDistribution> i1 = MaximumLikelihoodDistributionEstimator.getDistributionClasses( SmoothUnivariateDistribution.class ); for( SmoothUnivariateDistribution distribution : i1 ) { System.out.println( distribution.getClass().getCanonicalName() + ": " + distribution.convertToVector() ); } System.out.println( "\n=========== Discrete =======" ); @SuppressWarnings("rawtypes") LinkedList<? extends ClosedFormDiscreteUnivariateDistribution> i2 = MaximumLikelihoodDistributionEstimator.getDistributionClasses( ClosedFormDiscreteUnivariateDistribution.class ); for( ClosedFormComputableDistribution<?> distribution : i2 ) { System.out.println( distribution.getClass().getCanonicalName() + ": " + distribution.convertToVector() ); } } public void testEstimateContinuousDistribution() throws Exception { System.out.println( "estimateContinuousDistribution" ); WeibullDistribution target = new WeibullDistribution( 5.0, 1.0 ); ArrayList<Double> samples = target.sample(RANDOM,100); SmoothUnivariateDistribution distribution = MaximumLikelihoodDistributionEstimator.estimateContinuousDistribution(samples); System.out.println( "ML Distribution: " + distribution.getClass().getCanonicalName() + ": " + distribution.convertToVector() ); } }