OSDN Git Service

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/simplenn/trunk@9 dd34cd95-496f-4e97...
authoru6k <u6k@dd34cd95-496f-4e97-851c-65f59ff6709a>
Fri, 18 Apr 2008 18:30:19 +0000 (18:30 +0000)
committeru6k <u6k@dd34cd95-496f-4e97-851c-65f59ff6709a>
Fri, 18 Apr 2008 18:30:19 +0000 (18:30 +0000)
simplenn/src/main/java/jp/gr/java_conf/u6k/simplenn/SimpleNNApplet.java
simplenn/src/main/java/jp/gr/java_conf/u6k/simplenn/package.html [new file with mode: 0644]

index 3b280b3..919d5f0 100644 (file)
@@ -1,3 +1,33 @@
+/*\r
+ * Copyright (C) 2007 u6k.yu1@gmail.com, All Rights Reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ *\r
+ *    1. Redistributions of source code must retain the above copyright\r
+ *       notice, this list of conditions and the following disclaimer.\r
+ *\r
+ *    2. Redistributions in binary form must reproduce the above copyright\r
+ *       notice, this list of conditions and the following disclaimer in the\r
+ *       documentation and/or other materials provided with the distribution.\r
+ *\r
+ *    3. Neither the name of Clarkware Consulting, Inc. nor the names of its\r
+ *       contributors may be used to endorse or promote products derived\r
+ *       from this software without prior written permission. For written\r
+ *       permission, please contact clarkware@clarkware.com.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,\r
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\r
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL\r
+ * CLARKWARE CONSULTING OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
+ * NEGLIGENCE OR OTHERWISE) ARISING IN  ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
 \r
 package jp.gr.java_conf.u6k.simplenn;\r
 \r
@@ -22,68 +52,327 @@ import java.io.InputStreamReader;
  * @version $Id$\r
  * @see http://codezine.jp/a/article/aid/372.aspx\r
  */\r
