Example: K-means Cluster Analysis

This example performs K-means cluster analysis on Fisher's iris data. The initial cluster seed for each iris type is an observation known to be in the iris type.


import java.text.*;
import com.imsl.stat.*;
import com.imsl.math.*;

public class ClusterKMeansEx1 {

    public static void main(String argv[]) throws Exception {
        double[][] x = {
            {5.100, 3.500, 1.400, 0.200},
            {4.900, 3.000, 1.400, 0.200},
            {4.700, 3.200, 1.300, 0.200},
            {4.600, 3.100, 1.500, 0.200},
            {5.000, 3.600, 1.400, 0.200},
            {5.400, 3.900, 1.700, 0.400},
            {4.600, 3.400, 1.400, 0.300},
            {5.000, 3.400, 1.500, 0.200},
            {4.400, 2.900, 1.400, 0.200},
            {4.900, 3.100, 1.500, 0.100},
            {5.400, 3.700, 1.500, 0.200},
            {4.800, 3.400, 1.600, 0.200},
            {4.800, 3.000, 1.400, 0.100},
            {4.300, 3.000, 1.100, 0.100},
            {5.800, 4.000, 1.200, 0.200},
            {5.700, 4.400, 1.500, 0.400},
            {5.400, 3.900, 1.300, 0.400},
            {5.100, 3.500, 1.400, 0.300},
            {5.700, 3.800, 1.700, 0.300},
            {5.100, 3.800, 1.500, 0.300},
            {5.400, 3.400, 1.700, 0.200},
            {5.100, 3.700, 1.500, 0.400},
            {4.600, 3.600, 1.000, 0.200},
            {5.100, 3.300, 1.700, 0.500},
            {4.800, 3.400, 1.900, 0.200},
            {5.000, 3.000, 1.600, 0.200},
            {5.000, 3.400, 1.600, 0.400},
            {5.200, 3.500, 1.500, 0.200},
            {5.200, 3.400, 1.400, 0.200},
            {4.700, 3.200, 1.600, 0.200},
            {4.800, 3.100, 1.600, 0.200},
            {5.400, 3.400, 1.500, 0.400},
            {5.200, 4.100, 1.500, 0.100},
            {5.500, 4.200, 1.400, 0.200},
            {4.900, 3.100, 1.500, 0.200},
            {5.000, 3.200, 1.200, 0.200},
            {5.500, 3.500, 1.300, 0.200},
            {4.900, 3.600, 1.400, 0.100},
            {4.400, 3.000, 1.300, 0.200},
            {5.100, 3.400, 1.500, 0.200},
            {5.000, 3.500, 1.300, 0.300},
            {4.500, 2.300, 1.300, 0.300},
            {4.400, 3.200, 1.300, 0.200},
            {5.000, 3.500, 1.600, 0.600},
            {5.100, 3.800, 1.900, 0.400},
            {4.800, 3.000, 1.400, 0.300},
            {5.100, 3.800, 1.600, 0.200},
            {4.600, 3.200, 1.400, 0.200},
            {5.300, 3.700, 1.500, 0.200},
            {5.000, 3.300, 1.400, 0.200},
            {7.000, 3.200, 4.700, 1.400},
            {6.400, 3.200, 4.500, 1.500},
            {6.900, 3.100, 4.900, 1.500},
            {5.500, 2.300, 4.000, 1.300},
            {6.500, 2.800, 4.600, 1.500},
            {5.700, 2.800, 4.500, 1.300},
            {6.300, 3.300, 4.700, 1.600},
            {4.900, 2.400, 3.300, 1.000},
            {6.600, 2.900, 4.600, 1.300},
            {5.200, 2.700, 3.900, 1.400},
            {5.000, 2.000, 3.500, 1.000},
            {5.900, 3.000, 4.200, 1.500},
            {6.000, 2.200, 4.000, 1.000},
            {6.100, 2.900, 4.700, 1.400},
            {5.600, 2.900, 3.600, 1.300},
            {6.700, 3.100, 4.400, 1.400},
            {5.600, 3.000, 4.500, 1.500},
            {5.800, 2.700, 4.100, 1.000},
            {6.200, 2.200, 4.500, 1.500},
            {5.600, 2.500, 3.900, 1.100},
            {5.900, 3.200, 4.800, 1.800},
            {6.100, 2.800, 4.000, 1.300},
            {6.300, 2.500, 4.900, 1.500},
            {6.100, 2.800, 4.700, 1.200},
            {6.400, 2.900, 4.300, 1.300},
            {6.600, 3.000, 4.400, 1.400},
            {6.800, 2.800, 4.800, 1.400},
            {6.700, 3.000, 5.000, 1.700},
            {6.000, 2.900, 4.500, 1.500},
            {5.700, 2.600, 3.500, 1.000},
            {5.500, 2.400, 3.800, 1.100},
            {5.500, 2.400, 3.700, 1.000},
            {5.800, 2.700, 3.900, 1.200},
            {6.000, 2.700, 5.100, 1.600},
            {5.400, 3.000, 4.500, 1.500},
            {6.000, 3.400, 4.500, 1.600},
            {6.700, 3.100, 4.700, 1.500},
            {6.300, 2.300, 4.400, 1.300},
            {5.600, 3.000, 4.100, 1.300},
            {5.500, 2.500, 4.000, 1.300},
            {5.500, 2.600, 4.400, 1.200},
            {6.100, 3.000, 4.600, 1.400},
            {5.800, 2.600, 4.000, 1.200},
            {5.000, 2.300, 3.300, 1.000},
            {5.600, 2.700, 4.200, 1.300},
            {5.700, 3.000, 4.200, 1.200},
            {5.700, 2.900, 4.200, 1.300},
            {6.200, 2.900, 4.300, 1.300},
            {5.100, 2.500, 3.000, 1.100},
            {5.700, 2.800, 4.100, 1.300},
            {6.300, 3.300, 6.000, 2.500},
            {5.800, 2.700, 5.100, 1.900},
            {7.100, 3.000, 5.900, 2.100},
            {6.300, 2.900, 5.600, 1.800},
            {6.500, 3.000, 5.800, 2.200},
            {7.600, 3.000, 6.600, 2.100},
            {4.900, 2.500, 4.500, 1.700},
            {7.300, 2.900, 6.300, 1.800},
            {6.700, 2.500, 5.800, 1.800},
            {7.200, 3.600, 6.100, 2.500},
            {6.500, 3.200, 5.100, 2.000},
            {6.400, 2.700, 5.300, 1.900},
            {6.800, 3.000, 5.500, 2.100},
            {5.700, 2.500, 5.000, 2.000},
            {5.800, 2.800, 5.100, 2.400},
            {6.400, 3.200, 5.300, 2.300},
            {6.500, 3.000, 5.500, 1.800},
            {7.700, 3.800, 6.700, 2.200},
            {7.700, 2.600, 6.900, 2.300},
            {6.000, 2.200, 5.000, 1.500},
            {6.900, 3.200, 5.700, 2.300},
            {5.600, 2.800, 4.900, 2.000},
            {7.700, 2.800, 6.700, 2.000},
            {6.300, 2.700, 4.900, 1.800},
            {6.700, 3.300, 5.700, 2.100},
            {7.200, 3.200, 6.000, 1.800},
            {6.200, 2.800, 4.800, 1.800},
            {6.100, 3.000, 4.900, 1.800},
            {6.400, 2.800, 5.600, 2.100},
            {7.200, 3.000, 5.800, 1.600},
            {7.400, 2.800, 6.100, 1.900},
            {7.900, 3.800, 6.400, 2.000},
            {6.400, 2.800, 5.600, 2.200},
            {6.300, 2.800, 5.100, 1.500},
            {6.100, 2.600, 5.600, 1.400},
            {7.700, 3.000, 6.100, 2.300},
            {6.300, 3.400, 5.600, 2.400},
            {6.400, 3.100, 5.500, 1.800},
            {6.000, 3.000, 4.800, 1.800},
            {6.900, 3.100, 5.400, 2.100},
            {6.700, 3.100, 5.600, 2.400},
            {6.900, 3.100, 5.100, 2.300},
            {5.800, 2.700, 5.100, 1.900},
            {6.800, 3.200, 5.900, 2.300},
            {6.700, 3.300, 5.700, 2.500},
            {6.700, 3.000, 5.200, 2.300},
            {6.300, 2.500, 5.000, 1.900},
            {6.500, 3.000, 5.200, 2.000},
            {6.200, 3.400, 5.400, 2.300},
            {5.900, 3.000, 5.100, 1.800}
        };

        double[][] cs = {
            {5.100, 3.500, 1.400, 0.200},
            {7.000, 3.200, 4.700, 1.400},
            {6.300, 3.300, 6.000, 2.500}
        };

        ClusterKMeans kmean = new ClusterKMeans(x, cs);

        double[][] cm = kmean.compute();
        double[] wss = kmean.getClusterSSQ();
        int[] ic = kmean.getClusterMembership();
        int[] nc = kmean.getClusterCounts();

        PrintMatrix pm = new PrintMatrix("Cluster Means");

        PrintMatrixFormat pmf = new PrintMatrixFormat();
        NumberFormat nf = NumberFormat.getInstance();
        nf.setMinimumFractionDigits(4);
        pmf.setNumberFormat(nf);
        pm.print(pmf, cm);

        new PrintMatrix("Cluster Membership").print(ic);
        new PrintMatrix("Sum of Squares").print(wss);
        new PrintMatrix("Number of observations").print(nc);
    }
}

