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.