-public class SimpleNNApplet extends Applet implements MouseListener, MouseMotionListener, ActionListener {\r
-\r
-    Button    button1, button2, button3, button4;\r
-\r
-    int       X0           = 10, X1 = 125;\r
-\r
-    int       Y0           = 55, Y1 = 70, Y2 = 160, Y3 = 240, Y4 = 305;\r
-\r
-    int       RX0          = 30, RX1 = 60, RX2 = 210, RX3 = 260;\r
-\r
-    int       RY0          = 225, RY1 = 240;\r
-\r
-    int       WIDTH        = 7;                                        // 入力データの幅\r
-\r
-    int       HEIGHT       = 11;                                       // 入力データの高さ\r
-\r
-    int       INPUT        = WIDTH * HEIGHT;                           // 入力層の数(入力データ数)\r
-\r
-    int       HIDDEN       = 16;                                       // 隠れ層の数\r
-\r
-    int       PATTERN      = 10;                                       // パターンの種類\r
-\r
-    int       OUTPUT       = PATTERN;                                  // 出力層の数(出力データ数)\r
-\r
-    int       OUTER_CYCLES = 100;                                      // 外部サイクル(一連のパターンの繰返し学習)の回数\r
-\r
-    int       INNER_CYCLES = 100;                                      // 内部サイクル(同一パターンの繰返し学習)の回数\r
-\r
-    float     ALPHA        = 1.2f;                                     // 学習の加速係数\r
-\r
-    float     BETA         = 1.2f;                                     // シグモイド曲線の傾斜\r
-\r
-    int[]     sample_in    = new int[INPUT];                           // 学習用入力\r
-\r
-    int[]     written_in   = new int[INPUT];                           // 認識用手書き入力\r
-\r
-    float[][] weight_ih    = new float[INPUT][HIDDEN];                 // 入力層と隠れ層の間の重み係数\r
-\r
-    float[]   thresh_h     = new float[HIDDEN];                        // 隠れ層の閾値\r
-\r
-    float[]   hidden_out   = new float[HIDDEN];                        // 隠れ層の出力\r
-\r
-    float[][] weight_ho    = new float[HIDDEN][OUTPUT];                // 隠れ層と出力層の間の重み係数\r
-\r
-    float[]   thresh_o     = new float[OUTPUT];                        // 出力層の閾値\r
-\r
-    float[]   recog_out    = new float[OUTPUT];                        // 認識出力(出力層の出力)\r
-\r
-    int[]     teach        = new int[PATTERN];                         // 教師信号\r
-\r
-    boolean   learning_flag;                                           // 「学習モード」フラグ\r
-\r
-    int[][]   sample_array;                                            // 学習用入力データの基となるパターン\r
-\r
-    int[][]   teach_array  = new int[PATTERN][OUTPUT];                 // パターンと出力すべき教師信号の比較表\r
-\r
-    int       x_new, y_new, x_old, y_old;                              // 手書き文字入力用座標\r
+@SuppressWarnings("serial")\r
+public final class SimpleNNApplet extends Applet implements MouseListener, MouseMotionListener, ActionListener {\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   X0              = 10;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   X1              = 125;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   Y0              = 55;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   Y1              = 70;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   Y2              = 160;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   Y3              = 240;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   Y4              = 305;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   RX0             = 30;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   RX1             = 60;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   RX2             = 210;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   RX3             = 260;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   RY0             = 225;\r
+\r
+    /**\r
+     * <p>\r
+     * 文字列とかの表示基準座標。\r
+     * </p>\r
+     */\r
+    private static final int   RY1             = 240;\r
+\r
+    /**\r
+     * <p>\r
+     * 入力データの幅。\r
+     * </p>\r
+     */\r
+    private static final int   WIDTH           = 7;\r
+\r
+    /**\r
+     * <p>\r
+     * 入力データの高さ。\r
+     * </p>\r
+     */\r
+    private static final int   HEIGHT          = 11;\r
+\r
+    /**\r
+     * <p>\r
+     * 入力層の数(入力データ数)。\r
+     * </p>\r
+     */\r
+    private static final int   INPUT           = SimpleNNApplet.WIDTH * SimpleNNApplet.HEIGHT;\r
+\r
+    /**\r
+     * <p>\r
+     * 隠れ層の数。\r
+     * </p>\r
+     */\r
+    private static final int   HIDDEN          = 16;\r
+\r
+    /**\r
+     * <p>\r
+     * パターンの種類。\r
+     * </p>\r
+     */\r
+    private static final int   PATTERN         = 10;\r
+\r
+    /**\r
+     * <p>\r
+     * 出力層の数(出力データ数)。\r
+     * </p>\r
+     */\r
+    private static final int   OUTPUT          = SimpleNNApplet.PATTERN;\r
+\r
+    /**\r
+     * <p>\r
+     * 外部サイクル(一連のパターンの繰返し学習)の回数。\r
+     * </p>\r
+     */\r
+    private static final int   OUTER_CYCLES    = 100;\r
+\r
+    /**\r
+     * <p>\r
+     * 内部サイクル(同一パターンの繰返し学習)の回数。\r
+     * </p>\r
+     */\r
+    private static final int   INNER_CYCLES    = 100;\r
+\r
+    /**\r
+     * <p>\r
+     * 学習の加速係数。\r
+     * </p>\r
+     */\r
+    private static final float ALPHA           = 1.2f;\r
+\r
+    /**\r
+     * <p>\r
+     * シグモイド曲線の傾斜。\r
+     * </p>\r
+     */\r
+    private static final float BETA            = 1.2f;\r
+\r
+    /**\r
+     * <p>\r
+     * 「再学習」ボタン。\r
+     * </p>\r
+     */\r
+    private Button             button1;\r
+\r
+    /**\r
+     * <p>\r
+     * 「学習終了」ボタン。\r
+     * </p>\r
+     */\r
+    private Button             button2;\r
+\r
+    /**\r
+     * <p>\r
+     * 「入力クリア」ボタン。\r
+     * </p>\r
+     */\r
+    private Button             button3;\r
+\r
+    /**\r
+     * <p>\r
+     * 「認識」ボタン。\r
+     * </p>\r
+     */\r
+    private Button             button4;\r
+\r
+    /**\r
+     * <p>\r
+     * 学習用入力。\r
+     * </p>\r
+     */\r
+    private int[]              sampleIn        = new int[SimpleNNApplet.INPUT];\r
+\r
+    /**\r
+     * <p>\r
+     * 認識用手書き入力。\r
+     * </p>\r
+     */\r
+    private int[]              writtenIn       = new int[SimpleNNApplet.INPUT];\r
+\r
+    /**\r
+     * <p>\r
+     * 入力層と隠れ層の間の重み係数。\r
+     * </p>\r
+     */\r
+    private float[][]          weightInHidden  = new float[SimpleNNApplet.INPUT][SimpleNNApplet.HIDDEN];\r
+\r
+    /**\r
+     * <p>\r
+     * 隠れ層の閾値。\r
+     * </p>\r
+     */\r
+    private float[]            thresholdHidden = new float[SimpleNNApplet.HIDDEN];\r
+\r
+    /**\r
+     * <p>\r
+     * 隠れ層の出力。\r
+     * </p>\r
+     */\r
+    private float[]            hiddenOut       = new float[SimpleNNApplet.HIDDEN];\r
+\r
+    /**\r
+     * <p>\r
+     * 隠れ層と出力層の間の重み係数。\r
+     * </p>\r
+     */\r
+    private float[][]          weightHiddenOut = new float[SimpleNNApplet.HIDDEN][SimpleNNApplet.OUTPUT];\r
+\r
+    /**\r
+     * <p>\r
+     * 出力層の閾値。\r
+     * </p>\r
+     */\r
+    private float[]            thresholdOut    = new float[SimpleNNApplet.OUTPUT];\r
+\r
+    /**\r
+     * <p>\r
+     * 認識出力(出力層の出力)。\r
+     * </p>\r
+     */\r
+    private float[]            recognizeOut    = new float[SimpleNNApplet.OUTPUT];\r
+\r
+    /**\r
+     * <p>\r
+     * 教師信号。\r
+     * </p>\r
+     */\r
+    private int[]              teach           = new int[SimpleNNApplet.PATTERN];\r
+\r
+    /**\r
+     * <p>\r
+     * 「学習モード」フラグ。\r
+     * </p>\r
+     */\r
+    private boolean            learningFlag;\r
+\r
+    /**\r
+     * <p>\r
+     * 学習用入力データの基となるパターン。\r
+     * </p>\r
+     */\r
+    private int[][]            sampleArray;\r
+\r
+    /**\r
+     * <p>\r
+     * パターンと出力すべき教師信号の比較表。\r
+     * </p>\r
+     */\r
+    private int[][]            teachArray      = new int[SimpleNNApplet.PATTERN][SimpleNNApplet.OUTPUT];\r
+\r
+    /**\r
+     * <p>\r
+     * 手書き文字入力用座標。\r
+     * </p>\r
+     */\r
+    private int                xNew;\r
+\r
+    /**\r
+     * <p>\r
+     * 手書き文字入力用座標。\r
+     * </p>\r
+     */\r
+    private int                yNew;\r
+\r
+    /**\r
+     * <p>\r
+     * 手書き文字入力用座標。\r
+     * </p>\r
+     */\r
+    private int                xOld;\r
+\r
+    /**\r
+     * <p>\r
+     * 手書き文字入力用座標。\r
+     * </p>\r
+     */\r
+    private int                yOld;\r
+\r
+    /**\r
+     * <p>\r
+     * 新しいインスタンスを初期化します。\r
+     * </p>\r
+     */\r
+    public SimpleNNApplet() {\r
+    }\r
 \r
+    /**\r
+     * <p>\r
+     * アプレットを初期化します。\r
+     * </p>\r
+     */\r
     public void init() {\r
         // 学習用入力データの元となるパターンの読み込み\r
-        this.sample_array = new int[10][WIDTH * HEIGHT];\r
-        for (int i = 0; i <= 9; i++) {\r
+        this.sampleArray = new int[SimpleNNApplet.PATTERN][SimpleNNApplet.WIDTH * SimpleNNApplet.HEIGHT];\r
+        for (int i = 0; i < SimpleNNApplet.PATTERN; i++) {\r
             BufferedReader r = new BufferedReader(new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream(i + ".txt")));\r
             try {\r
                 try {\r
@@ -91,7 +380,7 @@ public class SimpleNNApplet extends Applet implements MouseListener, MouseMotion
                     String line;\r
                     while ((line = r.readLine()) != null) {\r
                         for (char c : line.toCharArray()) {\r
-                            this.sample_array[i][j] = Integer.parseInt(Character.toString(c));\r
+                            this.sampleArray[i][j] = Integer.parseInt(Character.toString(c));\r
                             j++;\r
                         }\r
                     }\r
@@ -103,123 +392,203 @@ public class SimpleNNApplet extends Applet implements MouseListener, MouseMotion
             }\r
         }\r
 \r
-        setBackground(Color.gray);\r
+        this.setBackground(Color.gray);\r
 \r
         // ボタンの設定\r
-        add(button1 = new Button("  再学習  "));\r
-        add(button2 = new Button(" 学習終了 "));\r
-        add(button3 = new Button("入力クリヤ"));\r
-        add(button4 = new Button("  認  識  "));\r
-        button1.addActionListener(this);\r
-        button2.addActionListener(this);\r
-        button3.addActionListener(this);\r
-        button4.addActionListener(this);\r
+        this.button1 = new Button("  再学習  ");\r
+        this.button2 = new Button(" 学習終了 ");\r
+        this.button3 = new Button("入力クリヤ");\r
+        this.button4 = new Button("  認  識  ");\r
+        this.add(this.button1);\r
+        this.add(this.button2);\r
+        this.add(this.button3);\r
+        this.add(this.button4);\r
+        this.button1.addActionListener(this);\r
+        this.button2.addActionListener(this);\r
+        this.button3.addActionListener(this);\r
+        this.button4.addActionListener(this);\r
 \r
         // マウスの設定\r
-        addMouseListener(this);\r
-        addMouseMotionListener(this);\r
+        this.addMouseListener(this);\r
+        this.addMouseMotionListener(this);\r
 \r
         // 教師信号の設定\r
-        for (int q = 0; q < PATTERN; q++)\r
-            for (int k = 0; k < OUTPUT; k++) {\r
-                if (q == k)\r
-                    teach_array[q][k] = 1;\r
-                else\r
-                    teach_array[q][k] = 0;\r
+        for (int q = 0; q < SimpleNNApplet.PATTERN; q++) {\r
+            for (int k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+                if (q == k) {\r
+                    this.teachArray[q][k] = 1;\r
+                } else {\r
+                    this.teachArray[q][k] = 0;\r
+                }\r
             }\r
+        }\r
 \r
         // モードの初期設定\r
-        learning_flag = true;\r
-\r
+        this.learningFlag = true;\r
     }\r
 \r
-    // ------------------- ボタン関係のメソッド ------------------\r
-\r
+    /**\r
+     * <p>\r
+     * クリックしたボタンごとの処理を行います。\r
+     * </p>\r
+     * \r
+     * @param ae\r
+     *            イベント情報。\r
+     */\r
     public void actionPerformed(ActionEvent ae) {\r
-\r
-        if (ae.getSource() == button1) { // 「再学習」\r
-            learning_flag = true;\r
-            repaint();\r
+        if (ae.getSource() == this.button1) {\r
+            // 「再学習」\r
+            this.learningFlag = true;\r
+            this.repaint();\r
         }\r
-        if (ae.getSource() == button2) { // 「学習終了」\r
-            learning_flag = false;\r
-            repaint();\r
+        if (ae.getSource() == this.button2) {\r
+            // 「学習終了」\r
+            this.learningFlag = false;\r
+            this.repaint();\r
         }\r
-        if (ae.getSource() == button3) { // 「入力クリヤ」\r
-            if (!learning_flag)\r
-                repaint();\r
+        if (ae.getSource() == this.button3) {\r
+            // 「入力クリヤ」\r
+            if (!this.learningFlag) {\r
+                this.repaint();\r
+            }\r
         }\r
-        if (ae.getSource() == button4) { // 「認識」\r
-            if (!learning_flag)\r
-                recognizeCharacter();\r
+        if (ae.getSource() == this.button4) {\r
+            // 「認識」\r
+            if (!this.learningFlag) {\r
+                this.recognizeCharacter();\r
+            }\r
         }\r
-\r
     }\r
 \r
-    // ---------- マウス関係のメソッド(手書き文字入力)----------\r
-\r
+    /**\r
+     * <p>\r
+     * 手書き入力を開始したときの処理を行います。\r
+     * </p>\r
+     * \r
+     * @param me\r
+     *            イベント情報。\r
+     */\r
     public void mousePressed(MouseEvent me) {\r
         int x = me.getX();\r
         int y = me.getY();\r
-        if (!learning_flag && x >= RX1 && x <= RX1 + WIDTH * 10 && y >= RY1 && y <= RY1 + HEIGHT * 10) {\r
-            x_old = me.getX();\r
-            y_old = me.getY();\r
-            written_in[(y_old - RY1) / 10 * WIDTH + (x_old - RX1) / 10] = 1;\r
+        if (!this.learningFlag && x >= SimpleNNApplet.RX1 && x <= SimpleNNApplet.RX1 + SimpleNNApplet.WIDTH * SimpleNNApplet.PATTERN && y >= SimpleNNApplet.RY1 && y <= SimpleNNApplet.RY1 + SimpleNNApplet.HEIGHT * SimpleNNApplet.PATTERN) {\r
+            this.xOld = me.getX();\r
+            this.yOld = me.getY();\r
+            this.writtenIn[(this.yOld - SimpleNNApplet.RY1) / SimpleNNApplet.PATTERN * SimpleNNApplet.WIDTH + (this.xOld - SimpleNNApplet.RX1) / SimpleNNApplet.PATTERN] = 1;\r
         }\r
     }\r
 \r
+    /**\r
+     * <p>\r
+     * 何もしません。\r
+     * </p>\r
+     * \r
+     * @param me\r
+     *            イベント情報。\r
+     */\r
     public void mouseClicked(MouseEvent me) {\r
     }\r
 \r
+    /**\r
+     * <p>\r
+     * 何もしません。\r
+     * </p>\r
+     * \r
+     * @param me\r
+     *            イベント情報。\r
+     */\r
     public void mouseEntered(MouseEvent me) {\r
     }\r
 \r
+    /**\r
+     * <p>\r
+     * 何もしません。\r
+     * </p>\r
+     * \r
+     * @param me\r
+     *            イベント情報。\r
+     */\r
     public void mouseExited(MouseEvent me) {\r
     }\r
 \r
+    /**\r
+     * <p>\r
+     * 何もしません。\r
+     * </p>\r
+     * \r
+     * @param me\r
+     *            イベント情報。\r
+     */\r
     public void mouseReleased(MouseEvent me) {\r
     }\r
 \r
+    /**\r
+     * <p>\r
+     * 手書き入力中にマウスを動かしたときの処理を行います。\r
+     * </p>\r
+     * \r
+     * @param me\r
+     *            イベント情報。\r
+     */\r
     public void mouseDragged(MouseEvent me) {\r
         int x = me.getX();\r
         int y = me.getY();\r
-        if (!learning_flag && x >= RX1 && x <= RX1 + WIDTH * 10 && y >= RY1 && y <= RY1 + HEIGHT * 10) {\r
-            Graphics g = getGraphics();\r
-            x_new = me.getX();\r
-            y_new = me.getY();\r
-            g.drawLine(x_old, y_old, x_new, y_new);\r
-            x_old = x_new;\r
-            y_old = y_new;\r
-            written_in[(y_old - RY1) / 10 * WIDTH + (x_old - RX1) / 10] = 1;\r
+        if (!this.learningFlag && x >= SimpleNNApplet.RX1 && x <= SimpleNNApplet.RX1 + SimpleNNApplet.WIDTH * SimpleNNApplet.PATTERN && y >= SimpleNNApplet.RY1 && y <= SimpleNNApplet.RY1 + SimpleNNApplet.HEIGHT * SimpleNNApplet.PATTERN) {\r
+            Graphics g = this.getGraphics();\r
+            this.xNew = me.getX();\r
+            this.yNew = me.getY();\r
+            g.drawLine(this.xOld, this.yOld, this.xNew, this.yNew);\r
+            this.xOld = this.xNew;\r
+            this.yOld = this.yNew;\r
+            this.writtenIn[(this.yOld - SimpleNNApplet.RY1) / SimpleNNApplet.PATTERN * SimpleNNApplet.WIDTH + (this.xOld - SimpleNNApplet.RX1) / SimpleNNApplet.PATTERN] = 1;\r
         }\r
-\r
     }\r
 \r
+    /**\r
+     * <p>\r
+     * 何もしません。\r
+     * </p>\r
+     * \r
+     * @param me\r
+     *            イベント情報。\r
+     */\r
     public void mouseMoved(MouseEvent me) {\r
     }\r
 \r
-    // ---------- 起動時およびrepaint()で呼び出されるメソッド ----------\r
-\r
+    /**\r
+     * <p>\r
+     * 画面に表示します。\r
+     * </p>\r
+     * \r
+     * @param g\r
+     *            表示対象。\r
+     */\r
     public void paint(Graphics g) {\r
-\r
-        int i, j, k, p, q, r, x;\r
+        int i;\r
+        int j;\r
+        int k;\r
+        int p;\r
+        int q;\r
+        int r;\r
+        int x;\r
 \r
         String string;\r
 \r
-        float outer_error; // 外部サイクルエラー累計\r
-        float inner_error; // 内部サイクルエラー累計\r
-        float temp_error; // 隠れ層の誤差の累計\r
+        // 外部サイクルエラー累計\r
+        float outerError;\r
+        // 内部サイクルエラー累計\r
+        float innerError;\r
+        // 隠れ層の誤差の累計\r
+        // TODO float tempError;\r
 \r
-        // 学習モードの背景\r
-        if (learning_flag) {\r
+        if (this.learningFlag) {\r
+            // 学習モードの背景\r
             g.setColor(new Color(255, 255, 192));\r
             g.fillRect(5, 35, 590, 460);\r
             g.setColor(Color.black);\r
             g.drawString("学習モード", 500, 55);\r
-        }\r
-\r
-        // 認識モードの背景\r
-        else {\r
+        } else {\r
+            // 認識モードの背景\r
             g.setColor(new Color(192, 255, 255));\r
             g.fillRect(5, 35, 590, 460);\r
             g.setColor(Color.black);\r
@@ -227,223 +596,267 @@ public class SimpleNNApplet extends Applet implements MouseListener, MouseMotion
         }\r
 \r
         // 学習用パターンの表示\r
-        g.drawString("使用している学習用パターン", X0, Y0);\r
-        for (q = 0; q < PATTERN; q++) {\r
+        g.drawString("使用している学習用パターン", SimpleNNApplet.X0, SimpleNNApplet.Y0);\r
+        for (q = 0; q < SimpleNNApplet.PATTERN; q++) {\r
             x = 56 * q;\r
-            for (j = 0; j < HEIGHT; j++)\r
-                for (i = 0; i < WIDTH; i++) {\r
-                    if (sample_array[q][WIDTH * j + i] == 1)\r
+            for (j = 0; j < SimpleNNApplet.HEIGHT; j++) {\r
+                for (i = 0; i < SimpleNNApplet.WIDTH; i++) {\r
+                    if (this.sampleArray[q][SimpleNNApplet.WIDTH * j + i] == 1) {\r
                         g.setColor(Color.red);\r
-                    else\r
+                    } else {\r
                         g.setColor(Color.cyan);\r
-                    g.fillRect(X0 + x + 6 * i, Y1 + 6 * j, 5, 5);\r
+                    }\r
+                    g.fillRect(SimpleNNApplet.X0 + x + 6 * i, SimpleNNApplet.Y1 + 6 * j, 5, 5);\r
                 }\r
+            }\r
         }\r
         g.setColor(Color.black);\r
 \r
-        // -------------------------------------------------------------------\r
-        // --------------------------- 学習モード ----------------------------\r
-        // -------------------------------------------------------------------\r
-        if (learning_flag) {\r
+        if (this.learningFlag) {\r
+            // 学習モード\r
 \r
             // 閾値と重みの乱数設定\r
-            for (j = 0; j < HIDDEN; j++) {\r
-                thresh_h[j] = (float) Math.random() - 0.5f;\r
-                for (i = 0; i < INPUT; i++)\r
-                    weight_ih[i][j] = (float) Math.random() - 0.5f;\r
+            for (j = 0; j < SimpleNNApplet.HIDDEN; j++) {\r
+                this.thresholdHidden[j] = (float) Math.random() - 0.5f;\r
+                for (i = 0; i < SimpleNNApplet.INPUT; i++) {\r
+                    this.weightInHidden[i][j] = (float) Math.random() - 0.5f;\r
+                }\r
             }\r
-            for (k = 0; k < OUTPUT; k++) {\r
-                thresh_o[k] = (float) Math.random() - 0.5f;\r
-                for (j = 0; j < HIDDEN; j++)\r
-                    weight_ho[j][k] = (float) Math.random() - 0.5f;\r
+            for (k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+                this.thresholdOut[k] = (float) Math.random() - 0.5f;\r
+                for (j = 0; j < SimpleNNApplet.HIDDEN; j++) {\r
+                    this.weightHiddenOut[j][k] = (float) Math.random() - 0.5f;\r
+                }\r
             }\r
 \r
             // -------------------------- 学習 --------------------------\r
+            for (p = 0; p < SimpleNNApplet.OUTER_CYCLES; p++) {\r
+                // 外部サイクル\r
 \r
-            for (p = 0; p < OUTER_CYCLES; p++) { // 外部サイクル\r
-\r
-                outer_error = 0.0f; // 外部二乗誤差のクリヤー\r
+                // 外部二乗誤差のクリヤー\r
+                outerError = 0.0f;\r
 \r
-                for (q = 0; q < PATTERN; q++) { // パターンの切り替え\r
+                for (q = 0; q < SimpleNNApplet.PATTERN; q++) {\r
+                    // パターンの切り替え\r
 \r
                     // パターンに対応した入力と教師信号の設定\r
-                    sample_in = sample_array[q];\r
-                    teach = teach_array[q];\r
+                    this.sampleIn = this.sampleArray[q];\r
+                    this.teach = this.teachArray[q];\r
 \r
-                    for (r = 0; r < INNER_CYCLES; r++) { // 内部サイクル\r
+                    for (r = 0; r < SimpleNNApplet.INNER_CYCLES; r++) {\r
+                        // 内部サイクル\r
 \r
                         // 順方向演算\r
-                        forwardNeuralNet(sample_in, recog_out);\r
+                        this.forwardNeuralNet(this.sampleIn, this.recognizeOut);\r
 \r
                         // 逆方向演算(バックプロパゲーション)\r
-                        backwardNeuralNet();\r
-\r
+                        this.backwardNeuralNet();\r
                     }\r
 \r
                     // 内部二乗誤差の計算\r
-                    inner_error = 0.0f; // 内部二乗誤差のクリヤー\r
-                    for (k = 0; k < OUTPUT; k++)\r
-                        inner_error += (teach[k] - recog_out[k]) * (teach[k] - recog_out[k]);\r
 \r
-                    outer_error += inner_error; // 外部二乗誤差への累加算\r
+                    // 内部二乗誤差のクリヤー\r
+                    innerError = 0.0f;\r
+\r
+                    for (k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+                        innerError += (this.teach[k] - this.recognizeOut[k]) * (this.teach[k] - this.recognizeOut[k]);\r
+                    }\r
+\r
+                    // 外部二乗誤差への累加算\r
+                    outerError += innerError;\r
 \r
                 }\r
 \r
                 // 外部サイクルの回数と外部二乗誤差の表示\r
-                g.drawString("実行中の外部サイクルの回数と二乗誤差", X0, Y2);\r
+                g.drawString("実行中の外部サイクルの回数と二乗誤差", SimpleNNApplet.X0, SimpleNNApplet.Y2);\r
                 g.setColor(new Color(255, 255, 192));\r
-                g.fillRect(X0 + 5, Y2 + 10, 200, 50); // 以前の表示を消去\r
+                g.fillRect(SimpleNNApplet.X0 + 5, SimpleNNApplet.Y2 + 10, 200, 50);\r
                 g.setColor(Color.black);\r
-                g.drawString("OuterCycles=" + String.valueOf(p), X0 + 10, Y2 + 25);\r
-                g.drawString("TotalSquaredError=" + String.valueOf(outer_error), X0 + 10, Y2 + 45);\r
+                g.drawString("OuterCycles=" + String.valueOf(p), SimpleNNApplet.X0 + 10, SimpleNNApplet.Y2 + 25);\r
+                g.drawString("TotalSquaredError=" + String.valueOf(outerError), SimpleNNApplet.X0 + 10, SimpleNNApplet.Y2 + 45);\r
 \r
             }\r
 \r
             // --------------------- 学習結果の確認 ---------------------\r
-\r
-            g.drawString("学習結果の確認", X0, Y3);\r
-            for (k = 0; k < OUTPUT; k++) {\r
-                g.drawString("Output", X1 + 45 * k, Y3 + 25);\r
-                g.drawString("  [" + String.valueOf(k) + "]", X1 + 5 + 45 * k, Y3 + 40);\r
+            g.drawString("学習結果の確認", SimpleNNApplet.X0, SimpleNNApplet.Y3);\r
+            for (k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+                g.drawString("Output", SimpleNNApplet.X1 + 45 * k, SimpleNNApplet.Y3 + 25);\r
+                g.drawString("  [" + String.valueOf(k) + "]", SimpleNNApplet.X1 + 5 + 45 * k, SimpleNNApplet.Y3 + 40);\r
             }\r
 \r
-            for (q = 0; q < PATTERN; q++) {\r
+            for (q = 0; q < SimpleNNApplet.PATTERN; q++) {\r
 \r
                 // 入力パターンの設定\r
-                sample_in = sample_array[q];\r
+                this.sampleIn = this.sampleArray[q];\r
 \r
                 // 順方向演算\r
-                forwardNeuralNet(sample_in, recog_out);\r
+                this.forwardNeuralNet(this.sampleIn, this.recognizeOut);\r
 \r
                 // 結果の表示\r
                 g.setColor(Color.black);\r
-                g.drawString("TestPattern[" + String.valueOf(q) + "]", X0 + 10, Y4 + 20 * q);\r
-                for (k = 0; k < OUTPUT; k++) {\r
-                    if (recog_out[k] > 0.99) { // 99% より大は、赤で YES と表示\r
+                g.drawString("TestPattern[" + String.valueOf(q) + "]", SimpleNNApplet.X0 + 10, SimpleNNApplet.Y4 + 20 * q);\r
+                for (k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+                    if (this.recognizeOut[k] > 0.99) {\r
+                        // 99% より大は、赤で YES と表示\r
                         g.setColor(Color.red);\r
                         string = "YES";\r
-                    } else if (recog_out[k] < 0.01) { // 1% より小は、青で NO と表示\r
+                    } else if (this.recognizeOut[k] < 0.01) {\r
+                        // 1% より小は、青で NO と表示\r
                         g.setColor(Color.blue);\r
                         string = "NO ";\r
-                    } else { // 1% 以上 99% 以下は、黒で ? と表示\r
+                    } else {\r
+                        // 1% 以上 99% 以下は、黒で ? と表示\r
                         g.setColor(Color.black);\r
                         string = " ? ";\r
                     }\r
-                    g.drawString(string, X1 + 10 + 45 * k, Y4 + 20 * q);\r
+                    g.drawString(string, SimpleNNApplet.X1 + 10 + 45 * k, SimpleNNApplet.Y4 + 20 * q);\r
                 }\r
 \r
             }\r
-        }\r
-\r
-        // -------------------------------------------------------------------\r
-        // --------------------------- 認識モード ----------------------------\r
-        // -------------------------------------------------------------------\r
-        else {\r
+        } else {\r
+            // 認識モード\r
             g.setColor(Color.black);\r
-            g.drawString("マウスで数字を描いて下さい", RX0, RY0);\r
-            g.drawRect(RX1 - 1, RY1 - 1, WIDTH * 10 + 2, HEIGHT * 10 + 2); // 外枠\r
+            g.drawString("マウスで数字を描いて下さい", SimpleNNApplet.RX0, SimpleNNApplet.RY0);\r
+            // 外枠\r
+            g.drawRect(SimpleNNApplet.RX1 - 1, SimpleNNApplet.RY1 - 1, SimpleNNApplet.WIDTH * 10 + 2, SimpleNNApplet.HEIGHT * 10 + 2);\r
             g.setColor(Color.gray);\r
-            for (j = 1; j < HEIGHT; j++)\r
-                g.drawLine(RX1, RY1 + 10 * j, RX1 + WIDTH * 10, RY1 + 10 * j); // 横方向区切り\r
-            for (i = 1; i < WIDTH; i++)\r
-                g.drawLine(RX1 + 10 * i, RY1, RX1 + 10 * i, RY1 + HEIGHT * 10); // 縦方向区切り\r
-            for (i = 0; i < INPUT; i++)\r
-                written_in[i] = 0; // 手書き入力データのクリヤ\r
+            for (j = 1; j < SimpleNNApplet.HEIGHT; j++) {\r
+                // 横方向区切り\r
+                g.drawLine(SimpleNNApplet.RX1, SimpleNNApplet.RY1 + 10 * j, SimpleNNApplet.RX1 + SimpleNNApplet.WIDTH * 10, SimpleNNApplet.RY1 + 10 * j);\r
+            }\r
+            for (i = 1; i < SimpleNNApplet.WIDTH; i++) {\r
+                // 縦方向区切り\r
+                g.drawLine(SimpleNNApplet.RX1 + 10 * i, SimpleNNApplet.RY1, SimpleNNApplet.RX1 + 10 * i, SimpleNNApplet.RY1 + SimpleNNApplet.HEIGHT * 10);\r
+            }\r
+            for (i = 0; i < SimpleNNApplet.INPUT; i++) {\r
+                // 手書き入力データのクリヤ\r
+                this.writtenIn[i] = 0;\r
+            }\r
         }\r
-\r
     }\r
 \r
     // 順方向演算のメソッド\r
+    /**\r
+     * <p>\r
+     * 順方向演算を行います。\r
+     * </p>\r
+     * \r
+     * @param input\r
+     *            入力データ。\r
+     * @param output\r
+     *            演算結果の出力データ。\r
+     */\r
     public void forwardNeuralNet(int[] input, float[] output) {\r
-\r
-        float[] out = new float[OUTPUT];\r
-        float[] hidden = new float[HIDDEN];\r
+        float[] out = new float[SimpleNNApplet.OUTPUT];\r
+        float[] hidden = new float[SimpleNNApplet.HIDDEN];\r
 \r
         // 隠れ層出力の計算\r
-        for (int j = 0; j < HIDDEN; j++) {\r
-            hidden[j] = -thresh_h[j];\r
-            for (int i = 0; i < INPUT; i++)\r
-                hidden[j] += input[i] * weight_ih[i][j];\r
-            hidden_out[j] = sigmoid(hidden[j]);\r
+        for (int j = 0; j < SimpleNNApplet.HIDDEN; j++) {\r
+            hidden[j] = -this.thresholdHidden[j];\r
+            for (int i = 0; i < SimpleNNApplet.INPUT; i++) {\r
+                hidden[j] += input[i] * this.weightInHidden[i][j];\r
+            }\r
+            this.hiddenOut[j] = this.sigmoid(hidden[j]);\r
         }\r
 \r
         // 出力層出力の計算\r
-        for (int k = 0; k < OUTPUT; k++) {\r
-            out[k] = -thresh_o[k];\r
-            for (int j = 0; j < HIDDEN; j++)\r
-                out[k] += hidden_out[j] * weight_ho[j][k];\r
-            output[k] = sigmoid(out[k]);\r
+        for (int k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+            out[k] = -this.thresholdOut[k];\r
+            for (int j = 0; j < SimpleNNApplet.HIDDEN; j++) {\r
+                out[k] += this.hiddenOut[j] * this.weightHiddenOut[j][k];\r
+            }\r
+            output[k] = this.sigmoid(out[k]);\r
         }\r
-\r
     }\r
 \r
-    // 逆方向演算のメソッド\r
+    /**\r
+     * <p>\r
+     * 逆方向演算を行います。\r
+     * </p>\r
+     */\r
     public void backwardNeuralNet() {\r
+        int i;\r
+        int j;\r
+        int k;\r
 \r
-        int i, j, k;\r
-\r
-        float[] output_error = new float[OUTPUT]; // 出力層の誤差\r
-        float[] hidden_error = new float[HIDDEN]; // 隠れ層の誤差\r
-\r
-        float temp_error;\r
+        // 出力層の誤差\r
+        float[] outputError = new float[SimpleNNApplet.OUTPUT];\r
+        // 隠れ層の誤差\r
+        float[] hiddenError = new float[SimpleNNApplet.HIDDEN];\r
+        float tempError;\r
 \r
         // 出力層の誤差の計算\r
-        for (k = 0; k < OUTPUT; k++)\r
-            output_error[k] = (teach[k] - recog_out[k]) * recog_out[k] * (1.0f - recog_out[k]);\r
+        for (k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+            outputError[k] = (this.teach[k] - this.recognizeOut[k]) * this.recognizeOut[k] * (1.0f - this.recognizeOut[k]);\r
+        }\r
 \r
         // 隠れ層の誤差の計算\r
-        for (j = 0; j < HIDDEN; j++) {\r
-            temp_error = 0.0f;\r
-            for (k = 0; k < OUTPUT; k++)\r
-                temp_error += output_error[k] * weight_ho[j][k];\r
-            hidden_error[j] = hidden_out[j] * (1.0f - hidden_out[j]) * temp_error;\r
+        for (j = 0; j < SimpleNNApplet.HIDDEN; j++) {\r
+            tempError = 0.0f;\r
+            for (k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+                tempError += outputError[k] * this.weightHiddenOut[j][k];\r
+            }\r
+            hiddenError[j] = this.hiddenOut[j] * (1.0f - this.hiddenOut[j]) * tempError;\r
         }\r
 \r
         // 重みの補正\r
-        for (k = 0; k < OUTPUT; k++)\r
-            for (j = 0; j < HIDDEN; j++)\r
-                weight_ho[j][k] += ALPHA * output_error[k] * hidden_out[j];\r
-        for (j = 0; j < HIDDEN; j++)\r
-            for (i = 0; i < INPUT; i++)\r
-                weight_ih[i][j] += ALPHA * hidden_error[j] * sample_in[i];\r
+        for (k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+            for (j = 0; j < SimpleNNApplet.HIDDEN; j++) {\r
+                this.weightHiddenOut[j][k] += SimpleNNApplet.ALPHA * outputError[k] * this.hiddenOut[j];\r
+            }\r
+        }\r
+        for (j = 0; j < SimpleNNApplet.HIDDEN; j++) {\r
+            for (i = 0; i < SimpleNNApplet.INPUT; i++) {\r
+                this.weightInHidden[i][j] += SimpleNNApplet.ALPHA * hiddenError[j] * this.sampleIn[i];\r
+            }\r
+        }\r
 \r
         // 閾値の補正\r
-        for (k = 0; k < OUTPUT; k++)\r
-            thresh_o[k] -= ALPHA * output_error[k];\r
-        for (j = 0; j < HIDDEN; j++)\r
-            thresh_h[j] -= ALPHA * hidden_error[j];\r
-\r
+        for (k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
+            this.thresholdOut[k] -= SimpleNNApplet.ALPHA * outputError[k];\r
+        }\r
+        for (j = 0; j < SimpleNNApplet.HIDDEN; j++) {\r
+            this.thresholdHidden[j] -= SimpleNNApplet.ALPHA * hiddenError[j];\r
+        }\r
     }\r
 \r
-    // Sigmoid関数を計算するメソッド\r
+    /**\r
+     * <p>\r
+     * シグモイド関数です。\r
+     * </p>\r
+     * \r
+     * @param x\r
+     *            引数。\r
+     * @return 計算結果。\r
+     */\r
     public float sigmoid(float x) {\r
-\r
-        return 1.0f / (1.0f + (float) Math.exp(-BETA * x));\r
-\r
+        return 1.0f / (1.0f + (float) Math.exp(-SimpleNNApplet.BETA * x));\r
     }\r
 \r
-    // 入力文字を認識するメソッド\r
+    /**\r
+     * <p>\r
+     * 手書き入力された文字を認識します。\r
+     * </p>\r
+     */\r
     public void recognizeCharacter() {\r
-\r
-        Graphics g = getGraphics();\r
-        String string;\r
+        Graphics g = this.getGraphics();\r
 \r
         // 順方向演算\r
-        forwardNeuralNet(written_in, recog_out);\r
+        this.forwardNeuralNet(this.writtenIn, this.recognizeOut);\r
 \r
         // 結果の表示\r
-        for (int k = 0; k < OUTPUT; k++) {\r
+        for (int k = 0; k < SimpleNNApplet.OUTPUT; k++) {\r
             g.setColor(Color.black);\r
-            g.drawString(String.valueOf(k) + "である", RX2, RY1 + 20 * k);\r
-            if (recog_out[k] > 0.8f)\r
+            g.drawString(String.valueOf(k) + "である", SimpleNNApplet.RX2, SimpleNNApplet.RY1 + 20 * k);\r
+            if (this.recognizeOut[k] > 0.8f) {\r
                 g.setColor(Color.red);\r
-            else\r
+            } else {\r
                 g.setColor(Color.black);\r
+            }\r
 \r
-            g.fillRect(RX3, RY1 - 10 + 20 * k, (int) (200 * recog_out[k]), 10);\r
-            g.drawString(String.valueOf((int) (100 * recog_out[k] + 0.5f)) + "%", RX3 + (int) (200 * recog_out[k]) + 10, RY1 + 20 * k);\r
+            g.fillRect(SimpleNNApplet.RX3, SimpleNNApplet.RY1 - 10 + 20 * k, (int) (200 * this.recognizeOut[k]), 10);\r
+            g.drawString(String.valueOf((int) (100 * this.recognizeOut[k] + 0.5f)) + "%", SimpleNNApplet.RX3 + (int) (200 * this.recognizeOut[k]) + 10, SimpleNNApplet.RY1 + 20 * k);\r
         }\r
-\r
     }\r
 \r
 }\r
diff --git a/simplenn/src/main/java/jp/gr/java_conf/u6k/simplenn/package.html b/simplenn/src/main/java/jp/gr/java_conf/u6k/simplenn/package.html
new file mode 100644 (file)
index 0000000..6d74204
--- /dev/null
@@ -0,0 +1,3 @@
+<body>\r
+<p>バックプロパゲーションで学習し、単純で簡単に使用することができる、ニューラル・ネットワークの実装を提供します。</p>\r
+</body>
\ No newline at end of file