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);
}
}
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.