/*
* File: KernelPerceptronTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright August 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.learning.algorithm.perceptron.kernel;
import gov.sandia.cognition.learning.algorithm.perceptron.kernel.KernelPerceptron;
import gov.sandia.cognition.evaluator.Evaluator;
import gov.sandia.cognition.learning.algorithm.perceptron.Perceptron;
import gov.sandia.cognition.learning.data.DefaultInputOutputPair;
import gov.sandia.cognition.learning.function.kernel.LinearKernel;
import gov.sandia.cognition.learning.function.kernel.PolynomialKernel;
import gov.sandia.cognition.learning.function.kernel.Kernel;
import gov.sandia.cognition.learning.data.InputOutputPair;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.mtj.Vector2;
import java.util.ArrayList;
import junit.framework.TestCase;
/**
* This class implements JUnit tests for the following classes:
*
* KernelPerceptron
*
* @author Justin Basilico
* @since 2.0
*/
public class KernelPerceptronTest
extends TestCase
{
public KernelPerceptronTest(
String testName)
{
super(testName);
}
public void testConstants()
{
assertEquals(Perceptron.DEFAULT_MAX_ITERATIONS, KernelPerceptron.DEFAULT_MAX_ITERATIONS);
assertEquals(Perceptron.DEFAULT_MARGIN_POSITIVE, KernelPerceptron.DEFAULT_MARGIN_POSITIVE);
assertEquals(Perceptron.DEFAULT_MARGIN_NEGATIVE, KernelPerceptron.DEFAULT_MARGIN_NEGATIVE);
}
public void testConstructors()
{
KernelPerceptron<Vector> instance = new KernelPerceptron<Vector>();
assertNull(instance.getKernel());
assertEquals(Perceptron.DEFAULT_MAX_ITERATIONS, instance.getMaxIterations());
assertEquals(Perceptron.DEFAULT_MARGIN_POSITIVE, instance.getMarginPositive());
assertEquals(Perceptron.DEFAULT_MARGIN_NEGATIVE, instance.getMarginNegative());
PolynomialKernel kernel = new PolynomialKernel(4, 7.0);
instance = new KernelPerceptron<Vector>(kernel);
assertSame(kernel, instance.getKernel());
assertEquals(Perceptron.DEFAULT_MAX_ITERATIONS, instance.getMaxIterations());
assertEquals(Perceptron.DEFAULT_MARGIN_POSITIVE, instance.getMarginPositive());
assertEquals(Perceptron.DEFAULT_MARGIN_NEGATIVE, instance.getMarginNegative());
int maxIterations = Perceptron.DEFAULT_MAX_ITERATIONS + 10;
instance = new KernelPerceptron<Vector>(kernel, maxIterations);
assertSame(kernel, instance.getKernel());
assertEquals(maxIterations, instance.getMaxIterations());
assertEquals(Perceptron.DEFAULT_MARGIN_POSITIVE, instance.getMarginPositive());
assertEquals(Perceptron.DEFAULT_MARGIN_NEGATIVE, instance.getMarginNegative());
double marginPositive = Math.random();
double marginNegative = Math.random();
instance = new KernelPerceptron<Vector>(kernel, maxIterations, marginPositive, marginNegative);
assertSame(kernel, instance.getKernel());
assertEquals(maxIterations, instance.getMaxIterations());
assertEquals(marginPositive, instance.getMarginPositive());
assertEquals(marginNegative, instance.getMarginNegative());
}
public void testLearn()
{
KernelPerceptron<Vector> instance = new KernelPerceptron<Vector>(
LinearKernel.getInstance());
Vector2[] positives = new Vector2[] {
new Vector2(1.00, 1.00),
new Vector2(1.00, 3.00),
new Vector2(0.25, 4.00),
new Vector2(2.00, 1.00),
new Vector2(5.00, -3.00)
};
Vector2[] negatives = new Vector2[] {
new Vector2(2.00, 3.00),
new Vector2(2.00, 4.00),
new Vector2(3.00, 2.00),
new Vector2(4.25, 3.75),
new Vector2(4.00, 7.00),
new Vector2(7.00, 4.00)
};
ArrayList<InputOutputPair<Vector2, Boolean>> examples =
new ArrayList<InputOutputPair<Vector2, Boolean>>();
for (Vector2 example : positives)
{
examples.add(new DefaultInputOutputPair<Vector2, Boolean>(example, true));
}
for (Vector2 example : negatives)
{
examples.add(new DefaultInputOutputPair<Vector2, Boolean>(example, false));
}
Evaluator<? super Vector,Boolean> result = instance.learn(examples);
assertEquals(0, instance.getErrorCount());
assertEquals(result, instance.getResult());
for (Vector2 example : positives)
{
assertTrue(result.evaluate(example));
}
for (Vector2 example : negatives)
{
assertFalse(result.evaluate(example));
}
instance.setMargin(10.0);
instance.setMaxIterations(1000);
result = instance.learn(examples);
assertEquals(0, instance.getErrorCount());
assertEquals(result, instance.getResult());
for (Vector2 example : positives)
{
assertTrue(result.evaluate(example));
}
for (Vector2 example : negatives)
{
assertFalse(result.evaluate(example));
}
instance.setMaxIterations(instance.getIteration() / 2);
result = instance.learn(examples);
assertTrue(instance.getErrorCount() > 0);
examples = new ArrayList<InputOutputPair<Vector2, Boolean>>();
result = instance.learn(examples);
assertNull(result);
result = instance.learn(null);
assertNull(result);
}
/**
* Test of getKernel method, of class gov.sandia.cognition.learning.perceptron.KernelPerceptron.
*/
public void testGetKernel()
{
this.testSetKernel();
}
/**
* Test of setKernel method, of class gov.sandia.cognition.learning.perceptron.KernelPerceptron.
*/
public void testSetKernel()
{
KernelPerceptron<Vector> instance = new KernelPerceptron<Vector>();
assertNull(instance.getKernel());
Kernel<? super Vector> kernel = LinearKernel.getInstance();
instance.setKernel(kernel);
assertSame(kernel, instance.getKernel());
kernel = new PolynomialKernel(4, 7.0);
instance.setKernel(kernel);
assertSame(kernel, instance.getKernel());
instance.setKernel(null);
assertNull(instance.getKernel());
}
/**
* Test of setMargin method, of class gov.sandia.cognition.learning.perceptron.KernelPerceptron.
*/
public void testSetMargin()
{
KernelPerceptron<Vector> instance = new KernelPerceptron<Vector>();
double margin = Math.random();
instance.setMargin(margin);
assertEquals(margin, instance.getMarginPositive());
assertEquals(margin, instance.getMarginNegative());
}
/**
* Test of getMarginPositive method, of class gov.sandia.cognition.learning.perceptron.KernelPerceptron.
*/
public void testGetMarginPositive()
{
this.testSetMarginPositive();
}
/**
* Test of setMarginPositive method, of class gov.sandia.cognition.learning.perceptron.KernelPerceptron.
*/
public void testSetMarginPositive()
{
KernelPerceptron<Vector> instance = new KernelPerceptron<Vector>();
assertEquals(KernelPerceptron.DEFAULT_MARGIN_POSITIVE, instance.getMarginPositive());
double margin = Math.random();
instance.setMarginPositive(margin);
assertEquals(margin, instance.getMarginPositive());
margin = 0.0;
instance.setMarginPositive(margin);
assertEquals(margin, instance.getMarginPositive());
margin = -1.0;
instance.setMarginPositive(margin);
assertEquals(margin, instance.getMarginPositive());
}
/**
* Test of getMarginNegative method, of class gov.sandia.cognition.learning.perceptron.KernelPerceptron.
*/
public void testGetMarginNegative()
{
this.testSetMarginNegative();
}
/**
* Test of setMarginNegative method, of class gov.sandia.cognition.learning.perceptron.KernelPerceptron.
*/
public void testSetMarginNegative()
{
KernelPerceptron<Vector> instance = new KernelPerceptron<Vector>();
assertEquals(KernelPerceptron.DEFAULT_MARGIN_NEGATIVE, instance.getMarginNegative());
double margin = Math.random();
instance.setMarginNegative(margin);
assertEquals(margin, instance.getMarginNegative());
margin = 0.0;
instance.setMarginNegative(margin);
assertEquals(margin, instance.getMarginNegative());
margin = -1.0;
instance.setMarginNegative(margin);
assertEquals(margin, instance.getMarginNegative());
}
/**
* Test of getResult method, of class gov.sandia.cognition.learning.perceptron.KernelPerceptron.
*/
public void testGetResult()
{
// Tested by learn.
}
/**
* Test of getErrorCount method, of class gov.sandia.cognition.learning.perceptron.KernelPerceptron.
*/
public void testGetErrorCount()
{
// Tested by learn.
}
}