OSDN Git Service

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/simplenn/trunk@17 dd34cd95-496f...
authoru6k <u6k@dd34cd95-496f-4e97-851c-65f59ff6709a>
Sun, 20 Apr 2008 17:25:10 +0000 (17:25 +0000)
committeru6k <u6k@dd34cd95-496f-4e97-851c-65f59ff6709a>
Sun, 20 Apr 2008 17:25:10 +0000 (17:25 +0000)
simplenn/src/main/java/jp/gr/java_conf/u6k/simplenn/SimpleNN.java

index fa265b2..2bf37c7 100644 (file)
@@ -150,22 +150,22 @@ public final class SimpleNN {
     public SimpleNN() {\r
         // TODO ちゃんとランダムに初期化する。\r
         try {\r
-            BufferedReader reader = new BufferedReader(new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("random.txt")));\r
+            BufferedReader r = new BufferedReader(new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("random.txt")));\r
             try {\r
-                for (int j = 0; j < SimpleNN.HIDDEN; j++) {\r
-                    this.thresholdHidden[j] = Double.parseDouble(reader.readLine()) - SimpleNN.VALUE_HALF;\r
-                    for (int i = 0; i < SimpleNN.INPUT; i++) {\r
-                        this.weightInHidden[i][j] = Double.parseDouble(reader.readLine()) - SimpleNN.VALUE_HALF;\r
+                for (int i = 0; i < SimpleNN.HIDDEN; i++) {\r
+                    this.thresholdHidden[i] = Double.parseDouble(r.readLine()) - SimpleNN.VALUE_HALF;\r
+                    for (int j = 0; j < SimpleNN.INPUT; j++) {\r
+                        this.weightInHidden[j][i] = Double.parseDouble(r.readLine()) - SimpleNN.VALUE_HALF;\r
                     }\r
                 }\r
-                for (int k = 0; k < SimpleNN.OUTPUT; k++) {\r
-                    this.thresholdOut[k] = Double.parseDouble(reader.readLine()) - SimpleNN.VALUE_HALF;\r
+                for (int i = 0; i < SimpleNN.OUTPUT; i++) {\r
+                    this.thresholdOut[i] = Double.parseDouble(r.readLine()) - SimpleNN.VALUE_HALF;\r
                     for (int j = 0; j < SimpleNN.HIDDEN; j++) {\r
-                        this.weightHiddenOut[j][k] = Double.parseDouble(reader.readLine()) - SimpleNN.VALUE_HALF;\r
+                        this.weightHiddenOut[j][i] = Double.parseDouble(r.readLine()) - SimpleNN.VALUE_HALF;\r
                     }\r
                 }\r
             } finally {\r
-                reader.close();\r
+                r.close();\r
             }\r
         } catch (IOException e) {\r
             e.printStackTrace();\r
@@ -189,21 +189,21 @@ public final class SimpleNN {
         double[] hidden = new double[SimpleNN.HIDDEN];\r
 \r
         // 隠れ層出力の計算\r
-        for (int j = 0; j < SimpleNN.HIDDEN; j++) {\r
-            hidden[j] = -this.thresholdHidden[j];\r
-            for (int i = 0; i < SimpleNN.INPUT; i++) {\r
-                hidden[j] += input[i] * this.weightInHidden[i][j];\r
+        for (int i = 0; i < SimpleNN.HIDDEN; i++) {\r
+            hidden[i] = -this.thresholdHidden[i];\r
+            for (int j = 0; j < SimpleNN.INPUT; j++) {\r
+                hidden[i] += input[j] * this.weightInHidden[j][i];\r
             }\r
-            hiddenOutput[j] = this.sigmoid(hidden[j]);\r
+            hiddenOutput[i] = this.sigmoid(hidden[i]);\r
         }\r
 \r
         // 出力層出力の計算\r
-        for (int k = 0; k < SimpleNN.OUTPUT; k++) {\r
-            out[k] = -this.thresholdOut[k];\r
+        for (int i = 0; i < SimpleNN.OUTPUT; i++) {\r
+            out[i] = -this.thresholdOut[i];\r
             for (int j = 0; j < SimpleNN.HIDDEN; j++) {\r
-                out[k] += hiddenOutput[j] * this.weightHiddenOut[j][k];\r
+                out[i] += hiddenOutput[j] * this.weightHiddenOut[j][i];\r
             }\r
-            output[k] = this.sigmoid(out[k]);\r
+            output[i] = this.sigmoid(out[i]);\r
         }\r
     }\r
 \r
@@ -222,48 +222,43 @@ public final class SimpleNN {
      *            教師信号。\r
      */\r
     public void backwardNeuralNet(double[] input, double[] output, double[] hiddenOutput, double[] teach) {\r
-        int i;\r
-        int j;\r
-        int k;\r
-\r
         // 出力層の誤差\r
         double[] outputError = new double[SimpleNN.OUTPUT];\r
         // 隠れ層の誤差\r
         double[] hiddenError = new double[SimpleNN.HIDDEN];\r
-        double tempError;\r
 \r
         // 出力層の誤差の計算\r
-        for (k = 0; k < SimpleNN.OUTPUT; k++) {\r
-            outputError[k] = (teach[k] - output[k]) * output[k] * (1.0 - output[k]);\r
+        for (int i = 0; i < SimpleNN.OUTPUT; i++) {\r
+            outputError[i] = (teach[i] - output[i]) * output[i] * (1.0 - output[i]);\r
         }\r
 \r
         // 隠れ層の誤差の計算\r
-        for (j = 0; j < SimpleNN.HIDDEN; j++) {\r
-            tempError = 0;\r
-            for (k = 0; k < SimpleNN.OUTPUT; k++) {\r
-                tempError += outputError[k] * this.weightHiddenOut[j][k];\r
+        for (int i = 0; i < SimpleNN.HIDDEN; i++) {\r
+            double err = 0;\r
+            for (int j = 0; j < SimpleNN.OUTPUT; j++) {\r
+                err += outputError[j] * this.weightHiddenOut[i][j];\r
             }\r
-            hiddenError[j] = hiddenOutput[j] * (1.0 - hiddenOutput[j]) * tempError;\r
+            hiddenError[i] = hiddenOutput[i] * (1.0 - hiddenOutput[i]) * err;\r
         }\r
 \r
         // 重みの補正\r
-        for (k = 0; k < SimpleNN.OUTPUT; k++) {\r
-            for (j = 0; j < SimpleNN.HIDDEN; j++) {\r
-                this.weightHiddenOut[j][k] += SimpleNN.ALPHA * outputError[k] * hiddenOutput[j];\r
+        for (int i = 0; i < SimpleNN.OUTPUT; i++) {\r
+            for (int j = 0; j < SimpleNN.HIDDEN; j++) {\r
+                this.weightHiddenOut[j][i] += SimpleNN.ALPHA * outputError[i] * hiddenOutput[j];\r
             }\r
         }\r
-        for (j = 0; j < SimpleNN.HIDDEN; j++) {\r
-            for (i = 0; i < SimpleNN.INPUT; i++) {\r
-                this.weightInHidden[i][j] += SimpleNN.ALPHA * hiddenError[j] * input[i];\r
+        for (int i = 0; i < SimpleNN.HIDDEN; i++) {\r
+            for (int j = 0; j < SimpleNN.INPUT; j++) {\r
+                this.weightInHidden[j][i] += SimpleNN.ALPHA * hiddenError[i] * input[j];\r
             }\r
         }\r
 \r
         // 閾値の補正\r
-        for (k = 0; k < SimpleNN.OUTPUT; k++) {\r
-            this.thresholdOut[k] -= SimpleNN.ALPHA * outputError[k];\r
+        for (int i = 0; i < SimpleNN.OUTPUT; i++) {\r
+            this.thresholdOut[i] -= SimpleNN.ALPHA * outputError[i];\r
         }\r
-        for (j = 0; j < SimpleNN.HIDDEN; j++) {\r
-            this.thresholdHidden[j] -= SimpleNN.ALPHA * hiddenError[j];\r
+        for (int i = 0; i < SimpleNN.HIDDEN; i++) {\r
+            this.thresholdHidden[i] -= SimpleNN.ALPHA * hiddenError[i];\r
         }\r
     }\r
 \r