This example illustrates a typical usage of
ClusterHierarchical. The Fisher iris data is clustered. First the
distance between irises is computed using the class
Dissimilarities. The resulting distance matrix is then clustered
using ClusterHierarchical, and cluster memberships for 5 clusters
are computed.
import java.io.*;
import com.imsl.stat.*;
import com.imsl.math.*;
public class ClusterHierarchicalEx1 {
public static void main(String argv[]) throws Exception {
double[][] irisData = {
{ 5.1, 3.5, 1.4, .2},
{ 4.9, 3.0, 1.4, .2},
{ 4.7, 3.2, 1.3, .2},
{ 4.6, 3.1, 1.5, .2},
{ 5.0, 3.6, 1.4, .2},
{ 5.4, 3.9, 1.7, .4},
{ 4.6, 3.4, 1.4, .3},
{ 5.0, 3.4, 1.5, .2},
{ 4.4, 2.9, 1.4, .2},
{ 4.9, 3.1, 1.5, .1},
{ 5.4, 3.7, 1.5, .2},
{ 4.8, 3.4, 1.6, .2},
{ 4.8, 3.0, 1.4, .1},
{ 4.3, 3.0, 1.1, .1},
{ 5.8, 4.0, 1.2, .2},
{ 5.7, 4.4, 1.5, .4},
{ 5.4, 3.9, 1.3, .4},
{ 5.1, 3.5, 1.4, .3},
{ 5.7, 3.8, 1.7, .3},
{ 5.1, 3.8, 1.5, .3},
{ 5.4, 3.4, 1.7, .2},
{ 5.1, 3.7, 1.5, .4},
{ 4.6, 3.6, 1.0, .2},
{ 5.1, 3.3, 1.7, .5},
{ 4.8, 3.4, 1.9, .2},
{ 5.0, 3.0, 1.6, .2},
{ 5.0, 3.4, 1.6, .4},
{ 5.2, 3.5, 1.5, .2},
{ 5.2, 3.4, 1.4, .2},
{ 4.7, 3.2, 1.6, .2},
{ 4.8, 3.1, 1.6, .2},
{ 5.4, 3.4, 1.5, .4},
{ 5.2, 4.1, 1.5, .1},
{ 5.5, 4.2, 1.4, .2},
{ 4.9, 3.1, 1.5, .2},
{ 5.0, 3.2, 1.2, .2},
{ 5.5, 3.5, 1.3, .2},
{ 4.9, 3.6, 1.4, .1},
{ 4.4, 3.0, 1.3, .2},
{ 5.1, 3.4, 1.5, .2},
{ 5.0, 3.5, 1.3, .3},
{ 4.5, 2.3, 1.3, .3},
{ 4.4, 3.2, 1.3, .2},
{ 5.0, 3.5, 1.6, .6},
{ 5.1, 3.8, 1.9, .4},
{ 4.8, 3.0, 1.4, .3},
{ 5.1, 3.8, 1.6, .2},
{ 4.6, 3.2, 1.4, .2},
{ 5.3, 3.7, 1.5, .2},
{ 5.0, 3.3, 1.4, .2},
{ 7.0, 3.2, 4.7, 1.4},
{ 6.4, 3.2, 4.5, 1.5},
{ 6.9, 3.1, 4.9, 1.5},
{ 5.5, 2.3, 4.0, 1.3},
{ 6.5, 2.8, 4.6, 1.5},
{ 5.7, 2.8, 4.5, 1.3},
{ 6.3, 3.3, 4.7, 1.6},
{ 4.9, 2.4, 3.3, 1.0},
{ 6.6, 2.9, 4.6, 1.3},
{ 5.2, 2.7, 3.9, 1.4},
{ 5.0, 2.0, 3.5, 1.0},
{ 5.9, 3.0, 4.2, 1.5},
{ 6.0, 2.2, 4.0, 1.0},
{ 6.1, 2.9, 4.7, 1.4},
{ 5.6, 2.9, 3.6, 1.3},
{ 6.7, 3.1, 4.4, 1.4},
{ 5.6, 3.0, 4.5, 1.5},
{ 5.8, 2.7, 4.1, 1.0},
{ 6.2, 2.2, 4.5, 1.5},
{ 5.6, 2.5, 3.9, 1.1},
{ 5.9, 3.2, 4.8, 1.8},
{ 6.1, 2.8, 4.0, 1.3},
{ 6.3, 2.5, 4.9, 1.5},
{ 6.1, 2.8, 4.7, 1.2},
{ 6.4, 2.9, 4.3, 1.3},
{ 6.6, 3.0, 4.4, 1.4},
{ 6.8, 2.8, 4.8, 1.4},
{ 6.7, 3.0, 5.0, 1.7},
{ 6.0, 2.9, 4.5, 1.5},
{ 5.7, 2.6, 3.5, 1.0},
{ 5.5, 2.4, 3.8, 1.1},
{ 5.5, 2.4, 3.7, 1.0},
{ 5.8, 2.7, 3.9, 1.2},
{ 6.0, 2.7, 5.1, 1.6},
{ 5.4, 3.0, 4.5, 1.5},
{ 6.0, 3.4, 4.5, 1.6},
{ 6.7, 3.1, 4.7, 1.5},
{ 6.3, 2.3, 4.4, 1.3},
{ 5.6, 3.0, 4.1, 1.3},
{ 5.5, 2.5, 4.0, 1.3},
{ 5.5, 2.6, 4.4, 1.2},
{ 6.1, 3.0, 4.6, 1.4},
{ 5.8, 2.6, 4.0, 1.2},
{ 5.0, 2.3, 3.3, 1.0},
{ 5.6, 2.7, 4.2, 1.3},
{ 5.7, 3.0, 4.2, 1.2},
{ 5.7, 2.9, 4.2, 1.3},
{ 6.2, 2.9, 4.3, 1.3},
{ 5.1, 2.5, 3.0, 1.1},
{ 5.7, 2.8, 4.1, 1.3},
{ 6.3, 3.3, 6.0, 2.5},
{ 5.8, 2.7, 5.1, 1.9},
{ 7.1, 3.0, 5.9, 2.1},
{ 6.3, 2.9, 5.6, 1.8},
{ 6.5, 3.0, 5.8, 2.2},
{ 7.6, 3.0, 6.6, 2.1},
{ 4.9, 2.5, 4.5, 1.7},
{ 7.3, 2.9, 6.3, 1.8},
{ 6.7, 2.5, 5.8, 1.8},
{ 7.2, 3.6, 6.1, 2.5},
{ 6.5, 3.2, 5.1, 2.0},
{ 6.4, 2.7, 5.3, 1.9},
{ 6.8, 3.0, 5.5, 2.1},
{ 5.7, 2.5, 5.0, 2.0},
{ 5.8, 2.8, 5.1, 2.4},
{ 6.4, 3.2, 5.3, 2.3},
{ 6.5, 3.0, 5.5, 1.8},
{ 7.7, 3.8, 6.7, 2.2},
{ 7.7, 2.6, 6.9, 2.3},
{ 6.0, 2.2, 5.0, 1.5},
{ 6.9, 3.2, 5.7, 2.3},
{ 5.6, 2.8, 4.9, 2.0},
{ 7.7, 2.8, 6.7, 2.0},
{ 6.3, 2.7, 4.9, 1.8},
{ 6.7, 3.3, 5.7, 2.1},
{ 7.2, 3.2, 6.0, 1.8},
{ 6.2, 2.8, 4.8, 1.8},
{ 6.1, 3.0, 4.9, 1.8},
{ 6.4, 2.8, 5.6, 2.1},
{ 7.2, 3.0, 5.8, 1.6},
{ 7.4, 2.8, 6.1, 1.9},
{ 7.9, 3.8, 6.4, 2.0},
{ 6.4, 2.8, 5.6, 2.2},
{ 6.3, 2.8, 5.1, 1.5},
{ 6.1, 2.6, 5.6, 1.4},
{ 7.7, 3.0, 6.1, 2.3},
{ 6.3, 3.4, 5.6, 2.4},
{ 6.4, 3.1, 5.5, 1.8},
{ 6.0, 3.0, 4.8, 1.8},
{ 6.9, 3.1, 5.4, 2.1},
{ 6.7, 3.1, 5.6, 2.4},
{ 6.9, 3.1, 5.1, 2.3},
{ 5.8, 2.7, 5.1, 1.9},
{ 6.8, 3.2, 5.9, 2.3},
{ 6.7, 3.3, 5.7, 2.5},
{ 6.7, 3.0, 5.2, 2.3},
{ 6.3, 2.5, 5.0, 1.9},
{ 6.5, 3.0, 5.2, 2.0},
{ 6.2, 3.4, 5.4, 2.3},
{ 5.9, 3.0, 5.1, 1.8}};
Dissimilarities dist = new Dissimilarities(irisData, 0, 1, 1);
double[][] distanceMatrix = dist.getDistanceMatrix();
ClusterHierarchical clink = new ClusterHierarchical(
dist.getDistanceMatrix(),2,0);
int nClusters = 5;
int[] iclus = clink.getClusterMembership(nClusters);
int[] nclus = clink.getObsPerCluster(nClusters);
System.out.println("Cluster Membership");
for (int i=0;i<15;i++){
for (int j=0;j<10;j++)
System.out.print(iclus[i*10+j]+" ");
System.out.println();
}
System.out.println("Observations Per Cluster");
for (int i=0;i<nClusters;i++)
System.out.print(nclus[i]+" ");
System.out.println();
}
}
Cluster Membership 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 3 3 3 4 3 4 3 4 3 4 4 3 4 3 4 3 4 4 4 4 3 3 3 3 3 3 3 3 3 4 4 4 4 3 4 3 3 4 4 4 4 3 4 4 4 4 4 3 4 4 2 3 2 3 2 1 4 1 3 2 2 3 2 3 3 2 3 2 1 4 2 3 1 3 2 1 3 3 3 1 1 2 3 3 3 1 2 3 3 2 2 2 3 2 2 2 3 3 2 3 Observations Per Cluster 8 19 44 29 50Link to Java source.