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.