/*
* File: AgglomerativeClustererTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright August 10, 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.clustering;
import gov.sandia.cognition.learning.algorithm.clustering.hierarchy.BinaryClusterHierarchyNode;
import gov.sandia.cognition.learning.algorithm.clustering.cluster.CentroidCluster;
import gov.sandia.cognition.learning.algorithm.clustering.hierarchy.ClusterHierarchyNode;
import gov.sandia.cognition.learning.algorithm.clustering.divergence.ClusterMeanLinkDivergenceFunction;
import gov.sandia.cognition.learning.algorithm.clustering.cluster.VectorMeanCentroidClusterCreator;
import gov.sandia.cognition.learning.algorithm.clustering.divergence.ClusterToClusterDivergenceFunction;
import gov.sandia.cognition.learning.function.distance.EuclideanDistanceMetric;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.mtj.Vector2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import junit.framework.TestCase;
/**
* This class implements JUnit tests for the following classes: AgglomerativeClusterer
*
* @author Justin Basilico
* @since 2.0
*/
public class AgglomerativeClustererTest
extends TestCase
{
/** The distance metric used in tests. */
protected EuclideanDistanceMetric metric;
/** The cluster creator used in tests. */
protected VectorMeanCentroidClusterCreator creator;
/** The cluster divergence function used in tests. */
protected ClusterToClusterDivergenceFunction<CentroidCluster<Vector>, Vector> clusterMetric;
public AgglomerativeClustererTest(
String testName)
{
super(testName);
this.metric = EuclideanDistanceMetric.INSTANCE;
this.creator = VectorMeanCentroidClusterCreator.INSTANCE;
this.clusterMetric = new ClusterMeanLinkDivergenceFunction<CentroidCluster<Vector>, Vector>(
this.metric);
}
@SuppressWarnings("deprecation")
public void testConstants()
{
assertEquals(1, AgglomerativeClusterer.DEFAULT_MIN_NUM_CLUSTERS);
assertEquals(Double.MAX_VALUE, AgglomerativeClusterer.DEFAULT_MAX_DISTANCE);
assertEquals(Double.MAX_VALUE, AgglomerativeClusterer.DEFAULT_MAX_MIN_DISTANCE);
}
public void testConstructors()
{
AgglomerativeClusterer<Vector, CentroidCluster<Vector>> instance
= new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>();
assertNull(instance.getDivergenceFunction());
assertNull(instance.getCreator());
assertEquals(AgglomerativeClusterer.DEFAULT_MIN_NUM_CLUSTERS, instance.getMinNumClusters());
assertEquals(AgglomerativeClusterer.DEFAULT_MAX_DISTANCE, instance.getMaxDistance());
instance = new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>(
this.clusterMetric, this.creator);
assertSame(this.clusterMetric, instance.getDivergenceFunction());
assertSame(this.creator, instance.getCreator());
assertEquals(AgglomerativeClusterer.DEFAULT_MIN_NUM_CLUSTERS, instance.getMinNumClusters());
assertEquals(AgglomerativeClusterer.DEFAULT_MAX_DISTANCE, instance.getMaxDistance());
int minNumClusters = 4;
instance = new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>(
this.clusterMetric, this.creator, minNumClusters);
assertSame(this.clusterMetric, instance.getDivergenceFunction());
assertSame(this.creator, instance.getCreator());
assertEquals(minNumClusters, instance.getMinNumClusters());
assertEquals(AgglomerativeClusterer.DEFAULT_MAX_DISTANCE, instance.getMaxDistance());
double maxDistance = 0.47;
instance = new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>(
this.clusterMetric, this.creator, maxDistance);
assertSame(this.clusterMetric, instance.getDivergenceFunction());
assertSame(this.creator, instance.getCreator());
assertEquals(AgglomerativeClusterer.DEFAULT_MIN_NUM_CLUSTERS, instance.getMinNumClusters());
assertEquals(maxDistance, instance.getMaxDistance());
instance = new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>(
this.clusterMetric, this.creator, minNumClusters, maxDistance);
assertSame(this.clusterMetric, instance.getDivergenceFunction());
assertSame(this.creator, instance.getCreator());
assertEquals(minNumClusters, instance.getMinNumClusters());
assertEquals(maxDistance, instance.getMaxDistance());
}
public void testClone()
{
System.out.println( "Clone" );
AgglomerativeClusterer<Vector, CentroidCluster<Vector>> instance =
new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>(
this.clusterMetric, this.creator);
AgglomerativeClusterer<Vector, CentroidCluster<Vector>> clone = instance.clone();
assertNotNull( clone );
assertNotSame( instance, clone );
assertNotNull( clone.getDivergenceFunction() );
assertNotSame( instance.getDivergenceFunction(), clone.getDivergenceFunction() );
assertNotNull( clone.getCreator() );
assertNotSame( instance.getCreator(), clone.getCreator() );
}
/**
* Test of cluster method, of class gov.sandia.cognition.learning.clustering.AgglomerativeClusterer.
*/
public void testCluster()
{
AgglomerativeClusterer<Vector, CentroidCluster<Vector>> instance =
new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>(
this.clusterMetric, this.creator);
Vector[] data1 = new Vector[]
{
new Vector2(-2.341500, 3.696800),
new Vector2(-1.109200, 3.111700),
new Vector2(-1.566900, 1.835100),
new Vector2(-2.658500, 0.664900),
new Vector2(-4.031700, 2.845700),
new Vector2(-3.081000, 2.101100),
new Vector2(-1.144400, 0.505300),
};
Vector[] data2 = new Vector[]
{
new Vector2(-0.123200, -1.516000),
new Vector2(-1.355600, -3.058500),
new Vector2(0.017600, -4.016000),
new Vector2(1.003500, -3.590400),
new Vector2(0.017600, -2.420200),
new Vector2(0.616200, -1.516000),
new Vector2(1.707700, -2.207400)
// new Vector2(-1.531700, -0.930900),
};
Vector[] data3 = new Vector[]
{
new Vector2(2.588000, 1.781900),
new Vector2(3.292300, 3.058500),
new Vector2(4.031700, 1.622300),
new Vector2(1.320400, 2.207400),
new Vector2(1.637300, 1.409600),
new Vector2(2.095100, 3.430900)
// new Vector2(0.264100, 0.398900),
// new Vector2(0.193700, 3.643600),
// new Vector2(1.954200, -0.505300),
// new Vector2(3.081000, -0.611700),
};
ArrayList<Vector> data = new ArrayList<Vector>();
data.addAll(Arrays.asList(data1));
data.addAll(Arrays.asList(data2));
data.addAll(Arrays.asList(data3));
instance.setMinNumClusters(3);
Collection<CentroidCluster<Vector>> clusters = instance.learn(data);
assertEquals(3, instance.getNumClusters());
ClusterHierarchyNode<?,?> root = instance.clusterHierarchically(data);
assertNotNull(root);
assertNotNull(root.getCluster());
assertEquals(2, root.getChildren().size());
assertTrue(root instanceof BinaryClusterHierarchyNode);
ArrayList<CentroidCluster<Vector>> clustersList =
new ArrayList<CentroidCluster<Vector>>(clusters);
assertEquals(data1.length, clustersList.get(0).getMembers().size());
assertEquals(data2.length, clustersList.get(1).getMembers().size());
assertEquals(data3.length, clustersList.get(2).getMembers().size());
for ( Vector example : data1 )
{
assertTrue(clustersList.get(0).getMembers().contains(example));
}
for ( Vector example : data2 )
{
assertTrue(clustersList.get(1).getMembers().contains(example));
}
for ( Vector example : data3 )
{
assertTrue(clustersList.get(2).getMembers().contains(example));
}
}
/**
* Test of getNumClusters method, of class gov.sandia.cognition.learning.clustering.AgglomerativeClusterer.
*/
public void testGetNumClusters()
{
AgglomerativeClusterer<Vector, CentroidCluster<Vector>> instance
= new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>();
assertEquals(0, instance.getNumClusters());
}
/**
* Test of getDivergenceFunction method, of class gov.sandia.cognition.learning.clustering.AgglomerativeClusterer.
*/
public void testGetDivergenceFunction()
{
this.testSetDivergenceFunction();
}
/**
* Test of setDivergenceFunction method, of class gov.sandia.cognition.learning.clustering.AgglomerativeClusterer.
*/
public void testSetDivergenceFunction()
{
AgglomerativeClusterer<Vector, CentroidCluster<Vector>> instance
= new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>();
assertNull(instance.getDivergenceFunction());
instance.setDivergenceFunction(this.clusterMetric);
assertSame(this.clusterMetric, instance.getDivergenceFunction());
instance.setDivergenceFunction(null);
assertNull(instance.getDivergenceFunction());
}
/**
* Test of getCreator method, of class gov.sandia.cognition.learning.clustering.AgglomerativeClusterer.
*/
public void testGetCreator()
{
this.testSetCreator();
}
/**
* Test of setCreator method, of class gov.sandia.cognition.learning.clustering.AgglomerativeClusterer.
*/
public void testSetCreator()
{
AgglomerativeClusterer<Vector, CentroidCluster<Vector>> instance
= new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>();
assertNull(instance.getCreator());
instance.setCreator(this.creator);
assertSame(this.creator, instance.getCreator());
instance.setCreator(null);
assertNull(instance.getCreator());
}
/**
* Test of getMinNumClusters method, of class gov.sandia.cognition.learning.clustering.AgglomerativeClusterer.
*/
public void testGetMinNumClusters()
{
this.testSetMinNumClusters();
}
/**
* Test of setMinNumClusters method, of class gov.sandia.cognition.learning.clustering.AgglomerativeClusterer.
*/
public void testSetMinNumClusters()
{
AgglomerativeClusterer<Vector, CentroidCluster<Vector>> instance
= new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>();
assertEquals(AgglomerativeClusterer.DEFAULT_MIN_NUM_CLUSTERS, instance.getMinNumClusters());
int minNumClusters = 4;
instance.setMinNumClusters(minNumClusters);
assertEquals(minNumClusters, instance.getMinNumClusters());
minNumClusters = 7;
instance.setMinNumClusters(minNumClusters);
assertEquals(minNumClusters, instance.getMinNumClusters());
minNumClusters = -3;
instance.setMinNumClusters(minNumClusters);
assertEquals(1, instance.getMinNumClusters());
}
/**
* Test of getMaxDistance method, of class AgglomerativeClusterer.
*/
public void testGetMaxDistance()
{
this.testSetMaxDistance();
}
/**
* Test of setMaxDistance method, of class AgglomerativeClusterer.
*/
public void testSetMaxDistance()
{
AgglomerativeClusterer<Vector, CentroidCluster<Vector>> instance
= new AgglomerativeClusterer<Vector, CentroidCluster<Vector>>();
assertEquals(AgglomerativeClusterer.DEFAULT_MAX_DISTANCE, instance.getMaxDistance());
double maxDistance = Math.random();
instance.setMaxDistance(maxDistance);
assertEquals(maxDistance, instance.getMaxDistance());
maxDistance = -Math.random();
instance.setMaxDistance(maxDistance);
assertEquals(maxDistance, instance.getMaxDistance());
}
}