You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2015/09/14 02:24:36 UTC
[1/6] [math] Javadoc
Repository: commons-math
Updated Branches:
refs/heads/master 40f969bc9 -> b189817a3
Javadoc
Methods "divideUnsigned" and "remainderUnsigned" do not exist in Java 7.
Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/cd55cbbc
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/cd55cbbc
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/cd55cbbc
Branch: refs/heads/master
Commit: cd55cbbcc5d47c2a0afca4b7e39a2170b1b8075c
Parents: 40f969b
Author: Gilles <er...@apache.org>
Authored: Mon Sep 14 01:59:23 2015 +0200
Committer: Gilles <er...@apache.org>
Committed: Mon Sep 14 01:59:23 2015 +0200
----------------------------------------------------------------------
.../commons/math4/util/ArithmeticUtils.java | 30 +++++++++-----------
1 file changed, 13 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-math/blob/cd55cbbc/src/main/java/org/apache/commons/math4/util/ArithmeticUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/util/ArithmeticUtils.java b/src/main/java/org/apache/commons/math4/util/ArithmeticUtils.java
index 0f154dc..4b54875 100644
--- a/src/main/java/org/apache/commons/math4/util/ArithmeticUtils.java
+++ b/src/main/java/org/apache/commons/math4/util/ArithmeticUtils.java
@@ -670,14 +670,13 @@ public final class ArithmeticUtils {
* Returns the unsigned remainder from dividing the first argument
* by the second where each argument and the result is interpreted
* as an unsigned value.
- * <p>This method doesn't use long datatype unlike it's used in
- * {@link java.lang.Integer#remainderUnsigned}.
+ * <p>This method does not use the {@code long} datatype.</p>
*
* @param dividend the value to be divided
* @param divisor the value doing the dividing
* @return the unsigned remainder of the first argument divided by
- * the second argument
- * @see java.lang.Integer#remainderUnsigned
+ * the second argument.
+ *
* @since 4.0
*/
public static int remainderUnsigned(int dividend, int divisor) {
@@ -701,14 +700,13 @@ public final class ArithmeticUtils {
* Returns the unsigned remainder from dividing the first argument
* by the second where each argument and the result is interpreted
* as an unsigned value.
- * <p>This method doesn't use BigInteger datatype unlike it's used in
- * {@link java.lang.Long#remainderUnsigned}.
+ * <p>This method does not use the {@code BigInteger} datatype.</p>
*
* @param dividend the value to be divided
* @param divisor the value doing the dividing
* @return the unsigned remainder of the first argument divided by
- * the second argument
- * @see java.lang.Long#remainderUnsigned
+ * the second argument.
+ *
* @since 4.0
*/
public static long remainderUnsigned(long dividend, long divisor) {
@@ -736,15 +734,14 @@ public final class ArithmeticUtils {
* basic arithmetic operations of add, subtract, and multiply are
* bit-wise identical if the two operands are regarded as both
* being signed or both being unsigned. Therefore separate {@code
- * addUnsigned}, etc. methods are not provided.
- * <p>This method doesn't use long datatype unlike it's used in
- * {@link java.lang.Integer#divideUnsigned}.
+ * addUnsigned}, etc. methods are not provided.</p>
+ * <p>This method does not use the {@code long} datatype.</p>
*
* @param dividend the value to be divided
* @param divisor the value doing the dividing
* @return the unsigned quotient of the first argument divided by
* the second argument
- * @see java.lang.Integer#divideUnsigned
+ *
* @since 4.0
*/
public static int divideUnsigned(int dividend, int divisor) {
@@ -772,15 +769,14 @@ public final class ArithmeticUtils {
* basic arithmetic operations of add, subtract, and multiply are
* bit-wise identical if the two operands are regarded as both
* being signed or both being unsigned. Therefore separate {@code
- * addUnsigned}, etc. methods are not provided.
- * <p>This method doesn't use BigInteger datatype unlike it's used in
- * {@link java.lang.Long#divideUnsigned}.
+ * addUnsigned}, etc. methods are not provided.</p>
+ * <p>This method does not use the {@code BigInteger} datatype.</p>
*
* @param dividend the value to be divided
* @param divisor the value doing the dividing
* @return the unsigned quotient of the first argument divided by
- * the second argument
- * @see java.lang.Long#divideUnsigned
+ * the second argument.
+ *
* @since 4.0
*/
public static long divideUnsigned(long dividend, long divisor) {
[6/6] [math] Update "changes.xml".
Posted by er...@apache.org.
Update "changes.xml".
Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/b189817a
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/b189817a
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/b189817a
Branch: refs/heads/master
Commit: b189817a3979fa17c0a0a3fe7b46fbc061444cca
Parents: 8b25e78
Author: Gilles <er...@apache.org>
Authored: Mon Sep 14 02:23:38 2015 +0200
Committer: Gilles <er...@apache.org>
Committed: Mon Sep 14 02:23:38 2015 +0200
----------------------------------------------------------------------
src/changes/changes.xml | 9 +++++++++
1 file changed, 9 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-math/blob/b189817a/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 561bccc..6ffe639 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -54,6 +54,15 @@ If the output is not quite correct, check for invisible trailing spaces!
</release>
<release version="4.0" date="XXXX-XX-XX" description="">
+ <action dev="erans" type="add" issue="MATH-1270"> <!-- backported to 3.6 -->
+ Various SOFM visualizations (in package "o.a.c.m.ml.neuralnet.twod.util"):
+ Unified distance matrix, hit histogram, smoothed data histograms,
+ topographic error.
+ </action>
+ <action dev="erans" type="add" issue="MATH-1268"> <!-- backported to 3.6 -->
+ New interfaces to be implemented by algorithms that visualizes properties
+ of a "NeuronSquareMesh2D" (package "o.a.c.m.ml.neuralnet.twod.util").
+ </action>
<action dev="luc" type="add" issue="MATH-1273" due-to="Qualtagh"> <!-- backported to 3.6 -->
Added negative zero support in FastMath.pow.
</action>
[4/6] [math] MATH-1270
Posted by er...@apache.org.
MATH-1270
Various SOFM visualizations: unified distance matrix, hit histogram,
smoothed data histogram, topographic error.
Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/ce131449
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/ce131449
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/ce131449
Branch: refs/heads/master
Commit: ce131449a4ca0b06c6bb27ee5d8d6d89b1467bbd
Parents: 999761b
Author: Gilles <er...@apache.org>
Authored: Mon Sep 14 02:08:30 2015 +0200
Committer: Gilles <er...@apache.org>
Committed: Mon Sep 14 02:08:30 2015 +0200
----------------------------------------------------------------------
.../ml/neuralnet/twod/util/HitHistogram.java | 85 ++++++++
.../twod/util/SmoothedDataHistogram.java | 97 +++++++++
.../twod/util/TopographicErrorHistogram.java | 91 +++++++++
.../twod/util/UnifiedDistanceMatrix.java | 203 +++++++++++++++++++
4 files changed, 476 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-math/blob/ce131449/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java
new file mode 100644
index 0000000..536acfc
--- /dev/null
+++ b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math4.ml.neuralnet.twod.util;
+
+import org.apache.commons.math4.ml.neuralnet.MapUtils;
+import org.apache.commons.math4.ml.neuralnet.Neuron;
+import org.apache.commons.math4.ml.neuralnet.Network;
+import org.apache.commons.math4.ml.neuralnet.twod.NeuronSquareMesh2D;
+import org.apache.commons.math4.ml.distance.DistanceMeasure;
+
+/**
+ * Computes the hit histogram.
+ * Each bin will contain the number of data for which the corresponding
+ * neuron is the best matching unit.
+ */
+public class HitHistogram implements MapDataVisualization {
+ /** Distance. */
+ private final DistanceMeasure distance;
+ /** Whether to compute relative bin counts. */
+ private final boolean normalizeCount;
+
+ /**
+ * @param normalizeCount Whether to compute relative bin counts.
+ * If {@code true}, the data count in each bin will be divided by the total
+ * number of samples.
+ * @param distance Distance.
+ */
+ public HitHistogram(boolean normalizeCount,
+ DistanceMeasure distance) {
+ this.normalizeCount = normalizeCount;
+ this.distance = distance;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double[][] computeImage(NeuronSquareMesh2D map,
+ Iterable<double[]> data) {
+ final int nR = map.getNumberOfRows();
+ final int nC = map.getNumberOfColumns();
+
+ final Network net = map.getNetwork();
+ final LocationFinder finder = new LocationFinder(map);
+
+ // Totla number of samples.
+ int numSamples = 0;
+ // Hit bins.
+ final double[][] hit = new double[nR][nC];
+
+ for (double[] sample : data) {
+ final Neuron best = MapUtils.findBest(sample, map, distance);
+
+ final LocationFinder.Location loc = finder.getLocation(best);
+ final int row = loc.getRow();
+ final int col = loc.getColumn();
+ hit[row][col] += 1;
+
+ ++numSamples;
+ }
+
+ if (normalizeCount) {
+ for (int r = 0; r < nR; r++) {
+ for (int c = 0; c < nC; c++) {
+ hit[r][c] /= numSamples;
+ }
+ }
+ }
+
+ return hit;
+ }
+}
http://git-wip-us.apache.org/repos/asf/commons-math/blob/ce131449/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/SmoothedDataHistogram.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/SmoothedDataHistogram.java b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/SmoothedDataHistogram.java
new file mode 100644
index 0000000..bdab570
--- /dev/null
+++ b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/SmoothedDataHistogram.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math4.ml.neuralnet.twod.util;
+
+import org.apache.commons.math4.ml.neuralnet.MapUtils;
+import org.apache.commons.math4.ml.neuralnet.Neuron;
+import org.apache.commons.math4.ml.neuralnet.twod.NeuronSquareMesh2D;
+import org.apache.commons.math4.ml.distance.DistanceMeasure;
+import org.apache.commons.math4.exception.NumberIsTooSmallException;
+
+/**
+ * Visualization of high-dimensional data projection on a 2D-map.
+ * The method is described in
+ * <quote>
+ * <em>Using Smoothed Data Histograms for Cluster Visualization in Self-Organizing Maps</em>
+ * <br>
+ * by Elias Pampalk, Andreas Rauber and Dieter Merkl.
+ * </quote>
+ */
+public class SmoothedDataHistogram implements MapDataVisualization {
+ /** Smoothing parameter. */
+ private final int smoothingBins;
+ /** Distance. */
+ private final DistanceMeasure distance;
+ /** Normalization factor. */
+ private final double membershipNormalization;
+
+ /**
+ * @param smoothingBins Number of bins.
+ * @param distance Distance.
+ */
+ public SmoothedDataHistogram(int smoothingBins,
+ DistanceMeasure distance) {
+ this.smoothingBins = smoothingBins;
+ this.distance = distance;
+
+ double sum = 0;
+ for (int i = 0; i < smoothingBins; i++) {
+ sum += smoothingBins - i;
+ }
+
+ this.membershipNormalization = 1d / sum;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws NumberIsTooSmallException if the size of the {@code map}
+ * is smaller than the number of {@link #SmoothedDataHistogram(int,DistanceMeasure)
+ * smoothing bins}.
+ */
+ @Override
+ public double[][] computeImage(NeuronSquareMesh2D map,
+ Iterable<double[]> data) {
+ final int nR = map.getNumberOfRows();
+ final int nC = map.getNumberOfColumns();
+
+ final int mapSize = nR * nC;
+ if (mapSize < smoothingBins) {
+ throw new NumberIsTooSmallException(mapSize, smoothingBins, true);
+ }
+
+ final LocationFinder finder = new LocationFinder(map);
+
+ // Histogram bins.
+ final double[][] histo = new double[nR][nC];
+
+ for (double[] sample : data) {
+ final Neuron[] sorted = MapUtils.sort(sample,
+ map.getNetwork(),
+ distance);
+ for (int i = 0; i < smoothingBins; i++) {
+ final LocationFinder.Location loc = finder.getLocation(sorted[i]);
+ final int row = loc.getRow();
+ final int col = loc.getColumn();
+ histo[row][col] += (smoothingBins - i) * membershipNormalization;
+ }
+ }
+
+ return histo;
+ }
+}
http://git-wip-us.apache.org/repos/asf/commons-math/blob/ce131449/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/TopographicErrorHistogram.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/TopographicErrorHistogram.java b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/TopographicErrorHistogram.java
new file mode 100644
index 0000000..0543ce0
--- /dev/null
+++ b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/TopographicErrorHistogram.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math4.ml.neuralnet.twod.util;
+
+import org.apache.commons.math4.ml.neuralnet.MapUtils;
+import org.apache.commons.math4.ml.neuralnet.Neuron;
+import org.apache.commons.math4.ml.neuralnet.Network;
+import org.apache.commons.math4.ml.neuralnet.twod.NeuronSquareMesh2D;
+import org.apache.commons.math4.ml.distance.DistanceMeasure;
+import org.apache.commons.math4.util.Pair;
+
+/**
+ * Computes the topographic error histogram.
+ * Each bin will contain the number of data for which the first and
+ * second best matching units are not adjacent in the map.
+ */
+public class TopographicErrorHistogram implements MapDataVisualization {
+ /** Distance. */
+ private final DistanceMeasure distance;
+ /** Whether to compute relative bin counts. */
+ private final boolean relativeCount;
+
+ /**
+ * @param relativeCount Whether to compute relative bin counts.
+ * If {@code true}, the data count in each bin will be divided by the total
+ * number of samples mapped to the neuron represented by that bin.
+ * @param distance Distance.
+ */
+ public TopographicErrorHistogram(boolean relativeCount,
+ DistanceMeasure distance) {
+ this.relativeCount = relativeCount;
+ this.distance = distance;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double[][] computeImage(NeuronSquareMesh2D map,
+ Iterable<double[]> data) {
+ final int nR = map.getNumberOfRows();
+ final int nC = map.getNumberOfColumns();
+
+ final Network net = map.getNetwork();
+ final LocationFinder finder = new LocationFinder(map);
+
+ // Hit bins.
+ final int[][] hit = new int[nR][nC];
+ // Error bins.
+ final double[][] error = new double[nR][nC];
+
+ for (double[] sample : data) {
+ final Pair<Neuron, Neuron> p = MapUtils.findBestAndSecondBest(sample, map, distance);
+ final Neuron best = p.getFirst();
+
+ final LocationFinder.Location loc = finder.getLocation(best);
+ final int row = loc.getRow();
+ final int col = loc.getColumn();
+ hit[row][col] += 1;
+
+ if (!net.getNeighbours(best).contains(p.getSecond())) {
+ // Increment count if first and second best matching units
+ // are not neighbours.
+ error[row][col] += 1;
+ }
+ }
+
+ if (relativeCount) {
+ for (int r = 0; r < nR; r++) {
+ for (int c = 0; c < nC; c++) {
+ error[r][c] /= hit[r][c];
+ }
+ }
+ }
+
+ return error;
+ }
+}
http://git-wip-us.apache.org/repos/asf/commons-math/blob/ce131449/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/UnifiedDistanceMatrix.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/UnifiedDistanceMatrix.java b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/UnifiedDistanceMatrix.java
new file mode 100644
index 0000000..4b6f67a
--- /dev/null
+++ b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/UnifiedDistanceMatrix.java
@@ -0,0 +1,203 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math4.ml.neuralnet.twod.util;
+
+import java.util.Collection;
+import org.apache.commons.math4.ml.neuralnet.Neuron;
+import org.apache.commons.math4.ml.neuralnet.Network;
+import org.apache.commons.math4.ml.neuralnet.twod.NeuronSquareMesh2D;
+import org.apache.commons.math4.ml.distance.DistanceMeasure;
+
+/**
+ * <a href="http://en.wikipedia.org/wiki/U-Matrix">U-Matrix</a>
+ * visualization of high-dimensional data projection.
+ */
+public class UnifiedDistanceMatrix implements MapVisualization {
+ /** Whether to show distance between each pair of neighbouring units. */
+ private final boolean individualDistances;
+ /** Distance. */
+ private final DistanceMeasure distance;
+
+ /** Simple constructor.
+ * @param individualDistances If {@code true}, the 8 individual
+ * inter-units distances will be {@link #computeImage(NeuronSquareMesh2D)
+ * computed}. They will be stored in additional pixels around each of
+ * the original units of the 2D-map. The value zero will be stored in the
+ * pixel corresponding to the location of a unit of the 2D-map.
+ * If {@code false}, only the average distance between a unit and all its
+ * neighbours will be computed (and stored in the pixel corresponding to
+ * that unit of the 2D-map). In that case, the number of neighbours taken
+ * into account depends on the network's
+ * {@link org.apache.commons.math4.ml.neuralnet.SquareNeighbourhood
+ * neighbourhood type}.
+ * @param distance Distance.
+ */
+ public UnifiedDistanceMatrix(boolean individualDistances,
+ DistanceMeasure distance) {
+ this.individualDistances = individualDistances;
+ this.distance = distance;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double[][] computeImage(NeuronSquareMesh2D map) {
+ if (individualDistances) {
+ return individualDistances(map);
+ } else {
+ return averageDistances(map);
+ }
+ }
+
+ /**
+ * Computes the distances between a unit of the map and its
+ * neighbours.
+ * The image will contain more pixels than the number of neurons
+ * in the given {@code map} because each neuron has 8 neighbours.
+ * The value zero will be stored in the pixels corresponding to
+ * the location of a map unit.
+ *
+ * @param map Map.
+ * @return an image representing the individual distances.
+ */
+ private double[][] individualDistances(NeuronSquareMesh2D map) {
+ final int numRows = map.getNumberOfRows();
+ final int numCols = map.getNumberOfColumns();
+
+ final double[][] uMatrix = new double[numRows * 2 + 1][numCols * 2 + 1];
+
+ for (int i = 0; i < numRows; i++) {
+ // Current unit's row index in result image.
+ final int iR = 2 * i + 1;
+
+ for (int j = 0; j < numCols; j++) {
+ // Current unit's column index in result image.
+ final int jR = 2 * j + 1;
+
+ final double[] current = map.getNeuron(i, j).getFeatures();
+ Neuron neighbour;
+
+ // Top-left neighbour.
+ neighbour = map.getNeuron(i, j,
+ NeuronSquareMesh2D.HorizontalDirection.LEFT,
+ NeuronSquareMesh2D.VerticalDirection.UP);
+ if (neighbour != null) {
+ uMatrix[iR - 1][jR - 1] = distance.compute(current,
+ neighbour.getFeatures());
+ }
+
+ // Top-center neighbour.
+ neighbour = map.getNeuron(i, j,
+ NeuronSquareMesh2D.HorizontalDirection.CENTER,
+ NeuronSquareMesh2D.VerticalDirection.UP);
+ if (neighbour != null) {
+ uMatrix[iR - 1][jR] = distance.compute(current,
+ neighbour.getFeatures());
+ }
+
+ // Top-right neighbour.
+ neighbour = map.getNeuron(i, j,
+ NeuronSquareMesh2D.HorizontalDirection.RIGHT,
+ NeuronSquareMesh2D.VerticalDirection.UP);
+ if (neighbour != null) {
+ uMatrix[iR - 1][jR + 1] = distance.compute(current,
+ neighbour.getFeatures());
+ }
+
+ // Left neighbour.
+ neighbour = map.getNeuron(i, j,
+ NeuronSquareMesh2D.HorizontalDirection.LEFT,
+ NeuronSquareMesh2D.VerticalDirection.CENTER);
+ if (neighbour != null) {
+ uMatrix[iR][jR - 1] = distance.compute(current,
+ neighbour.getFeatures());
+ }
+
+ // Right neighbour.
+ neighbour = map.getNeuron(i, j,
+ NeuronSquareMesh2D.HorizontalDirection.RIGHT,
+ NeuronSquareMesh2D.VerticalDirection.CENTER);
+ if (neighbour != null) {
+ uMatrix[iR][jR + 1] = distance.compute(current,
+ neighbour.getFeatures());
+ }
+
+ // Bottom-left neighbour.
+ neighbour = map.getNeuron(i, j,
+ NeuronSquareMesh2D.HorizontalDirection.LEFT,
+ NeuronSquareMesh2D.VerticalDirection.DOWN);
+ if (neighbour != null) {
+ uMatrix[iR + 1][jR - 1] = distance.compute(current,
+ neighbour.getFeatures());
+ }
+
+ // Bottom-center neighbour.
+ neighbour = map.getNeuron(i, j,
+ NeuronSquareMesh2D.HorizontalDirection.CENTER,
+ NeuronSquareMesh2D.VerticalDirection.DOWN);
+ if (neighbour != null) {
+ uMatrix[iR + 1][jR] = distance.compute(current,
+ neighbour.getFeatures());
+ }
+
+ // Bottom-right neighbour.
+ neighbour = map.getNeuron(i, j,
+ NeuronSquareMesh2D.HorizontalDirection.RIGHT,
+ NeuronSquareMesh2D.VerticalDirection.DOWN);
+ if (neighbour != null) {
+ uMatrix[iR + 1][jR + 1] = distance.compute(current,
+ neighbour.getFeatures());
+ }
+ }
+ }
+
+ return uMatrix;
+ }
+
+ /**
+ * Computes the distances between a unit of the map and its neighbours.
+ *
+ * @param map Map.
+ * @return an image representing the average distances.
+ */
+ private double[][] averageDistances(NeuronSquareMesh2D map) {
+ final int numRows = map.getNumberOfRows();
+ final int numCols = map.getNumberOfColumns();
+ final double[][] uMatrix = new double[numRows][numCols];
+
+ final Network net = map.getNetwork();
+
+ for (int i = 0; i < numRows; i++) {
+ for (int j = 0; j < numCols; j++) {
+ final Neuron neuron = map.getNeuron(i, j);
+ final Collection<Neuron> neighbours = net.getNeighbours(neuron);
+ final double[] features = neuron.getFeatures();
+
+ double d = 0;
+ int count = 0;
+ for (Neuron n : neighbours) {
+ ++count;
+ d += distance.compute(features, n.getFeatures());
+ }
+
+ uMatrix[i][j] = d / count;
+ }
+ }
+
+ return uMatrix;
+ }
+}
[2/6] [math] MATH-1267
Posted by er...@apache.org.
MATH-1267
Helper for finding the grid coordinates of a "Neuron" in a "NeuronSquareMesh2D".
Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/f348d34f
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/f348d34f
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/f348d34f
Branch: refs/heads/master
Commit: f348d34fb1ef3c968e2981283618aa85db203901
Parents: cd55cbb
Author: Gilles <er...@apache.org>
Authored: Mon Sep 14 02:06:43 2015 +0200
Committer: Gilles <er...@apache.org>
Committed: Mon Sep 14 02:06:43 2015 +0200
----------------------------------------------------------------------
.../ml/neuralnet/twod/util/LocationFinder.java | 104 +++++++++++++++++++
.../neuralnet/twod/util/LocationFinderTest.java | 70 +++++++++++++
2 files changed, 174 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-math/blob/f348d34f/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/LocationFinder.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/LocationFinder.java b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/LocationFinder.java
new file mode 100644
index 0000000..7450c94
--- /dev/null
+++ b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/LocationFinder.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math4.ml.neuralnet.twod.util;
+
+import java.util.Map;
+import java.util.HashMap;
+import org.apache.commons.math4.ml.neuralnet.Neuron;
+import org.apache.commons.math4.ml.neuralnet.twod.NeuronSquareMesh2D;
+import org.apache.commons.math4.exception.MathIllegalStateException;
+
+/**
+ * Helper class to find the grid coordinates of a neuron.
+ */
+public class LocationFinder {
+ /** Identifier to location mapping. */
+ private final Map<Long, Location> locations = new HashMap<Long, Location>();
+
+ /**
+ * Container holding a (row, column) pair.
+ */
+ public static class Location {
+ /** Row index. */
+ private final int row;
+ /** Column index. */
+ private final int column;
+
+ /**
+ * @param row Row index.
+ * @param column Column index.
+ */
+ public Location(int row,
+ int column) {
+ this.row = row;
+ this.column = column;
+ }
+
+ /**
+ * @return the row index.
+ */
+ public int getRow() {
+ return row;
+ }
+
+ /**
+ * @return the column index.
+ */
+ public int getColumn() {
+ return column;
+ }
+ }
+
+ /**
+ * Builds a finder to retrieve the locations of neurons that
+ * belong to the given {@code map}.
+ *
+ * @param map Map.
+ *
+ * @throws MathIllegalStateException if the network contains non-unique
+ * identifiers. This indicates an inconsistent state due to a bug in
+ * the construction code of the underlying
+ * {@link org.apache.commons.math4.ml.neuralnet.Network network}.
+ */
+ public LocationFinder(NeuronSquareMesh2D map) {
+ final int nR = map.getNumberOfRows();
+ final int nC = map.getNumberOfColumns();
+
+ for (int r = 0; r < nR; r++) {
+ for (int c = 0; c < nC; c++) {
+ final Long id = map.getNeuron(r, c).getIdentifier();
+ if (locations.get(id) != null) {
+ throw new MathIllegalStateException();
+ }
+ locations.put(id, new Location(r, c));
+ }
+ }
+ }
+
+ /**
+ * Retrieves a neuron's grid coordinates.
+ *
+ * @param n Neuron.
+ * @return the (row, column) coordinates of {@code n}, or {@code null}
+ * if no such neuron belongs to the {@link #LocationFinder(NeuronSquareMesh2D)
+ * map used to build this instance}.
+ */
+ public Location getLocation(Neuron n) {
+ return locations.get(n.getIdentifier());
+ }
+}
http://git-wip-us.apache.org/repos/asf/commons-math/blob/f348d34f/src/test/java/org/apache/commons/math4/ml/neuralnet/twod/util/LocationFinderTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/math4/ml/neuralnet/twod/util/LocationFinderTest.java b/src/test/java/org/apache/commons/math4/ml/neuralnet/twod/util/LocationFinderTest.java
new file mode 100644
index 0000000..6aaad65
--- /dev/null
+++ b/src/test/java/org/apache/commons/math4/ml/neuralnet/twod/util/LocationFinderTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math4.ml.neuralnet.twod.util;
+
+import org.apache.commons.math4.ml.neuralnet.Neuron;
+import org.apache.commons.math4.ml.neuralnet.Network;
+import org.apache.commons.math4.ml.neuralnet.FeatureInitializer;
+import org.apache.commons.math4.ml.neuralnet.FeatureInitializerFactory;
+import org.apache.commons.math4.ml.neuralnet.SquareNeighbourhood;
+import org.apache.commons.math4.ml.neuralnet.twod.NeuronSquareMesh2D;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test for {@link LocationFinder}.
+ */
+public class LocationFinderTest {
+ final FeatureInitializer init = FeatureInitializerFactory.uniform(0, 2);
+
+ /*
+ * Test assumes that the network is
+ *
+ * 0-----1
+ * | |
+ * | |
+ * 2-----3
+ */
+ @Test
+ public void test2x2Network() {
+ final FeatureInitializer[] initArray = { init };
+ final NeuronSquareMesh2D map = new NeuronSquareMesh2D(2, false,
+ 2, false,
+ SquareNeighbourhood.VON_NEUMANN,
+ initArray);
+ final LocationFinder finder = new LocationFinder(map);
+ final Network net = map.getNetwork();
+ LocationFinder.Location loc;
+
+ loc = finder.getLocation(net.getNeuron(0));
+ Assert.assertEquals(0, loc.getRow());
+ Assert.assertEquals(0, loc.getColumn());
+
+ loc = finder.getLocation(net.getNeuron(1));
+ Assert.assertEquals(0, loc.getRow());
+ Assert.assertEquals(1, loc.getColumn());
+
+ loc = finder.getLocation(net.getNeuron(2));
+ Assert.assertEquals(1, loc.getRow());
+ Assert.assertEquals(0, loc.getColumn());
+
+ loc = finder.getLocation(net.getNeuron(3));
+ Assert.assertEquals(1, loc.getRow());
+ Assert.assertEquals(1, loc.getColumn());
+ }
+}
[3/6] [math] MATH-1268
Posted by er...@apache.org.
MATH-1268
API for algorithms that create some visualization of a 2D SOFM.
Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/999761ba
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/999761ba
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/999761ba
Branch: refs/heads/master
Commit: 999761ba1bc5da820a1d2527c4aae29d95a7013a
Parents: f348d34
Author: Gilles <er...@apache.org>
Authored: Mon Sep 14 02:07:36 2015 +0200
Committer: Gilles <er...@apache.org>
Committed: Mon Sep 14 02:07:36 2015 +0200
----------------------------------------------------------------------
.../twod/util/MapDataVisualization.java | 37 ++++++++++++++++++++
.../neuralnet/twod/util/MapVisualization.java | 33 +++++++++++++++++
.../ml/neuralnet/twod/util/package-info.java | 22 ++++++++++++
3 files changed, 92 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-math/blob/999761ba/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/MapDataVisualization.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/MapDataVisualization.java b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/MapDataVisualization.java
new file mode 100644
index 0000000..00a6b8d
--- /dev/null
+++ b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/MapDataVisualization.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math4.ml.neuralnet.twod.util;
+
+import org.apache.commons.math4.ml.neuralnet.twod.NeuronSquareMesh2D;
+
+/**
+ * Interface for algorithms that compute some metrics of the projection of
+ * data on a 2D-map.
+ */
+public interface MapDataVisualization {
+ /**
+ * Creates an image of the {@code data} metrics when represented by the
+ * {@code map}.
+ *
+ * @param map Map.
+ * @param data Data.
+ * @return a 2D-array (in row major order) representing the metrics.
+ */
+ double[][] computeImage(NeuronSquareMesh2D map,
+ Iterable<double[]> data);
+}
http://git-wip-us.apache.org/repos/asf/commons-math/blob/999761ba/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/MapVisualization.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/MapVisualization.java b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/MapVisualization.java
new file mode 100644
index 0000000..b5d6873
--- /dev/null
+++ b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/MapVisualization.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.math4.ml.neuralnet.twod.util;
+
+import org.apache.commons.math4.ml.neuralnet.twod.NeuronSquareMesh2D;
+
+/**
+ * Interface for algorithms that compute some property of a 2D-map.
+ */
+public interface MapVisualization {
+ /**
+ * Creates an image of the {@code map}.
+ *
+ * @param map Map.
+ * @return a 2D-array (in row major order) representing the property.
+ */
+ double[][] computeImage(NeuronSquareMesh2D map);
+}
http://git-wip-us.apache.org/repos/asf/commons-math/blob/999761ba/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/package-info.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/package-info.java b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/package-info.java
new file mode 100644
index 0000000..9984c70
--- /dev/null
+++ b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Utilities to visualize two-dimensional neural networks.
+ */
+
+package org.apache.commons.math4.ml.neuralnet.twod.util;
[5/6] [math] Unused variable.
Posted by er...@apache.org.
Unused variable.
Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/8b25e786
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/8b25e786
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/8b25e786
Branch: refs/heads/master
Commit: 8b25e786e9447c54efbca6caa09400b0a8a76116
Parents: ce13144
Author: Gilles <er...@apache.org>
Authored: Mon Sep 14 02:20:40 2015 +0200
Committer: Gilles <er...@apache.org>
Committed: Mon Sep 14 02:20:40 2015 +0200
----------------------------------------------------------------------
.../apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java | 2 --
1 file changed, 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-math/blob/8b25e786/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java
index 536acfc..e913faf 100644
--- a/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java
+++ b/src/main/java/org/apache/commons/math4/ml/neuralnet/twod/util/HitHistogram.java
@@ -19,7 +19,6 @@ package org.apache.commons.math4.ml.neuralnet.twod.util;
import org.apache.commons.math4.ml.neuralnet.MapUtils;
import org.apache.commons.math4.ml.neuralnet.Neuron;
-import org.apache.commons.math4.ml.neuralnet.Network;
import org.apache.commons.math4.ml.neuralnet.twod.NeuronSquareMesh2D;
import org.apache.commons.math4.ml.distance.DistanceMeasure;
@@ -53,7 +52,6 @@ public class HitHistogram implements MapDataVisualization {
final int nR = map.getNumberOfRows();
final int nC = map.getNumberOfColumns();
- final Network net = map.getNetwork();
final LocationFinder finder = new LocationFinder(map);
// Totla number of samples.