1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  package org.apache.commons.math4.legacy.ml.clustering;
19  
20  
21  import java.util.Arrays;
22  import java.util.List;
23  
24  import org.junit.Assert;
25  import org.junit.Test;
26  
27  public class MultiKMeansPlusPlusClustererTest {
28  
29      @Test
30      public void dimension2() {
31          MultiKMeansPlusPlusClusterer<DoublePoint> transformer =
32              new MultiKMeansPlusPlusClusterer<>(
33                      new KMeansPlusPlusClusterer<>(3, 10), 5);
34  
35          DoublePoint[] points = new DoublePoint[] {
36  
37                  
38                  new DoublePoint(new int[] { -15,  3 }),
39                  new DoublePoint(new int[] { -15,  4 }),
40                  new DoublePoint(new int[] { -15,  5 }),
41                  new DoublePoint(new int[] { -14,  3 }),
42                  new DoublePoint(new int[] { -14,  5 }),
43                  new DoublePoint(new int[] { -13,  3 }),
44                  new DoublePoint(new int[] { -13,  4 }),
45                  new DoublePoint(new int[] { -13,  5 }),
46  
47                  
48                  new DoublePoint(new int[] { -1,  0 }),
49                  new DoublePoint(new int[] { -1, -1 }),
50                  new DoublePoint(new int[] {  0, -1 }),
51                  new DoublePoint(new int[] {  1, -1 }),
52                  new DoublePoint(new int[] {  1, -2 }),
53  
54                  
55                  new DoublePoint(new int[] { 13,  3 }),
56                  new DoublePoint(new int[] { 13,  4 }),
57                  new DoublePoint(new int[] { 14,  4 }),
58                  new DoublePoint(new int[] { 14,  7 }),
59                  new DoublePoint(new int[] { 16,  5 }),
60                  new DoublePoint(new int[] { 16,  6 }),
61                  new DoublePoint(new int[] { 17,  4 }),
62                  new DoublePoint(new int[] { 17,  7 })
63          };
64          List<CentroidCluster<DoublePoint>> clusters = transformer.cluster(Arrays.asList(points));
65  
66          Assert.assertEquals(3, clusters.size());
67          boolean cluster1Found = false;
68          boolean cluster2Found = false;
69          boolean cluster3Found = false;
70          double epsilon = 1e-6;
71          for (CentroidCluster<DoublePoint> cluster : clusters) {
72              Clusterable center = cluster.getCenter();
73              double[] point = center.getPoint();
74              if (point[0] < 0) {
75                  cluster1Found = true;
76                  Assert.assertEquals(8, cluster.getPoints().size());
77                  Assert.assertEquals(-14, point[0], epsilon);
78                  Assert.assertEquals( 4, point[1], epsilon);
79              } else if (point[1] < 0) {
80                  cluster2Found = true;
81                  Assert.assertEquals(5, cluster.getPoints().size());
82                  Assert.assertEquals( 0, point[0], epsilon);
83                  Assert.assertEquals(-1, point[1], epsilon);
84              } else {
85                  cluster3Found = true;
86                  Assert.assertEquals(8, cluster.getPoints().size());
87                  Assert.assertEquals(15, point[0], epsilon);
88                  Assert.assertEquals(5, point[1], epsilon);
89              }
90          }
91          Assert.assertTrue(cluster1Found);
92          Assert.assertTrue(cluster2Found);
93          Assert.assertTrue(cluster3Found);
94      }
95  }