Output

           Cluster Means
     0       1       2       3     
0  5.0060  3.4280  1.4620  0.2460  
1  5.9016  2.7484  4.3935  1.4339  
2  6.8500  3.0737  5.7421  2.0711  

Cluster Membership
     0  
  0  1  
  1  1  
  2  1  
  3  1  
  4  1  
  5  1  
  6  1  
  7  1  
  8  1  
  9  1  
 10  1  
 11  1  
 12  1  
 13  1  
 14  1  
 15  1  
 16  1  
 17  1  
 18  1  
 19  1  
 20  1  
 21  1  
 22  1  
 23  1  
 24  1  
 25  1  
 26  1  
 27  1  
 28  1  
 29  1  
 30  1  
 31  1  
 32  1  
 33  1  
 34  1  
 35  1  
 36  1  
 37  1  
 38  1  
 39  1  
 40  1  
 41  1  
 42  1  
 43  1  
 44  1  
 45  1  
 46  1  
 47  1  
 48  1  
 49  1  
 50  2  
 51  2  
 52  3  
 53  2  
 54  2  
 55  2  
 56  2  
 57  2  
 58  2  
 59  2  
 60  2  
 61  2  
 62  2  
 63  2  
 64  2  
 65  2  
 66  2  
 67  2  
 68  2  
 69  2  
 70  2  
 71  2  
 72  2  
 73  2  
 74  2  
 75  2  
 76  2  
 77  3  
 78  2  
 79  2  
 80  2  
 81  2  
 82  2  
 83  2  
 84  2  
 85  2  
 86  2  
 87  2  
 88  2  
 89  2  
 90  2  
 91  2  
 92  2  
 93  2  
 94  2  
 95  2  
 96  2  
 97  2  
 98  2  
 99  2  
100  3  
101  2  
102  3  
103  3  
104  3  
105  3  
106  2  
107  3  
108  3  
109  3  
110  3  
111  3  
112  3  
113  2  
114  2  
115  3  
116  3  
117  3  
118  3  
119  2  
120  3  
121  2  
122  3  
123  2  
124  3  
125  3  
126  2  
127  2  
128  3  
129  3  
130  3  
131  3  
132  3  
133  2  
134  3  
135  3  
136  3  
137  3  
138  2  
139  3  
140  3  
141  3  
142  2  
143  3  
144  3  
145  3  
146  2  
147  3  
148  3  
149  2  

Sum of Squares
     0     
0  15.151  
1  39.821  
2  23.879  

Number of observations
   0   
0  50  
1  62  
2  38  

Link to Java source.