/* * File: FeatureHashingTest.java * Authors: Justin Basilico * Project: Cognitive Foundry * * Copyright 2015 Cognitive Foundry. All rights reserved. */ package gov.sandia.cognition.learning.data.feature; import gov.sandia.cognition.hash.Eva32Hash; import gov.sandia.cognition.hash.HashFunction; import gov.sandia.cognition.math.matrix.SparseVectorFactory; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.VectorFactory; import gov.sandia.cognition.math.matrix.mtj.SparseVectorFactoryMTJ; import gov.sandia.cognition.statistics.distribution.PoissonDistribution; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.junit.Test; import static org.junit.Assert.*; /** * Unit tests for class {@link FeatureHashing}. * * @author Justin Basilico * @since 3.4.2 */ public class FeatureHashingTest extends Object { protected Random random = new Random(12333); /** * Creates a new test. */ public FeatureHashingTest() { super(); } /** * Test of constructors, of class FeatureHashing. */ @Test public void testContructors() { int outputDimensionality = FeatureHashing.DEFAULT_OUTPUT_DIMENSIONALITY; VectorFactory<?> vectorFactory = VectorFactory.getSparseDefault(); FeatureHashing instance = new FeatureHashing(); assertEquals(outputDimensionality, instance.getOutputDimensionality()); assertNotNull(instance.getHashFunction()); assertSame(vectorFactory, instance.getVectorFactory()); outputDimensionality = 12; instance = new FeatureHashing(outputDimensionality); assertEquals(outputDimensionality, instance.getOutputDimensionality()); assertNotNull(instance.getHashFunction()); assertSame(vectorFactory, instance.getVectorFactory()); HashFunction hashFunction = new Eva32Hash(); vectorFactory = new SparseVectorFactoryMTJ(); instance = new FeatureHashing(outputDimensionality, hashFunction, vectorFactory); assertEquals(outputDimensionality, instance.getOutputDimensionality()); assertSame(hashFunction, instance.getHashFunction()); assertSame(vectorFactory, instance.getVectorFactory()); boolean exeptionThrown = false; try { instance = new FeatureHashing(-1); } catch (IllegalArgumentException e) { exeptionThrown = true; } finally { assertTrue(exeptionThrown); } } /** * Test of evaluate method, of class FeatureHashing. */ @Test public void testEvaluate() { System.out.println("evaluate"); int n = 200; int d1 = 50; int d2 = 10; FeatureHashing instance = new FeatureHashing(d2); VectorFactory<?> vf = VectorFactory.getSparseDefault(); List<Vector> inputs = new ArrayList<>(n); List<Vector> outputs = new ArrayList<>(n); for (int i = 0; i < n; i++) { int capacity = new PoissonDistribution(10.0).sampleAsInt(random); Vector input = vf.createVectorCapacity(d1, capacity); for (int j = 0; j < capacity; j++) { input.setElement(random.nextInt(d1), random.nextGaussian()); } Vector output = instance.evaluate(input); assertEquals(d2, output.getDimensionality()); assertEquals(output, instance.evaluate(input)); inputs.add(input); outputs.add(output); } double actualSum = 0.0; double hashedSum = 0.0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { actualSum += inputs.get(i).dot(inputs.get(j)); hashedSum += outputs.get(i).dot(outputs.get(j)); } } double epsilon = 1 / Math.sqrt(d2); assertEquals(actualSum / (n * n), hashedSum / (n * n), epsilon); } /** * Test of getOutputDimensionality method, of class FeatureHashing. */ @Test public void testGetOutputDimensionality() { this.testSetOutputDimensionality(); } /** * Test of setOutputDimensionality method, of class FeatureHashing. */ @Test public void testSetOutputDimensionality() { int outputDimensionality = FeatureHashing.DEFAULT_OUTPUT_DIMENSIONALITY; FeatureHashing instance = new FeatureHashing(); assertEquals(outputDimensionality, instance.getOutputDimensionality()); outputDimensionality = 3; instance.setOutputDimensionality(outputDimensionality); assertEquals(outputDimensionality, instance.getOutputDimensionality()); boolean exeptionThrown = false; try { instance.setOutputDimensionality(-1); } catch (IllegalArgumentException e) { exeptionThrown = true; } finally { assertTrue(exeptionThrown); } } /** * Test of getHashFunction method, of class FeatureHashing. */ @Test public void testGetHashFunction() { this.testSetHashFunction(); } /** * Test of setHashFunction method, of class FeatureHashing. */ @Test public void testSetHashFunction() { FeatureHashing instance = new FeatureHashing(); assertNotNull(instance.getHashFunction()); HashFunction hashFunction = new Eva32Hash(); instance.setHashFunction(hashFunction); assertSame(hashFunction, instance.getHashFunction()); } /** * Test of getVectorFactory method, of class FeatureHashing. */ @Test public void testGetVectorFactory() { this.testSetVectorFactory(); } /** * Test of setVectorFactory method, of class FeatureHashing. */ @Test public void testSetVectorFactory() { VectorFactory<?> vectorFactory = VectorFactory.getSparseDefault(); FeatureHashing instance = new FeatureHashing(); assertSame(vectorFactory, instance.getVectorFactory()); vectorFactory = new SparseVectorFactoryMTJ(); instance.setVectorFactory(vectorFactory); assertSame(vectorFactory, instance.getVectorFactory()); } }