パーセプトロンで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回路として成立しています!

システム開発

Posted by @erestage