为什么感知器代码⽆法完成异或功能

异或问题的真值表如下:

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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章