/*
* File: MultivariateStudentTDistributionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Mar 29, 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.distribution;
import gov.sandia.cognition.math.MultivariateStatisticsUtil;
import gov.sandia.cognition.math.matrix.Matrix;
import gov.sandia.cognition.math.matrix.MatrixFactory;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.VectorFactory;
import gov.sandia.cognition.statistics.MultivariateClosedFormComputableDistributionTestHarness;
import gov.sandia.cognition.statistics.method.KolmogorovSmirnovConfidence;
import gov.sandia.cognition.util.Pair;
import java.util.ArrayList;
/**
* Unit tests for MultivariateStudentTDistributionTest.
*
* @author krdixon
*/
public class MultivariateStudentTDistributionTest
extends MultivariateClosedFormComputableDistributionTestHarness<Vector>
{
/**
* Tests for class MultivariateStudentTDistributionTest.
* @param testName Name of the test.
*/
public MultivariateStudentTDistributionTest(
String testName)
{
super(testName);
}
/**
* Tests the constructors of class MultivariateStudentTDistributionTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
MultivariateStudentTDistribution instance =
new MultivariateStudentTDistribution();
assertEquals( MultivariateStudentTDistribution.DEFAULT_DIMENSIONALITY, instance.getInputDimensionality() );
assertNotNull( instance.getMean() );
assertNotNull( instance.getPrecision() );
assertEquals( MultivariateStudentTDistribution.DEFAULT_DEGREES_OF_FREEDOM, instance.getDegreesOfFreedom() );
final int dim = 3;
instance = new MultivariateStudentTDistribution( dim );
assertEquals( dim, instance.getInputDimensionality() );
assertEquals( dim, instance.getMean().getDimensionality() );
assertEquals( dim, instance.getPrecision().getNumRows() );
assertEquals( MultivariateStudentTDistribution.DEFAULT_DEGREES_OF_FREEDOM,
instance.getDegreesOfFreedom() );
MultivariateStudentTDistribution i2 =
new MultivariateStudentTDistribution( instance );
assertNotSame( instance.getMean(), i2.getMean() );
assertEquals( instance.getMean(), i2.getMean() );
assertNotSame( instance.getPrecision(), i2.getPrecision() );
assertEquals( instance.getPrecision(), i2.getPrecision() );
assertEquals( instance.getDegreesOfFreedom(), i2.getDegreesOfFreedom() );
MultivariateStudentTDistribution i3 =
new MultivariateStudentTDistribution(
i2.getDegreesOfFreedom(), i2.getMean(), i2.getPrecision() );
assertEquals( i2.getDegreesOfFreedom(), i3.getDegreesOfFreedom() );
assertSame( i2.getMean(), i3.getMean() );
assertSame( i3.getPrecision(), i3.getPrecision() );
}
@Override
public void testProbabilityFunctionConstructors()
{
System.out.println( "PDF Constructors" );
MultivariateStudentTDistribution.PDF instance =
new MultivariateStudentTDistribution.PDF();
assertEquals( MultivariateStudentTDistribution.DEFAULT_DIMENSIONALITY, instance.getInputDimensionality() );
assertNotNull( instance.getMean() );
assertNotNull( instance.getPrecision() );
assertEquals( MultivariateStudentTDistribution.DEFAULT_DEGREES_OF_FREEDOM, instance.getDegreesOfFreedom() );
final int dim = 3;
instance = new MultivariateStudentTDistribution.PDF( dim );
assertEquals( dim, instance.getInputDimensionality() );
assertEquals( dim, instance.getMean().getDimensionality() );
assertEquals( dim, instance.getPrecision().getNumRows() );
assertEquals( MultivariateStudentTDistribution.DEFAULT_DEGREES_OF_FREEDOM,
instance.getDegreesOfFreedom() );
MultivariateStudentTDistribution.PDF i2 =
new MultivariateStudentTDistribution.PDF( instance );
assertNotSame( instance.getMean(), i2.getMean() );
assertEquals( instance.getMean(), i2.getMean() );
assertNotSame( instance.getPrecision(), i2.getPrecision() );
assertEquals( instance.getPrecision(), i2.getPrecision() );
assertEquals( instance.getDegreesOfFreedom(), i2.getDegreesOfFreedom() );
MultivariateStudentTDistribution.PDF i3 =
new MultivariateStudentTDistribution.PDF(
i2.getDegreesOfFreedom(), i2.getMean(), i2.getPrecision() );
assertEquals( i2.getDegreesOfFreedom(), i3.getDegreesOfFreedom() );
assertSame( i2.getMean(), i3.getMean() );
assertSame( i3.getPrecision(), i3.getPrecision() );
}
/**
* Test of getDegreesOfFreedom method, of class MultivariateStudentTDistribution.
*/
public void testGetDegreesOfFreedom()
{
System.out.println("getDegreesOfFreedom");
MultivariateStudentTDistribution instance = this.createInstance();
assertTrue( instance.getDegreesOfFreedom() > 0.0 );
}
/**
* Test of setDegreesOfFreedom method, of class MultivariateStudentTDistribution.
*/
public void testSetDegreesOfFreedom()
{
System.out.println("setDegreesOfFreedom");
MultivariateStudentTDistribution instance = this.createInstance();
double degreesOfFreedom = RANDOM.nextDouble() * 10.0;
instance.setDegreesOfFreedom(degreesOfFreedom);
assertEquals( degreesOfFreedom, instance.getDegreesOfFreedom() );
try
{
instance.setDegreesOfFreedom(0.0);
fail( "DOFs must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of setMean method, of class MultivariateStudentTDistribution.
*/
public void testSetMean()
{
System.out.println("setMean");
MultivariateStudentTDistribution instance = this.createInstance();
Vector mean = instance.getMean().scale( RANDOM.nextGaussian() );
instance.setMean(mean);
assertSame( mean, instance.getMean() );
}
/**
* Test of getPrecision method, of class MultivariateStudentTDistribution.
*/
public void testGetPrecision()
{
System.out.println("getPrecision");
MultivariateStudentTDistribution instance = this.createInstance();
assertEquals( instance.getMean().getDimensionality(),
instance.getPrecision().getNumRows() );
}
/**
* Test of setPrecision method, of class MultivariateStudentTDistribution.
*/
public void testSetPrecision()
{
System.out.println("setPrecision");
MultivariateStudentTDistribution instance =
this.createInstance();
Matrix p = instance.getPrecision().clone();
instance.setPrecision(p);
assertSame( p, instance.getPrecision() );
p.setElement(0, 1, p.getElement(0,1)+1.0);
try
{
instance.setPrecision(p);
fail( "Precision must be symmetric" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of getCovariance method, of class MultivariateStudentTDistribution.
*/
public void testGetCovariance()
{
System.out.println("getCovariance");
MultivariateStudentTDistribution instance = this.createInstance();
ArrayList<? extends Vector> samples = instance.sample(RANDOM, NUM_SAMPLES);
Pair<Vector,Matrix> pair =
MultivariateStatisticsUtil.computeMeanAndCovariance(samples);
System.out.println( "Empirical:\n" + pair.getSecond() );
System.out.println( "Result:\n" + instance.getCovariance() );
assertTrue( instance.getCovariance().equals( pair.getSecond(), 3e-1 ) );
}
/**
* Test of getInputDimensionality method, of class MultivariateStudentTDistribution.
*/
public void testGetInputDimensionality()
{
System.out.println("getInputDimensionality");
MultivariateStudentTDistribution instance = this.createInstance();
assertEquals( instance.getMean().getDimensionality(), instance.getInputDimensionality() );
}
@Override
public MultivariateStudentTDistribution createInstance()
{
Vector mean = VectorFactory.getDefault().copyValues(
RANDOM.nextGaussian(), RANDOM.nextGaussian() );
Matrix R = MatrixFactory.getDefault().createUniformRandom(
2,2, -1.0, 1.0, RANDOM);
Matrix C = R.times( R.transpose() );
return new MultivariateStudentTDistribution(12.0, mean, C);
}
@Override
public void testProbabilityFunctionKnownValues()
{
System.out.println( "PDF Known Values" );
StudentTDistribution.PDF scalar =
new StudentTDistribution.PDF( 3.0, 2.0, 0.1 );
MultivariateStudentTDistribution.PDF instance =
new MultivariateStudentTDistribution.PDF(
scalar.getDegreesOfFreedom(),
VectorFactory.getDefault().copyValues(scalar.getMean()),
MatrixFactory.getDefault().createIdentity(1,1).scale(scalar.getPrecision()) );
ArrayList<Double> xs = scalar.sample(RANDOM, NUM_SAMPLES);
for( Double x : xs )
{
Vector X = VectorFactory.getDefault().copyValues(x);
assertEquals( scalar.evaluate(x), instance.evaluate(X), TOLERANCE );
}
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "Known convertToVector" );
MultivariateStudentTDistribution instance = this.createInstance();
Vector parameters = instance.convertToVector();
int dim = instance.getInputDimensionality();
assertEquals( 1+dim+dim*dim, parameters.getDimensionality() );
assertEquals( instance.getDegreesOfFreedom(), parameters.getElement(0) );
assertEquals( instance.getMean(), parameters.subVector(1, dim) );
assertEquals( instance.getPrecision().convertToVector(),
parameters.subVector(dim+1, parameters.getDimensionality()-1) );
}
@Override
public void testKnownValues()
{
System.out.println( "Known Values" );
StudentTDistribution.CDF cdf =
new StudentTDistribution.CDF( 6.0, 2.0, 0.1 );
MultivariateStudentTDistribution instance =
new MultivariateStudentTDistribution(
cdf.getDegreesOfFreedom(),
VectorFactory.getDefault().copyValues(cdf.getMean()),
MatrixFactory.getDefault().createIdentity(1,1).scale(cdf.getPrecision()) );
ArrayList<Vector> samples = instance.sample(RANDOM,NUM_SAMPLES);
ArrayList<Double> scalars = new ArrayList<Double>(NUM_SAMPLES);
for( Vector X : samples )
{
scalars.add( X.getElement(0) );
}
KolmogorovSmirnovConfidence.Statistic kstest =
KolmogorovSmirnovConfidence.evaluateNullHypothesis(scalars, cdf);
System.out.println( "K-S Test: " + kstest );
assertEquals( 1.0, kstest.getNullHypothesisProbability(), 0.95 );
}
@Override
public void testGetMean()
{
double temp = TOLERANCE;
TOLERANCE = 1.1e-1;
super.testGetMean();
TOLERANCE = temp;
}
}