/* * File: AbstractBinaryConfusionMatrixTest.java * Authors: Justin Basilico * Company: Sandia National Laboratories * Project: Cognitive Foundry Learning Core * * Copyright February 19, 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.performance.categorization; import java.util.Random; import org.junit.Test; import static org.junit.Assert.*; /** * Unit tests for class AbstractBinaryConfusionMatrix. * * @author Justin Basilico * @since 3.1 */ public class AbstractBinaryConfusionMatrixTest { public static final double EPSILON = 1e-10; protected Random random = new Random(211); /** * Creates a new test. */ public AbstractBinaryConfusionMatrixTest() { } protected AbstractBinaryConfusionMatrix createEmptyInstance() { return new DefaultBinaryConfusionMatrix(); } private AbstractBinaryConfusionMatrix createExampleInstance() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); instance.add(true, true, 4); instance.add(true, false, 3); instance.add(false, true, 2); instance.add(false, false, 1); return instance; } /** * Test of getCategories method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetCategories() { AbstractBinaryConfusionMatrix instance = this.createExampleInstance(); assertEquals(2, instance.getCategories().size()); assertTrue(instance.getCategories().contains(true)); assertTrue(instance.getCategories().contains(false)); } /** * Test of getActualCategories method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetActualCategories() { AbstractBinaryConfusionMatrix instance = this.createExampleInstance(); assertEquals(2, instance.getActualCategories().size()); assertTrue(instance.getActualCategories().contains(true)); assertTrue(instance.getActualCategories().contains(false)); } /** * Test of getPredictedCategories method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetPredictedCategories() { AbstractBinaryConfusionMatrix instance = this.createExampleInstance(); assertEquals(2, instance.getPredictedCategories().size()); assertTrue(instance.getPredictedCategories().contains(true)); assertTrue(instance.getPredictedCategories().contains(false)); assertEquals(2, instance.getPredictedCategories(true).size()); assertTrue(instance.getPredictedCategories(true).contains(true)); assertTrue(instance.getPredictedCategories(true).contains(false)); assertEquals(2, instance.getPredictedCategories(false).size()); assertTrue(instance.getPredictedCategories(false).contains(true)); assertTrue(instance.getPredictedCategories(false).contains(false)); } /** * Test of getCount method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetCount() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertEquals(0.0, instance.getCount(true, true), 0.0); assertEquals(0.0, instance.getCount(true, false), 0.0); assertEquals(0.0, instance.getCount(false, true), 0.0); assertEquals(0.0, instance.getCount(false, false), 0.0); instance = this.createExampleInstance(); assertEquals(instance.getTruePositivesCount(), instance.getCount(true, true), 0.0); assertEquals(instance.getFalseNegativesCount(), instance.getCount(true, false), 0.0); assertEquals(instance.getFalsePositivesCount(), instance.getCount(false, true), 0.0); assertEquals(instance.getTrueNegativesCount(), instance.getCount(false, false), 0.0); } /** * Test of getActualCount method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetActualCount() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertEquals(0.0, instance.getActualCount(true), 0.0); assertEquals(0.0, instance.getActualCount(false), 0.0); instance = this.createExampleInstance(); assertEquals(7.0, instance.getActualCount(true), EPSILON); assertEquals(3.0, instance.getActualCount(false), EPSILON); } /** * Test of getTruePositivesFraction method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetTruePositivesFraction() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertTrue(Double.isNaN(instance.getTruePositivesFraction())); instance = this.createExampleInstance(); assertEquals(4.0 / 10.0, instance.getTruePositivesFraction(), EPSILON); } /** * Test of getFalsePositivesFraction method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetFalsePositivesFraction() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertTrue(Double.isNaN(instance.getFalsePositivesFraction())); instance = this.createExampleInstance(); assertEquals(2.0 / 10.0, instance.getFalsePositivesFraction(), EPSILON); } /** * Test of getTrueNegativesFraction method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetTrueNegativesFraction() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertTrue(Double.isNaN(instance.getTrueNegativesFraction())); instance = this.createExampleInstance(); assertEquals(1.0 / 10.0, instance.getTrueNegativesFraction(), EPSILON); } /** * Test of getFalseNegativesFraction method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetFalseNegativesFraction() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertTrue(Double.isNaN(instance.getFalseNegativesFraction())); instance = this.createExampleInstance(); assertEquals(3.0 / 10.0, instance.getFalseNegativesFraction(), EPSILON); } /** * Test of getSensitivity method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetSensitivity() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertTrue(Double.isNaN(instance.getSensitivity())); instance = this.createExampleInstance(); assertEquals(4.0 / 7.0, instance.getSensitivity(), EPSILON); } /** * Test of getSpecificity method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetSpecificity() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertTrue(Double.isNaN(instance.getSpecificity())); instance = this.createExampleInstance(); assertEquals(1.0 / 3.0, instance.getSpecificity(), EPSILON); } /** * Test of getPrecision method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetPrecision() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertTrue(Double.isNaN(instance.getPrecision())); instance = this.createExampleInstance(); assertEquals(4.0 / 6.0, instance.getPrecision(), EPSILON); } /** * Test of getRecall method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetRecall() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertTrue(Double.isNaN(instance.getRecall())); instance = this.createExampleInstance(); assertEquals(4.0 / 7.0, instance.getRecall(), EPSILON); } /** * Test of getFScore method, of class AbstractBinaryConfusionMatrix. */ @Test public void testGetFScore() { AbstractBinaryConfusionMatrix instance = this.createEmptyInstance(); assertTrue(Double.isNaN(instance.getFScore())); assertTrue(Double.isNaN(instance.getFScore(0.2))); instance = this.createExampleInstance(); double precision = 4.0 / 6.0; double recall = 4.0 / 7.0; assertEquals(2.0 * (precision * recall) / (precision + recall), instance.getFScore(), EPSILON); assertEquals(instance.getFScore(), instance.getFScore(1.0), EPSILON); double beta = 2 * random.nextDouble(); assertEquals((1.0 + beta * beta) * (precision * recall) / (beta * beta * precision + recall), instance.getFScore(beta), EPSILON); double[] badValues = { -1.0, -0.1, -random.nextDouble() * 10.0 }; for (double badValue : badValues) { boolean exceptionThrown = false; try { instance.getFScore(badValue); } catch (IllegalArgumentException e) { exceptionThrown = true; } finally { assertTrue(exceptionThrown); } } } }