2.1 パーセプトロンとは
def AND(x1, x2): w1, w2, theta = 0.5, 0.5, 0.7 tmp = x1*w1 + x2*w2 if tmp <= theta: return 0 elif tmp > theta: return 1 print(AND(0, 0)) print(AND(1, 0)) print(AND(0, 1)) print(AND(1, 1))
パラメータのw1、w2、thetaは関数内で初期化し、重み付き入力の総和が閾値を超えると1を返し、それ以外は0を返します。
0 0 0 1
2.3.2 重みとバイアスの導入
>>> import numpy as np >>> x = np.array([0, 1]) # 入力 >>> w = np.array([0.5, 0.5]) # 重み >>> b = -0.7 # バイアス >>> w*x array([0. , 0.5]) >>> np.sum(w*x) 0.5 >>> np.sum(w*x) + b -0.19999999999999996
2.3.3 重みとバイアスによる実装
import numpy as np # ANDゲート def AND(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 # NANDゲート 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 # ORゲート def OR(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) b = -0.2 tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1
AND、NAND、ORは同じ構造のパーセプトロンであり、違いは重みパラーメータの値だけでした。NANDとORゲートの実装においても、ANDとは異なる箇所は重みとバイアスの値を設定する箇所だけになります。
2.5.2 XORゲートの実装
def XOR(x1, x2): s1 = NAND(x1, x2) s2 = OR(x1, x2) y = AND(s1, s2) return y print (XOR(0, 0)) print (XOR(1, 0)) print (XOR(0, 1)) print (XOR(1, 1))
0 1 1 0