In [3]:
# ANDの実装
def func_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(func_AND(0, 0))
print(func_AND(1, 0))
print(func_AND(0, 1))
print(func_AND(1, 1))
In [4]:
import numpy as np
x = np.array([0, 1])
w = np.array([0.5, 0.5])
b = -0.7
print(w*x)
print(np.sum(w*x))
print(np.sum(w*x)+b)
In [5]:
# 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
In [6]:
# NANDゲートを実装
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # 重みとバイアスだけがANDと違う
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
In [7]:
# ORゲートを実装
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5]) # 重みとバイアスだけがANDと違う
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
In [8]:
import numpy as np
import matplotlib.pyplot as plt
# グラフx軸、y軸の表示
fig, ax = plt.subplots()
#-- Set axis spines at 0
for spine in ['left', 'bottom']:
ax.spines[spine].set_position('zero')
# Hide the other spines...
for spine in ['right', 'top']:
ax.spines[spine].set_color('none')
#-- Decorate the spins
arrow_length = 20 # In points
# X-axis arrow
ax.annotate('X1', xy=(1, 0), xycoords=('axes fraction', 'data'),
xytext=(arrow_length, 0), textcoords='offset points',
ha='left', va='center',
arrowprops=dict(arrowstyle='<|-', fc='black'))
# Y-axis arrow
ax.annotate('X2', xy=(0, 1), xycoords=('data', 'axes fraction'),
xytext=(0, arrow_length), textcoords='offset points',
ha='center', va='bottom',
arrowprops=dict(arrowstyle='<|-', fc='black'))
#-- Plot
ax.axis([-1, 2, -0.5, 2])
ax.grid()
# y=0となる組み合わせ
x1_circle = [0]
x2_circle = [0]
# y=1となる組み合わせ
x1_triangle = [0, 1, 1]
x2_triangle = [1, 0, 1]
# yにおける0と1が求められるの領域
x1 = np.linspace(-2,3,4)
x2 = 0.5 - x1
# プロット
plt.plot(x1_circle, x2_circle, 'o')
plt.plot(x1_triangle, x2_triangle, '^')
plt.plot(x1, x2, 'r-')
plt.show()
In [9]:
import matplotlib.pyplot as plt
from matplotlib.image import imread
img = imread('../docs/XOR.png')
plt.figure(figsize=(8,5))
plt.imshow(img)
plt.show()
In [10]:
# 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))
XORは2層のパーセプトロンで表現できた。(文献によっては3層とも呼ぶ場合がある。) 層を重ねたパーセプトロンは多層パーセプトロン(multi-layered perceptron)と呼ばれる。
ネットワーク図は以下のようになる。 左から第0層、第1層、第2層となる。
In [27]:
from graphviz import Digraph
f = Digraph(format="png")
f.attr(rankdir='LR', size='8,5')
f.attr('node', shape='circle')
f.edge('x1', 's1')
f.edge('x1', 's2')
f.edge('x2', 's1')
f.edge('x2', 's2')
f.edge('s1', 'y')
f.edge('s2', 'y')
f.render("../docs/XOR_Perceptron")
img = imread('../docs/XOR_Perceptron.png')
plt.figure(figsize=(10,8))
plt.imshow(img)
plt.show()