代码实现逻辑与、或的感知器
感知器(有些成为感知机)属于一种简单的神经元,在神经网络中通常感知机与神经元的区别就是**函数的不同,一般常用的**函数是sigmoid函数,感知机中为step function(阶跃函数)
给出一组矩阵,利用神经网络的反向传播功能(BP)来训练一种能够实现逻辑与、或的感知器(最重要的是训练权重w和偏置b)
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 perception(samples):
#权重
w=np.array([1,2])
#偏置
b=0
a=1
#训练10遍
for i in range(10):
for j in range(4):
#矩阵的第j行的前两个数值
x=np.array(samples[j][:2])
#将未**的值输入sigmoid函数 dot:向量的点乘运算
if np.dot(w,x)+b >0:
y=1
else:
y=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:')
perception(samples_and)
print('logical or:')
perception(samples_or)
print('logical xor:')
perception(samples_xor)
逻辑与的输出:
可以看出从第三次训练后,通过神经网络的BP,权重w0,w1和b已经趋于稳定
w0=1,w1=2,b=-2
逻辑或的输出:
对于逻辑或,从输出样本的第一次训练之后,对权重和偏置的BP趋于稳定,
w0=1,w1=2,b=0
逻辑异或的输出:
对于异或数据的训练,每一次反馈得到的w0,w1和b都不同,可以得出感知器不能实现异或的功能,也就是不能训练处得到实现异或功能的模型。
解释为什么这⾥的代码⽆法完成带异或功能的感知器
逻辑与和逻辑或都是线性的模型,它的输入和输出都是在一条直线上,这条直线将平面区域分割为两份,在直线的两端分别满足大于和小于0,在直线上满足等于0,也就是说它是线性的。
而逻辑异或它在平面区域中是两条交叉的直线,也就是说它是线性不可分的,如下图所示