/*
* File: GaussianProcessRegressionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Mar 18, 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.bayesian;
import gov.sandia.cognition.evaluator.Evaluator;
import gov.sandia.cognition.learning.algorithm.regression.LinearRegression;
import gov.sandia.cognition.learning.data.InputOutputPair;
import gov.sandia.cognition.learning.function.kernel.RadialBasisKernel;
import gov.sandia.cognition.learning.function.scalar.LinearDiscriminantWithBias;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.Vectorizable;
import gov.sandia.cognition.statistics.ClosedFormDistribution;
import java.util.ArrayList;
import java.util.Random;
import junit.framework.TestCase;
/**
* Unit tests for GaussianProcessRegressionTest.
*
* @author krdixon
*/
public class GaussianProcessRegressionTest
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;
// /**
// * RadialBasisKernel
// */
// public static class RadialBasisKernel
// extends AbstractCloneableSerializable
// implements Kernel<Double>
// {
//
// /**
// * Sigma
// */
// double sigma;
//
// /**
// * Default constructor
// */
// public RadialBasisKernel()
// {
// this( 1.0 );
// }
//
// /**
// * Constructor
// * @param sigma
// * sigma
// */
// public RadialBasisKernel(
// double sigma)
// {
// this.sigma = sigma;
// }
//
// @Override
// public double evaluate(
// Double x,
// Double y)
// {
// final double delta = (x + y);
// final double distance = delta*delta;
// return Math.exp( -distance / (-this.sigma*this.sigma) );
// }
//
// }
/**
* Tests for class GaussianProcessRegressionTest.
* @param testName Name of the test.
*/
public GaussianProcessRegressionTest(
String testName)
{
super(testName);
}
/**
* Creates instance
* @return
* instance
*/
public GaussianProcessRegression<Vectorizable> createInstance()
{
GaussianProcessRegression<Vectorizable> instance =
new GaussianProcessRegression<Vectorizable>();
instance.setOutputVariance(0.1);
instance.setKernel( new RadialBasisKernel() );
return instance;
}
/**
* Tests the constructors of class GaussianProcessRegressionTest.
*/
public void testConstructors()
{
System.out.println( "Constructors" );
GaussianProcessRegression<Double> instance =
new GaussianProcessRegression<Double>();
assertNull( instance.getKernel() );
assertEquals( GaussianProcessRegression.DEFAULT_MEASUREMENT_VARIANCE, instance.getOutputVariance() );
}
/**
* Test of clone method, of class GaussianProcessRegression.
*/
public void testClone()
{
System.out.println("clone");
GaussianProcessRegression<Vectorizable> instance = this.createInstance();
GaussianProcessRegression<Vectorizable> clone = instance.clone();
assertNotSame( instance, clone );
assertNotSame( instance.getKernel(), clone.getKernel() );
assertNotNull( clone.getKernel() );
assertEquals( instance.getOutputVariance(), clone.getOutputVariance() );
}
/**
* Test of getOutputVariance method, of class GaussianProcessRegression.
*/
public void testGetOutputVariance()
{
System.out.println("getOutputVariance");
GaussianProcessRegression<Vectorizable> instance = this.createInstance();
assertTrue( instance.getOutputVariance() >= 0.0 );
}
/**
* Test of setOutputVariance method, of class GaussianProcessRegression.
*/
public void testSetOutputVariance()
{
System.out.println("setOutputVariance");
GaussianProcessRegression<Vectorizable> instance = this.createInstance();
double outputVariance = RANDOM.nextDouble();
instance.setOutputVariance(outputVariance);
assertEquals( outputVariance, instance.getOutputVariance() );
instance.setOutputVariance(0.0);
assertEquals( 0.0, instance.getOutputVariance() );
try
{
instance.setOutputVariance(-1.0);
fail( "outputVariance must be >= 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
/**
* Test of createPredictiveDistribution method, of class BayesianRegression.
*/
public void testCreatePredictiveDistribution10()
{
System.out.println("createPredictiveDistribution(10)");
BayesianRegressionTestHarness.NUM_SAMPLES = 10;
ArrayList<Double> inputs = BayesianRegressionTestHarness.createInputs(RANDOM);
BayesianRegressionTestHarness.Model target = new BayesianRegressionTestHarness.Model(0.25);
ArrayList<InputOutputPair<Vector,Double>> data =
BayesianRegressionTestHarness.createData(inputs, target, RANDOM);
GaussianProcessRegression<Vectorizable> instance = this.createInstance();
ArrayList<Vectorizable> vs = new ArrayList<Vectorizable>( data.size() );
for( InputOutputPair<Vector,Double> v : data )
{
vs.add( v.getInput() );
}
Evaluator<? super Vectorizable, ? extends ClosedFormDistribution<Double>> predictive =
instance.createPredictiveDistribution( instance.learn(data), vs );
LinearRegression regression = new LinearRegression();
LinearDiscriminantWithBias mle = regression.learn(data);
BayesianRegressionTestHarness.compareMethods(predictive, mle, target);
}
/**
* Test of createPredictiveDistribution method, of class BayesianRegression.
*/
public void testCreatePredictiveDistribution30()
{
System.out.println("createPredictiveDistribution(30)");
BayesianRegressionTestHarness.NUM_SAMPLES = 30;
ArrayList<Double> inputs = BayesianRegressionTestHarness.createInputs(RANDOM);
BayesianRegressionTestHarness.Model target = new BayesianRegressionTestHarness.Model(0.25);
ArrayList<InputOutputPair<Vector,Double>> data =
BayesianRegressionTestHarness.createData(inputs, target, RANDOM);
GaussianProcessRegression<Vectorizable> instance = this.createInstance();
ArrayList<Vectorizable> vs = new ArrayList<Vectorizable>( data.size() );
for( InputOutputPair<Vector,Double> v : data )
{
vs.add( v.getInput() );
}
Evaluator<? super Vectorizable, ? extends ClosedFormDistribution<Double>> predictive =
instance.createPredictiveDistribution( instance.learn(data), vs );
LinearRegression regression = new LinearRegression();
LinearDiscriminantWithBias mle = regression.learn(data);
BayesianRegressionTestHarness.compareMethods(predictive, mle, target);
}
/**
* Test of createPredictiveDistribution method, of class BayesianRegression.
*/
public void testCreatePredictiveDistribution5()
{
System.out.println("createPredictiveDistribution(5)");
BayesianRegressionTestHarness.NUM_SAMPLES = 5;
ArrayList<Double> inputs = BayesianRegressionTestHarness.createInputs(RANDOM);
BayesianRegressionTestHarness.Model target = new BayesianRegressionTestHarness.Model(0.25);
ArrayList<InputOutputPair<Vector,Double>> data =
BayesianRegressionTestHarness.createData(inputs, target, RANDOM);
GaussianProcessRegression<Vectorizable> instance = this.createInstance();
ArrayList<Vectorizable> vs = new ArrayList<Vectorizable>( data.size() );
for( InputOutputPair<Vector,Double> v : data )
{
vs.add( v.getInput() );
}
Evaluator<? super Vectorizable, ? extends ClosedFormDistribution<Double>> predictive =
instance.createPredictiveDistribution( instance.learn(data), vs );
LinearRegression regression = new LinearRegression();
LinearDiscriminantWithBias mle = regression.learn(data);
BayesianRegressionTestHarness.compareMethods(predictive, mle, target);
}
/**
* Test of createPredictiveDistribution method, of class BayesianRegression.
*/
public void testCreatePredictiveDistribution20()
{
System.out.println("createPredictiveDistribution(20)");
BayesianRegressionTestHarness.NUM_SAMPLES = 20;
ArrayList<Double> inputs = BayesianRegressionTestHarness.createInputs(RANDOM);
BayesianRegressionTestHarness.Model target = new BayesianRegressionTestHarness.Model(1.0);
ArrayList<InputOutputPair<Vector,Double>> data =
BayesianRegressionTestHarness.createData(inputs, target, RANDOM);
GaussianProcessRegression<Vectorizable> instance = this.createInstance();
ArrayList<Vectorizable> vs = new ArrayList<Vectorizable>( data.size() );
for( InputOutputPair<Vector,Double> v : data )
{
vs.add( v.getInput() );
}
Evaluator<? super Vectorizable, ? extends ClosedFormDistribution<Double>> predictive =
instance.createPredictiveDistribution( instance.learn(data), vs );
LinearRegression regression = new LinearRegression();
LinearDiscriminantWithBias mle = regression.learn(data);
BayesianRegressionTestHarness.compareMethods(predictive, mle, target);
}
}