パーセプトロンでNANDを作る
前回のOR回路から時間が空きましたが、今回はNAND回路をつくります。
NAND回路はANDの結果を反転させたものです。
入力が両方とも「あり」のときのみ「0」が出力されます。
# coding: utf-8 import numpy as np def NAND(x1, x2): x = np.array([x1, x2]) w = np.array([-0.5, -0.5]) b = 0.7 tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1 print("(0, 0) -> " + str(NAND(0, 0))) print("(0, 1) -> " + str(NAND(0, 1))) print("(1, 0) -> " + str(NAND(1, 0))) print("(1, 1) -> " + str(NAND(1, 1)))
実行結果は
(0, 0) -> 1
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
となります。
重みがマイナスになっていますね。これはとても数学的で難しそうです。
なぜ、(1, 1)のときに 0 になるのでしょうか?
(1 × -0.5 + 1 × -0.5) = -1.0 となります。
これに 0.7 を足すと -0.3 となり、0 となります。
他の場合はどうなのでしょう?
(0 × -0.5 + 0 × -0.5) = 0 ですね。
0 に 0.7 を足すと 0.7 であり、1 となります。
(0 × -0.5 + 1 × -0.5) = -0.5 ですね。
-0.5 に 0.7 を足すと 0.2 であり、1 となります。
すごいですね。ちゃんとNAND回路として成立しています!