異或問題的真值表如下:
X1 | X2 | OUT |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
就是說兩個不一樣,就是真(1),如果把異或問題表現爲二維的分佈,就是這樣
這樣就很直觀的把異或問題表現爲點在二維平面上分佈的問題。
感知機的作用就是就是在一個超平面上畫一條線,線的一邊爲一類。如果感知機只有兩個輸入,就是在二維平面上,劃線然後分類。
如上圖所示,在”異或“問題上找不到一條直線能把X和O分開,這就是說這是一個不能用直線分類的問題,這類問題叫非線性問題。同理,“同或”問題一樣不能解決。如果是“與”“或”問題就是可以解決的。
感知器的代碼實現:
#!/usr/bin/env python3
import numpy as np
samples_and = [
[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[1, 1, 1],
]
samples_or = [
[0, 0, 0],
[1, 0, 1],
[0, 1, 1],
[1, 1, 1],
]
samples_xor = [
[0, 0, 0],
[1, 0, 1],
[0, 1, 1],
[1, 1, 0],
]
def perceptron(samples):
w = np.array([1, 2])
b = 0
a = 1
for i in range(10):
for j in range(4):
x = np.array(samples[j][:2])
y = 1 if np.dot(w, x) + b > 0 else 0
d = np.array(samples[j][2])
delta_b = a*(d-y)
delta_w = a*(d-y)*x
print('epoch {} sample {} [{} {} {} {} {} {} {}]'.format(
i, j, w[0], w[1], b, y, delta_w[0], delta_w[1], delta_b
))
w = w + delta_w
b = b + delta_b
if __name__ == '__main__':
print('logical and')
perceptron(samples_and)
print('logical or')
perceptron(samples_or)
print('logical xor')
perceptron(samples_xor)
運行代碼後的結果:
logical and
epoch 0 sample 0 [1 2 0 0 0 0 0]
epoch 0 sample 1 [1 2 0 1 -1 0 -1]
epoch 0 sample 2 [0 2 -1 1 0 -1 -1]
epoch 0 sample 3 [0 1 -2 0 1 1 1]
epoch 1 sample 0 [1 2 -1 0 0 0 0]
epoch 1 sample 1 [1 2 -1 0 0 0 0]
epoch 1 sample 2 [1 2 -1 1 0 -1 -1]
epoch 1 sample 3 [1 1 -2 0 1 1 1]
epoch 2 sample 0 [2 2 -1 0 0 0 0]
epoch 2 sample 1 [2 2 -1 1 -1 0 -1]
epoch 2 sample 2 [1 2 -2 0 0 0 0]
epoch 2 sample 3 [1 2 -2 1 0 0 0]
epoch 3 sample 0 [1 2 -2 0 0 0 0]
epoch 3 sample 1 [1 2 -2 0 0 0 0]
epoch 3 sample 2 [1 2 -2 0 0 0 0]
epoch 3 sample 3 [1 2 -2 1 0 0 0]
epoch 4 sample 0 [1 2 -2 0 0 0 0]
epoch 4 sample 1 [1 2 -2 0 0 0 0]
epoch 4 sample 2 [1 2 -2 0 0 0 0]
epoch 4 sample 3 [1 2 -2 1 0 0 0]
epoch 5 sample 0 [1 2 -2 0 0 0 0]
epoch 5 sample 1 [1 2 -2 0 0 0 0]
epoch 5 sample 2 [1 2 -2 0 0 0 0]
epoch 5 sample 3 [1 2 -2 1 0 0 0]
epoch 6 sample 0 [1 2 -2 0 0 0 0]
epoch 6 sample 1 [1 2 -2 0 0 0 0]
epoch 6 sample 2 [1 2 -2 0 0 0 0]
epoch 6 sample 3 [1 2 -2 1 0 0 0]
epoch 7 sample 0 [1 2 -2 0 0 0 0]
epoch 7 sample 1 [1 2 -2 0 0 0 0]
epoch 7 sample 2 [1 2 -2 0 0 0 0]
epoch 7 sample 3 [1 2 -2 1 0 0 0]
epoch 8 sample 0 [1 2 -2 0 0 0 0]
epoch 8 sample 1 [1 2 -2 0 0 0 0]
epoch 8 sample 2 [1 2 -2 0 0 0 0]
epoch 8 sample 3 [1 2 -2 1 0 0 0]
epoch 9 sample 0 [1 2 -2 0 0 0 0]
epoch 9 sample 1 [1 2 -2 0 0 0 0]
epoch 9 sample 2 [1 2 -2 0 0 0 0]
epoch 9 sample 3 [1 2 -2 1 0 0 0]
logical or
epoch 0 sample 0 [1 2 0 0 0 0 0]
epoch 0 sample 1 [1 2 0 1 0 0 0]
epoch 0 sample 2 [1 2 0 1 0 0 0]
epoch 0 sample 3 [1 2 0 1 0 0 0]
epoch 1 sample 0 [1 2 0 0 0 0 0]
epoch 1 sample 1 [1 2 0 1 0 0 0]
epoch 1 sample 2 [1 2 0 1 0 0 0]
epoch 1 sample 3 [1 2 0 1 0 0 0]
epoch 2 sample 0 [1 2 0 0 0 0 0]
epoch 2 sample 1 [1 2 0 1 0 0 0]
epoch 2 sample 2 [1 2 0 1 0 0 0]
epoch 2 sample 3 [1 2 0 1 0 0 0]
epoch 3 sample 0 [1 2 0 0 0 0 0]
epoch 3 sample 1 [1 2 0 1 0 0 0]
epoch 3 sample 2 [1 2 0 1 0 0 0]
epoch 3 sample 3 [1 2 0 1 0 0 0]
epoch 4 sample 0 [1 2 0 0 0 0 0]
epoch 4 sample 1 [1 2 0 1 0 0 0]
epoch 4 sample 2 [1 2 0 1 0 0 0]
epoch 4 sample 3 [1 2 0 1 0 0 0]
epoch 5 sample 0 [1 2 0 0 0 0 0]
epoch 5 sample 1 [1 2 0 1 0 0 0]
epoch 5 sample 2 [1 2 0 1 0 0 0]
epoch 5 sample 3 [1 2 0 1 0 0 0]
epoch 6 sample 0 [1 2 0 0 0 0 0]
epoch 6 sample 1 [1 2 0 1 0 0 0]
epoch 6 sample 2 [1 2 0 1 0 0 0]
epoch 6 sample 3 [1 2 0 1 0 0 0]
epoch 7 sample 0 [1 2 0 0 0 0 0]
epoch 7 sample 1 [1 2 0 1 0 0 0]
epoch 7 sample 2 [1 2 0 1 0 0 0]
epoch 7 sample 3 [1 2 0 1 0 0 0]
epoch 8 sample 0 [1 2 0 0 0 0 0]
epoch 8 sample 1 [1 2 0 1 0 0 0]
epoch 8 sample 2 [1 2 0 1 0 0 0]
epoch 8 sample 3 [1 2 0 1 0 0 0]
epoch 9 sample 0 [1 2 0 0 0 0 0]
epoch 9 sample 1 [1 2 0 1 0 0 0]
epoch 9 sample 2 [1 2 0 1 0 0 0]
epoch 9 sample 3 [1 2 0 1 0 0 0]
logical xor
epoch 0 sample 0 [1 2 0 0 0 0 0]
epoch 0 sample 1 [1 2 0 1 0 0 0]
epoch 0 sample 2 [1 2 0 1 0 0 0]
epoch 0 sample 3 [1 2 0 1 -1 -1 -1]
epoch 1 sample 0 [0 1 -1 0 0 0 0]
epoch 1 sample 1 [0 1 -1 0 1 0 1]
epoch 1 sample 2 [1 1 0 1 0 0 0]
epoch 1 sample 3 [1 1 0 1 -1 -1 -1]
epoch 2 sample 0 [0 0 -1 0 0 0 0]
epoch 2 sample 1 [0 0 -1 0 1 0 1]
epoch 2 sample 2 [1 0 0 0 0 1 1]
epoch 2 sample 3 [1 1 1 1 -1 -1 -1]
epoch 3 sample 0 [0 0 0 0 0 0 0]
epoch 3 sample 1 [0 0 0 0 1 0 1]
epoch 3 sample 2 [1 0 1 1 0 0 0]
epoch 3 sample 3 [1 0 1 1 -1 -1 -1]
epoch 4 sample 0 [0 -1 0 0 0 0 0]
epoch 4 sample 1 [0 -1 0 0 1 0 1]
epoch 4 sample 2 [1 -1 1 0 0 1 1]
epoch 4 sample 3 [1 0 2 1 -1 -1 -1]
epoch 5 sample 0 [0 -1 1 1 0 0 -1]
epoch 5 sample 1 [0 -1 0 0 1 0 1]
epoch 5 sample 2 [1 -1 1 0 0 1 1]
epoch 5 sample 3 [1 0 2 1 -1 -1 -1]
epoch 6 sample 0 [0 -1 1 1 0 0 -1]
epoch 6 sample 1 [0 -1 0 0 1 0 1]
epoch 6 sample 2 [1 -1 1 0 0 1 1]
epoch 6 sample 3 [1 0 2 1 -1 -1 -1]
epoch 7 sample 0 [0 -1 1 1 0 0 -1]
epoch 7 sample 1 [0 -1 0 0 1 0 1]
epoch 7 sample 2 [1 -1 1 0 0 1 1]
epoch 7 sample 3 [1 0 2 1 -1 -1 -1]
epoch 8 sample 0 [0 -1 1 1 0 0 -1]
epoch 8 sample 1 [0 -1 0 0 1 0 1]
epoch 8 sample 2 [1 -1 1 0 0 1 1]
epoch 8 sample 3 [1 0 2 1 -1 -1 -1]
epoch 9 sample 0 [0 -1 1 1 0 0 -1]
epoch 9 sample 1 [0 -1 0 0 1 0 1]
epoch 9 sample 2 [1 -1 1 0 0 1 1]
epoch 9 sample 3 [1 0 2 1 -1 -1 -1]