1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.math4.neuralnet.sofm;
19
20 import org.junit.Test;
21 import org.junit.Assert;
22
23 import org.apache.commons.rng.UniformRandomProvider;
24 import org.apache.commons.rng.simple.RandomSource;
25
26 import org.apache.commons.math4.neuralnet.DistanceMeasure;
27 import org.apache.commons.math4.neuralnet.EuclideanDistance;
28 import org.apache.commons.math4.neuralnet.FeatureInitializer;
29 import org.apache.commons.math4.neuralnet.FeatureInitializerFactory;
30 import org.apache.commons.math4.neuralnet.MapRanking;
31 import org.apache.commons.math4.neuralnet.Network;
32 import org.apache.commons.math4.neuralnet.Neuron;
33 import org.apache.commons.math4.neuralnet.OffsetFeatureInitializer;
34 import org.apache.commons.math4.neuralnet.UpdateAction;
35 import org.apache.commons.math4.neuralnet.oned.NeuronString;
36
37
38
39
40 public class KohonenUpdateActionTest {
41 private final UniformRandomProvider rng = RandomSource.SPLIT_MIX_64.create();
42
43
44
45
46
47
48 @Test
49 public void testUpdate() {
50 final FeatureInitializer init
51 = new OffsetFeatureInitializer(FeatureInitializerFactory.uniform(rng, 0, 0.1));
52 final FeatureInitializer[] initArray = {init};
53
54 final int netSize = 3;
55 final Network net = new NeuronString(netSize, false, initArray).getNetwork();
56 final DistanceMeasure dist = new EuclideanDistance();
57 final LearningFactorFunction learning
58 = LearningFactorFunctionFactory.exponentialDecay(1, 0.1, 100);
59 final NeighbourhoodSizeFunction neighbourhood
60 = NeighbourhoodSizeFunctionFactory.exponentialDecay(3, 1, 100);
61 final UpdateAction update = new KohonenUpdateAction(dist, learning, neighbourhood);
62 final MapRanking rank = new MapRanking(net, dist);
63
64
65
66
67
68
69
70 final double[] features = new double[] {0.3};
71 final double[] distancesBefore = getDistances(net, dist, features);
72 final Neuron bestBefore = rank.rank(features, 1).get(0);
73
74
75 Assert.assertTrue(dist.applyAsDouble(bestBefore.getFeatures(), features) >= 0.2);
76
77 update.update(net, features);
78
79 final double[] distancesAfter = getDistances(net, dist, features);
80 final Neuron bestAfter = rank.rank(features, 1).get(0);
81
82 Assert.assertEquals(bestBefore, bestAfter);
83
84 Assert.assertEquals(0, dist.applyAsDouble(bestAfter.getFeatures(), features), 1e-16);
85
86 for (int i = 0; i < netSize; i++) {
87
88 Assert.assertTrue(distancesAfter[i] < distancesBefore[i]);
89 }
90 }
91
92
93
94
95
96
97
98
99
100
101 private static double[] getDistances(Network net,
102 DistanceMeasure dist,
103 double[] features) {
104 return net.getNeurons()
105 .stream()
106 .sorted((a, b) -> Long.compare(a.getIdentifier(), b.getIdentifier()))
107 .mapToDouble(n -> dist.applyAsDouble(n.getFeatures(), features))
108 .toArray();
109 }
110 }