/*
* File: OnlinePassiveAggressivePerceptronTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry Learning Core
*
* Copyright January 25, 2011, 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.
*/
package gov.sandia.cognition.learning.algorithm.perceptron;
import gov.sandia.cognition.learning.algorithm.perceptron.kernel.KernelBinaryCategorizerOnlineLearnerAdapter;
import gov.sandia.cognition.learning.function.categorization.DefaultKernelBinaryCategorizer;
import org.junit.Test;
import gov.sandia.cognition.math.matrix.mtj.SparseVectorFactoryMTJ;
import gov.sandia.cognition.math.matrix.mtj.Vector2;
import gov.sandia.cognition.statistics.distribution.MultivariateGaussian;
import gov.sandia.cognition.util.ObjectUtil;
import gov.sandia.cognition.learning.data.DefaultInputOutputPair;
import gov.sandia.cognition.learning.data.InputOutputPair;
import gov.sandia.cognition.math.matrix.VectorFactory;
import gov.sandia.cognition.learning.function.categorization.LinearBinaryCategorizer;
import gov.sandia.cognition.math.matrix.Vector;
import static org.junit.Assert.*;
/**
* Unit tests for class OnlinePassiveAggressivePerceptron.
*
* @author Justin Basilico
* @since 3.1.1
*/
public class OnlinePassiveAggressivePerceptronTest
extends KernelizableBinaryCategorizerOnlineLearnerTestHarness
{
protected boolean aggressiveCheck = true;
/**
* Creates a new test.
*/
public OnlinePassiveAggressivePerceptronTest()
{
}
/**
* Test of constructors of class OnlinePassiveAggressivePerceptron.
*/
@Test
public void testConstructors()
{
VectorFactory<?> factory = VectorFactory.getDefault();
OnlinePassiveAggressivePerceptron instance = new OnlinePassiveAggressivePerceptron();
assertSame(VectorFactory.getDefault(), instance.getVectorFactory());
factory = new SparseVectorFactoryMTJ();
instance = new OnlinePassiveAggressivePerceptron(factory);
assertSame(factory, instance.getVectorFactory());
}
/**
* Test of createInitialLearnedObject method, of class OnlinePassiveAggressivePerceptron.
*/
@Test
public void testCreateInitialLearnedObject()
{
OnlinePassiveAggressivePerceptron instance = this.createLinearInstance();
LinearBinaryCategorizer result = instance.createInitialLearnedObject();
assertNull(result.getWeights());
assertEquals(0.0, result.getBias(), 0.0);
assertNotSame(result, instance.createInitialLearnedObject());
}
/**
* Test of computeUpdate method, of class OnlinePassiveAggressivePerceptron.
*/
@Test
public void testComputeUpdate()
{
OnlinePassiveAggressivePerceptron instance = new OnlinePassiveAggressivePerceptron();
LinearBinaryCategorizer result = new LinearBinaryCategorizer();
assertNull(result.getWeights());
assertEquals(0.0, result.getBias(), 0.0);
Vector input = new Vector2(2.0, 3.0);
Boolean output = true;
instance.update(result, DefaultInputOutputPair.create(input, output));
assertEquals(output, result.evaluate(input));
input = new Vector2(4.0, 4.0);
output = true;
instance.update(result, DefaultInputOutputPair.create(input, output));
assertEquals(output, result.evaluate(input));
input = new Vector2(1.0, 1.0);
output = false;
instance.update(result, DefaultInputOutputPair.create(input, output));
assertEquals(output, result.evaluate(input));
input = new Vector2(1.0, 1.0);
output = false;
instance.update(result, DefaultInputOutputPair.create(input, output));
assertEquals(output, result.evaluate(input));
input = new Vector2(2.0, 3.0);
output = true;
instance.update(result, DefaultInputOutputPair.create(input, output));
assertEquals(output, result.evaluate(input));
result = instance.createInitialLearnedObject();
MultivariateGaussian positive = new MultivariateGaussian(2);
positive.setMean(new Vector2(1.0, 1.0));
positive.getCovariance().setElement(0, 0, 0.2);
positive.getCovariance().setElement(1, 1, 2.0);
MultivariateGaussian negative = new MultivariateGaussian(2);
negative.setMean(new Vector2(-1.0, -1.0));
negative.getCovariance().setElement(0, 0, 0.2);
negative.getCovariance().setElement(1, 1, 2.0);
for (int i = 0; i < 4000; i++)
{
output = random.nextBoolean();
input = (output ? positive : negative).sample(random);
Vector oldWeights = ObjectUtil.cloneSafe(result.getWeights());
double prediction = result.evaluateAsDouble(input);
double loss = 1.0 - prediction * (output ? +1 : -1);
instance.update(result, DefaultInputOutputPair.create(input, output));
assertEquals(output, result.evaluate(input));
if (loss <= 0.0)
{
assertEquals(oldWeights, result.getWeights());
}
}
}
/**
* Test of update method, of class OnlinePassiveAggressivePerceptron.
*/
@Test
public void testUpdate()
{
OnlinePassiveAggressivePerceptron instance = this.createLinearInstance();
LinearBinaryCategorizer result = instance.createInitialLearnedObject();
assertNull(result.getWeights());
assertEquals(0.0, result.getBias(), 0.0);
Vector input = new Vector2(2.0, 3.0);
Boolean output = true;
instance.update(result, input, output);
if (this.aggressiveCheck)
{
assertEquals(output, result.evaluate(input));
}
input = new Vector2(4.0, 4.0);
output = true;
instance.update(result, input, output);
if (this.aggressiveCheck)
{
assertEquals(output, result.evaluate(input));
}
input = new Vector2(1.0, 1.0);
output = false;
instance.update(result, input, output);
if (this.aggressiveCheck)
{
assertEquals(output, result.evaluate(input));
}
input = new Vector2(1.0, 1.0);
output = false;
instance.update(result, input, output);
if (this.aggressiveCheck)
{
assertEquals(output, result.evaluate(input));
}
input = new Vector2(2.0, 3.0);
output = true;
instance.update(result, input, output);
if (this.aggressiveCheck)
{
assertEquals(output, result.evaluate(input));
}
result = instance.createInitialLearnedObject();
MultivariateGaussian positive = new MultivariateGaussian(2);
positive.setMean(new Vector2(1.0, 1.0));
positive.getCovariance().setElement(0, 0, 0.2);
positive.getCovariance().setElement(1, 1, 2.0);
MultivariateGaussian negative = new MultivariateGaussian(2);
negative.setMean(new Vector2(-1.0, -1.0));
negative.getCovariance().setElement(0, 0, 0.2);
negative.getCovariance().setElement(1, 1, 2.0);
for (int i = 0; i < 4000; i++)
{
output = random.nextBoolean();
input = (output ? positive : negative).sample(random);
Vector oldWeights = ObjectUtil.cloneSafe(result.getWeights());
double prediction = result.evaluateAsDouble(input);
double loss = 1.0 - prediction * (output ? +1 : -1);
instance.update(result, DefaultInputOutputPair.create(input, output));
if (loss <= 0.0)
{
assertEquals(oldWeights, result.getWeights());
}
if (this.aggressiveCheck)
{
assertEquals(output, result.evaluate(input));
}
}
}
/**
* Test of getVectorFactory method, of class OnlinePassiveAggressivePerceptron.
*/
@Test
public void testGetVectorFactory()
{
this.testSetVectorFactory();
}
/**
* Test of setVectorFactory method, of class OnlinePassiveAggressivePerceptron.
*/
@Test
public void testSetVectorFactory()
{
VectorFactory<?> factory = VectorFactory.getDefault();
OnlinePassiveAggressivePerceptron instance = this.createLinearInstance();
assertSame(VectorFactory.getDefault(), instance.getVectorFactory());
factory = VectorFactory.getSparseDefault();
instance.setVectorFactory(factory);
assertSame(factory, instance.getVectorFactory());
factory = null;
instance.setVectorFactory(factory);
assertSame(factory, instance.getVectorFactory());
factory = VectorFactory.getDenseDefault();
instance.setVectorFactory(factory);
assertSame(factory, instance.getVectorFactory());
}
@Override
protected OnlinePassiveAggressivePerceptron createLinearInstance()
{
return new OnlinePassiveAggressivePerceptron();
}
@Override
protected void applyUpdate(
KernelBinaryCategorizerOnlineLearnerAdapter<Vector> learner,
DefaultKernelBinaryCategorizer<Vector> target,
InputOutputPair<Vector, Boolean> example)
{
super.applyUpdate(learner, target, example);
if (this.aggressiveCheck)
{
assertEquals(example.getOutput(), target.evaluate(example.getInput()));
}
}
@Override
protected void applyUpdate(
KernelizableBinaryCategorizerOnlineLearner learner,
LinearBinaryCategorizer target,
InputOutputPair<Vector, Boolean> example)
{
super.applyUpdate(learner, target, example);
if (this.aggressiveCheck)
{
assertEquals(example.getOutput(), target.evaluate(example.getInput()));
}
}
}