1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  package org.apache.commons.math4.legacy.ml.clustering;
18  
19  import java.util.ArrayList;
20  import java.util.Arrays;
21  import java.util.List;
22  
23  import org.apache.commons.math4.legacy.exception.MathIllegalArgumentException;
24  import org.apache.commons.math4.legacy.exception.NullArgumentException;
25  import org.apache.commons.math4.legacy.ml.distance.CanberraDistance;
26  import org.apache.commons.math4.legacy.ml.distance.DistanceMeasure;
27  import org.apache.commons.rng.simple.RandomSource;
28  import org.apache.commons.rng.UniformRandomProvider;
29  import org.junit.Assert;
30  import org.junit.Test;
31  
32  
33  
34  
35  
36  
37  public class FuzzyKMeansClustererTest {
38  
39      @Test
40      public void testCluster() {
41          final List<DoublePoint> points = new ArrayList<>();
42  
43          
44          for (int i = 1; i <= 10; i++) {
45              final DoublePoint p = new DoublePoint(new double[] { i } );
46              points.add(p);
47          }
48  
49          final FuzzyKMeansClusterer<DoublePoint> transformer =
50                  new FuzzyKMeansClusterer<>(3, 2.0);
51          final List<CentroidCluster<DoublePoint>> clusters = transformer.cluster(points);
52  
53          
54          
55          
56          
57          final List<DoublePoint> clusterOne = Arrays.asList(points.get(0), points.get(1), points.get(2));
58          final List<DoublePoint> clusterTwo = Arrays.asList(points.get(3), points.get(4), points.get(5), points.get(6));
59          final List<DoublePoint> clusterThree = Arrays.asList(points.get(7), points.get(8), points.get(9));
60  
61          boolean cluster1Found = false;
62          boolean cluster2Found = false;
63          boolean cluster3Found = false;
64          Assert.assertEquals(3, clusters.size());
65          for (final Cluster<DoublePoint> cluster : clusters) {
66              if (cluster.getPoints().containsAll(clusterOne)) {
67                  cluster1Found = true;
68              }
69              if (cluster.getPoints().containsAll(clusterTwo)) {
70                  cluster2Found = true;
71              }
72              if (cluster.getPoints().containsAll(clusterThree)) {
73                  cluster3Found = true;
74              }
75          }
76          Assert.assertTrue(cluster1Found);
77          Assert.assertTrue(cluster2Found);
78          Assert.assertTrue(cluster3Found);
79      }
80  
81      @Test(expected = MathIllegalArgumentException.class)
82      public void testTooSmallFuzzynessFactor() {
83          new FuzzyKMeansClusterer<>(3, 1.0);
84      }
85  
86      @Test(expected = NullArgumentException.class)
87      public void testNullDataset() {
88          final FuzzyKMeansClusterer<DoublePoint> clusterer = new FuzzyKMeansClusterer<>(3, 2.0);
89          clusterer.cluster(null);
90      }
91  
92      @Test
93      public void testGetters() {
94          final DistanceMeasure measure = new CanberraDistance();
95          final UniformRandomProvider random = RandomSource.MT_64.create();
96          final FuzzyKMeansClusterer<DoublePoint> clusterer =
97                  new FuzzyKMeansClusterer<>(3, 2.0, 100, measure, 1e-6, random);
98  
99          Assert.assertEquals(3, clusterer.getK());
100         Assert.assertEquals(2.0, clusterer.getFuzziness(), 1e-6);
101         Assert.assertEquals(100, clusterer.getMaxIterations());
102         Assert.assertEquals(1e-6, clusterer.getEpsilon(), 1e-12);
103         Assert.assertEquals(measure, clusterer.getDistanceMeasure());
104         Assert.assertEquals(random, clusterer.getRandomGenerator());
105     }
106 
107     @Test
108     public void testSingleCluster() {
109         final List<DoublePoint> points = new ArrayList<>();
110         points.add(new DoublePoint(new double[] { 1, 1 }));
111 
112         final FuzzyKMeansClusterer<DoublePoint> transformer =
113                 new FuzzyKMeansClusterer<>(1, 2.0);
114         final List<CentroidCluster<DoublePoint>> clusters = transformer.cluster(points);
115 
116         Assert.assertEquals(1, clusters.size());
117     }
118 
119     @Test
120     public void testClusterCenterEqualsPoints() {
121         final List<DoublePoint> points = new ArrayList<>();
122         points.add(new DoublePoint(new double[] { 1, 1 }));
123         points.add(new DoublePoint(new double[] { 1.00001, 1.00001 }));
124         points.add(new DoublePoint(new double[] { 2, 2 }));
125         points.add(new DoublePoint(new double[] { 3, 3 }));
126 
127         final FuzzyKMeansClusterer<DoublePoint> transformer =
128                 new FuzzyKMeansClusterer<>(3, 2.0);
129         final List<CentroidCluster<DoublePoint>> clusters = transformer.cluster(points);
130 
131         Assert.assertEquals(3, clusters.size());
132     }
133 }