/* * File: LogNormalDistributionTest.java * Authors: Kevin R. Dixon * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright November 13, 2007, 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.Vector; import gov.sandia.cognition.statistics.SmoothUnivariateDistributionTestHarness; import java.util.Random; /** * * @author Kevin R. Dixon */ public class LogNormalDistributionTest extends SmoothUnivariateDistributionTestHarness { /** * Constructor * @param testName name */ public LogNormalDistributionTest( String testName ) { super( testName ); RANDOM = new Random(10); } @Override public LogNormalDistribution createInstance() { double mean = RANDOM.nextGaussian(); double variance = RANDOM.nextDouble(); return new LogNormalDistribution( mean, variance ); } @Override public void testPDFKnownValues() { System.out.println( "PDF.evaluate" ); // These were found using the octave command lognormal_pdf(x,exp(mean),variance) // (Note that their mean has an exp() around it... assertEquals( 0.2419707245, LogNormalDistribution.PDF.evaluate( 1.0, 1.0, 1.0 ), TOLERANCE ); assertEquals( 0.0539909665, LogNormalDistribution.PDF.evaluate( 1.0, 2.0, 1.0 ), TOLERANCE ); assertEquals( 0.1182550739, LogNormalDistribution.PDF.evaluate( 1.0, 2.0, 3.0 ), TOLERANCE ); assertEquals( 0.0540788845, LogNormalDistribution.PDF.evaluate( 4.0, 2.0, 3.0 ), TOLERANCE ); } @Override public void testCDFKnownValues() { System.out.println( "PDF.CDF.evaluate" ); assertEquals( 0.1586552539, LogNormalDistribution.CDF.evaluate( 1.0, 1.0, 1.0 ), TOLERANCE ); assertEquals( 0.5392769437, LogNormalDistribution.CDF.evaluate( 3.0, 1.0, 1.0 ), TOLERANCE ); assertEquals( 0.1836911064, LogNormalDistribution.CDF.evaluate( 3.0, 2.0, 1.0 ), TOLERANCE ); assertEquals( 0.3261051057, LogNormalDistribution.CDF.evaluate( 3.0, 2.0, 4.0 ), TOLERANCE ); } /** * Test of getLogNormalMean method, of class gov.sandia.cognition.statistics.distribution.LogNormalDistribution. */ public void testGetLogNormalMean() { System.out.println( "getLogNormalMean" ); double m = RANDOM.nextGaussian(); double v = RANDOM.nextDouble(); LogNormalDistribution instance = new LogNormalDistribution( m, v ); assertEquals( m, instance.getLogNormalMean() ); } /** * Test of setLogNormalMean method, of class gov.sandia.cognition.statistics.distribution.LogNormalDistribution. */ public void testSetLogNormalMean() { System.out.println( "setLogNormalMean" ); double m = RANDOM.nextGaussian(); double v = RANDOM.nextDouble(); LogNormalDistribution instance = new LogNormalDistribution( m, v ); assertEquals( m, instance.getLogNormalMean() ); double m2 = m + 1; instance.setLogNormalMean( m2 ); assertEquals( m2, instance.getLogNormalMean() ); } /** * Test of getLogNormalVariance method, of class gov.sandia.cognition.statistics.distribution.LogNormalDistribution. */ public void testGetLogNormalVariance() { System.out.println( "getLogNormalVariance" ); double m = RANDOM.nextGaussian(); double v = RANDOM.nextDouble(); LogNormalDistribution.PDF instance = new LogNormalDistribution.PDF( m, v ); assertEquals( v, instance.getLogNormalVariance() ); } /** * Test of setLogNormalVariance method, of class gov.sandia.cognition.statistics.distribution.LogNormalDistribution. */ public void testSetLogNormalVariance() { System.out.println( "setLogNormalVariance" ); double m = RANDOM.nextGaussian(); double v = RANDOM.nextDouble(); LogNormalDistribution.PDF instance = new LogNormalDistribution.PDF( m, v ); assertEquals( v, instance.getLogNormalVariance() ); double v2 = v + 1; instance.setLogNormalVariance( v2 ); assertEquals( v2, instance.getLogNormalVariance() ); try { instance.setLogNormalVariance( 0.0 ); fail( "logNormalVariance must be > 0.0" ); } catch (Exception e) { System.out.println( "Good: " + e ); } } @Override public void testKnownConvertToVector() { System.out.println( "CDF.convertToVector" ); LogNormalDistribution f = this.createInstance(); Vector x = f.convertToVector(); assertEquals( 2, x.getDimensionality() ); assertEquals( f.getLogNormalMean(), x.getElement( 0 ) ); assertEquals( f.getLogNormalVariance(), x.getElement( 1 ) ); } @Override public void testPDFConstructors() { System.out.println( "PDF Constructor" ); LogNormalDistribution.PDF d = new LogNormalDistribution.PDF(); assertEquals( LogNormalDistribution.DEFAULT_LOG_NORMAL_MEAN, d.getLogNormalMean() ); assertEquals( LogNormalDistribution.DEFAULT_LOG_NORMAL_VARIANCE, d.getLogNormalVariance() ); double m = RANDOM.nextGaussian(); double v = Math.abs( RANDOM.nextGaussian() ); d = new LogNormalDistribution.PDF( m, v ); assertEquals( m, d.getLogNormalMean() ); assertEquals( v, d.getLogNormalVariance() ); LogNormalDistribution.PDF d2 = new LogNormalDistribution.PDF( d ); assertEquals( d.getLogNormalMean(), d2.getLogNormalMean() ); assertEquals( d.getLogNormalVariance(), d2.getLogNormalVariance() ); } @Override public void testDistributionConstructors() { System.out.println( "Constructor" ); LogNormalDistribution d = new LogNormalDistribution(); assertEquals( LogNormalDistribution.DEFAULT_LOG_NORMAL_MEAN, d.getLogNormalMean() ); assertEquals( LogNormalDistribution.DEFAULT_LOG_NORMAL_VARIANCE, d.getLogNormalVariance() ); double m = RANDOM.nextGaussian(); double v = Math.abs( RANDOM.nextGaussian() ); d = new LogNormalDistribution( m, v ); assertEquals( m, d.getLogNormalMean() ); assertEquals( v, d.getLogNormalVariance() ); LogNormalDistribution d2 = new LogNormalDistribution( d ); assertEquals( d.getLogNormalMean(), d2.getLogNormalMean() ); assertEquals( d.getLogNormalVariance(), d2.getLogNormalVariance() ); } @Override public void testCDFConstructors() { System.out.println( "CDF Constructor" ); LogNormalDistribution.CDF d = new LogNormalDistribution.CDF(); assertEquals( LogNormalDistribution.DEFAULT_LOG_NORMAL_MEAN, d.getLogNormalMean() ); assertEquals( LogNormalDistribution.DEFAULT_LOG_NORMAL_VARIANCE, d.getLogNormalVariance() ); double m = RANDOM.nextGaussian(); double v = Math.abs( RANDOM.nextGaussian() ); d = new LogNormalDistribution.CDF( m, v ); assertEquals( m, d.getLogNormalMean() ); assertEquals( v, d.getLogNormalVariance() ); LogNormalDistribution.CDF d2 = new LogNormalDistribution.CDF( d ); assertEquals( d.getLogNormalMean(), d2.getLogNormalMean() ); assertEquals( d.getLogNormalVariance(), d2.getLogNormalVariance() ); } /** * MaximumLikelihoodEstimator */ public void testMaximumLikelihoodEstimator() { System.out.println( "MaximumLikelihoodEstimator" ); LogNormalDistribution.MaximumLikelihoodEstimator learner = new LogNormalDistribution.MaximumLikelihoodEstimator(); this.distributionEstimatorTest(learner); } /** * Weighted learner */ public void testWeightedMaximumLikelihoodEstimator() { System.out.println( "WeightedMaximumLikelihoodEstimator" ); LogNormalDistribution.WeightedMaximumLikelihoodEstimator learner = new LogNormalDistribution.WeightedMaximumLikelihoodEstimator(); this.weightedDistributionEstimatorTest(learner); } }