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
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
* 教師信号。\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