/*
* File: StandardNormalizerTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright September 21, 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.learning.data.feature;
import gov.sandia.cognition.statistics.distribution.UnivariateGaussian;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Random;
import junit.framework.TestCase;
/**
* This class implements JUnit tests for the following classes: StandardDistributionNormalizer
*
* @author Justin Basilico
* @since 2.0
*/
public class StandardDistributionNormalizerTest
extends TestCase
{
public final Random RANDOM = new Random(1);
public final double TOLERANCE = 1e-5;
public StandardDistributionNormalizerTest(
String testName)
{
super(testName);
}
public void testConstants()
{
assertEquals(0.0, StandardDistributionNormalizer.DEFAULT_MEAN);
assertEquals(1.0, StandardDistributionNormalizer.DEFAULT_VARIANCE);
}
public void testConstructors()
{
StandardDistributionNormalizer instance =
new StandardDistributionNormalizer();
assertEquals(StandardDistributionNormalizer.DEFAULT_MEAN,
instance.getMean());
assertEquals(StandardDistributionNormalizer.DEFAULT_VARIANCE,
instance.getVariance());
double mean = RANDOM.nextGaussian();
double variance = RANDOM.nextDouble();
instance = new StandardDistributionNormalizer(mean, variance);
assertEquals(mean, instance.getMean());
assertEquals(variance, instance.getVariance());
UnivariateGaussian gaussian = new UnivariateGaussian(mean, variance);
instance = new StandardDistributionNormalizer(gaussian);
assertEquals(mean, instance.getMean());
assertEquals(variance, instance.getVariance());
instance = new StandardDistributionNormalizer(instance);
assertEquals(mean, instance.getMean());
assertEquals(variance, instance.getVariance());
}
/**
* Test of clone method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.
*/
public void testClone()
{
double mean = RANDOM.nextGaussian();
double variance = RANDOM.nextDouble();
StandardDistributionNormalizer instance =
new StandardDistributionNormalizer(mean, variance);
StandardDistributionNormalizer clone = instance.clone();
assertNotNull( clone );
assertNotSame(instance, clone);
assertEquals(mean, clone.getMean());
assertEquals(variance, clone.getVariance());
}
/**
* Test of evaluate method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.
*/
public void testEvaluate()
{
double mean = RANDOM.nextGaussian();
double variance = RANDOM.nextDouble();
StandardDistributionNormalizer instance =
new StandardDistributionNormalizer(mean, variance);
assertEquals(0.0, instance.evaluate(mean));
assertEquals(+1.0, instance.evaluate(mean + Math.sqrt(variance)), TOLERANCE);
assertEquals(-1.0, instance.evaluate(mean - Math.sqrt(variance)), TOLERANCE);
int count = 100;
for (int i = 0; i < count; i++)
{
double value = RANDOM.nextGaussian();
double expected = (value - mean) / Math.sqrt(variance);
assertEquals(expected, instance.evaluate(value), TOLERANCE);
}
}
/**
* Test of getMean method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.
*/
public void testGetMean()
{
this.testSetMean();
}
/**
* Test of setMean method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.
*/
public void testSetMean()
{
StandardDistributionNormalizer instance = new StandardDistributionNormalizer();
assertEquals(StandardDistributionNormalizer.DEFAULT_MEAN, instance.getMean());
double mean = RANDOM.nextGaussian();
instance.setMean(mean);
assertEquals(mean, instance.getMean());
mean = -RANDOM.nextGaussian();
instance.setMean(mean);
assertEquals(mean, instance.getMean());
mean = 0.0;
instance.setMean(mean);
assertEquals(mean, instance.getMean());
}
/**
* Test of getStandardDeviation method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.
*/
public void testGetVariance()
{
this.testSetVariance();
}
/**
* Test of setStandardDeviation method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.
*/
public void testSetVariance()
{
StandardDistributionNormalizer instance = new StandardDistributionNormalizer();
assertEquals(StandardDistributionNormalizer.DEFAULT_VARIANCE,
instance.getVariance());
double variance = RANDOM.nextDouble();
instance.setVariance(variance);
assertEquals(variance, instance.getVariance());
variance += RANDOM.nextDouble();
instance.setVariance(variance);
assertEquals(variance, instance.getVariance());
boolean exceptionThrown = false;
try
{
instance.setVariance(0.0);
}
catch ( IllegalArgumentException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
instance.setVariance(-Math.random());
}
catch ( IllegalArgumentException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
}
/**
* Test of learn method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.
*/
public void testLearn()
{
Collection<Double> values = new ArrayList<Double>();
values.add(4.0);
values.add(4.5);
values.add(6.5);
values.add(7.0);
StandardDistributionNormalizer instance =
StandardDistributionNormalizer.learn(values);
assertEquals(5.5, instance.getMean(), TOLERANCE);
assertEquals(1.625, instance.getVariance(), TOLERANCE );
values.add(5.5);
instance =
StandardDistributionNormalizer.learn(values);
assertEquals(5.5, instance.getMean(), TOLERANCE);
assertEquals(1.3, instance.getVariance(), TOLERANCE);
values.add(-1000.0);
values.add(1000000.0);
instance =
StandardDistributionNormalizer.learn(values, 2.0 / ((double) values.size()));
assertEquals(5.5, instance.getMean(), TOLERANCE);
assertEquals(1.3, instance.getVariance(), TOLERANCE);
values.clear();
values.add(4.7);
instance = StandardDistributionNormalizer.learn(values);
assertEquals(4.7, instance.getMean());
assertEquals(1.0, instance.getVariance());
boolean exceptionThrown = false;
try
{
instance = StandardDistributionNormalizer.learn(null);
}
catch ( NullPointerException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
instance = StandardDistributionNormalizer.learn(values, 1.0);
}
catch ( IllegalArgumentException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
instance = StandardDistributionNormalizer.learn(values, -RANDOM.nextDouble());
}
catch ( IllegalArgumentException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
values.clear();
exceptionThrown = false;
try
{
instance = StandardDistributionNormalizer.learn(values);
}
catch ( IllegalArgumentException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
}
public void testLearnerConstants()
{
assertEquals(0.0,
StandardDistributionNormalizer.Learner.DEFAULT_OUTLIER_PERCENT);
}
public void testLearnerConstructors()
{
StandardDistributionNormalizer.Learner instance =
new StandardDistributionNormalizer.Learner();
assertEquals(StandardDistributionNormalizer.Learner.DEFAULT_OUTLIER_PERCENT,
instance.getOutlierPercent());
double outlierPercent = RANDOM.nextDouble();
instance =
new StandardDistributionNormalizer.Learner(outlierPercent);
assertEquals(outlierPercent, instance.getOutlierPercent());
}
/**
* Test of learn method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.Learner.
*/
public void testLearner()
{
Collection<Double> values = new ArrayList<Double>();
values.add(4.0);
values.add(4.5);
values.add(6.5);
values.add(7.0);
StandardDistributionNormalizer.Learner instance =
new StandardDistributionNormalizer.Learner();
StandardDistributionNormalizer normalizer = instance.learn(values);
assertEquals(5.5, normalizer.getMean(), TOLERANCE);
assertEquals(1.625, normalizer.getVariance(), TOLERANCE);
values.add(5.5);
normalizer = instance.learn(values);
assertEquals(5.5, normalizer.getMean(), TOLERANCE);
assertEquals(1.3, normalizer.getVariance(), TOLERANCE);
values.add(-1000.0);
values.add(1000000.0);
instance.setOutlierPercent(2.0 / ((double) values.size()));
normalizer = instance.learn(values);
assertEquals(5.5, normalizer.getMean(), TOLERANCE);
assertEquals(1.3, normalizer.getVariance(), TOLERANCE);
values.clear();
values.add(4.7);
instance.setOutlierPercent(0.0);
normalizer = instance.learn(values);
assertEquals(4.7, normalizer.getMean());
assertEquals(1.0, normalizer.getVariance());
}
/**
* Test of getOutlierPercent method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.Learner.
*/
public void testLearnerGetOutlierPercent()
{
this.testLearnerSetOutlierPercent();
}
/**
* Test of setOutlierPercent method, of class gov.sandia.cognition.learning.normalization.StandardDistributionNormalizer.Learner.
*/
public void testLearnerSetOutlierPercent()
{
StandardDistributionNormalizer.Learner instance =
new StandardDistributionNormalizer.Learner();
assertEquals(StandardDistributionNormalizer.Learner.DEFAULT_OUTLIER_PERCENT,
instance.getOutlierPercent());
double outlierPercent = RANDOM.nextDouble();
instance.setOutlierPercent(outlierPercent);
assertEquals(outlierPercent, instance.getOutlierPercent());
outlierPercent *= RANDOM.nextDouble();
instance.setOutlierPercent(outlierPercent);
assertEquals(outlierPercent, instance.getOutlierPercent());
boolean exceptionThrown = false;
try
{
instance.setOutlierPercent(1.0);
}
catch ( IllegalArgumentException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
instance.setOutlierPercent(-RANDOM.nextDouble());
}
catch ( IllegalArgumentException e )
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
}
}