/* * File: SuccessiveOverrelaxationTest.java * Authors: Justin Basilico * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright March 13, 2008, 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.svm; import gov.sandia.cognition.evaluator.Evaluator; import gov.sandia.cognition.learning.data.DefaultInputOutputPair; import gov.sandia.cognition.learning.data.InputOutputPair; import gov.sandia.cognition.learning.function.categorization.KernelBinaryCategorizer; import gov.sandia.cognition.learning.function.kernel.LinearKernel; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.mtj.Vector2; import java.util.ArrayList; import junit.framework.TestCase; /** * Tests of SuccessiveOverrelaxation * @author Justin Basilico * @since 2.1 */ public class SuccessiveOverrelaxationTest extends TestCase { /** * Creates a new test. * * @param testName The test name. */ public SuccessiveOverrelaxationTest( String testName) { super(testName); } /** * Tests of clone */ public void testClone() { System.out.println( "Clone" ); final SuccessiveOverrelaxation<Vector> instance = new SuccessiveOverrelaxation<Vector>( LinearKernel.getInstance()); SuccessiveOverrelaxation<Vector> clone = (SuccessiveOverrelaxation<Vector>) instance.clone(); assertNotNull( clone ); assertNotSame( instance, clone ); assertNotNull( clone.getKernel() ); assertSame( instance.getKernel(), clone.getKernel() ); } public void testLearn() { final SuccessiveOverrelaxation<Vector> instance = new SuccessiveOverrelaxation<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); //System.out.println("Iteration: " + instance.getIteration()); //System.out.println("Change: " + instance.getTotalChange()); //for (WeightedValue<? extends Vector> example : result.getExamples()) //{ // System.out.println("" + example.getWeight()); //} assertEquals(result, instance.getResult()); assertTrue(instance.getTotalChange() < instance.getMinChange()); // A 2D example that is linearly separable will have exactly 3 support // vectors. assertEquals(3, ((KernelBinaryCategorizer) result).getExamples().size()); for (Vector2 example : positives) { assertTrue(result.evaluate(example)); } for (Vector2 example : negatives) { assertFalse(result.evaluate(example)); } instance.setMaxIterations(1000); result = instance.learn(examples); 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); } }