感知机
感知机是什么呢?
感知机是一个接受输入多个信号输出一个信号的模型,如图
x1w1+x2w2其中输出只有两个值一个是0一个是1,当x1w1+x2w2输出大于一个阈值的时候输出1,小于则输出0
感知机的实现
基于python实现逻辑电路
实现AND_gate
现在让我们考虑用感知机来解决简单的问题。这里首先以逻辑电路为题材来思考一下与门(AND gate)。与门是有两个输入和一个输出的门电路。
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
if __name__ == '__main__':
print(AND(0,0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))
实现AND_no_gate
要表示与非门,可以用(w1,w2,θ)=(-0.5,-0.5,-0.7)这样的组合(其他的组合也是无限存在的)。实际上,只要把实现与门的参数值的符号取反,就可以实现与非门。
def AND_no(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
if __name__ == '__main__':
print(AND_no(0,0))
print(AND_no(1, 0))
print(AND_no(0, 1))
print(AND_no(1, 1))
导入权重与偏置
刚才的与门的实现比较直接、容易理解,但是考虑到以后的事情,我们将其修改为另外一种实现形式。在此之前,首先把式的 θ 换成 -b,于是就可以用来表示感知机的行为。b 称为偏置,w1 和 w2 称为权重。
使用权重和偏置的实现
使用权重和偏置,可以像下面这样实现与门。
import numpy as np
def AND(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.7
y = np.sum(x*w)+b
if y<=0:
return 0
else:
return 1
def NAND(x1,x2):
x = np.array([x1,x2])
w = np.array([-0.5,-0.5])
b = 0.7
y = np.sum(x*w)+b
if y<=0:
return 0
else:
return 1
def OR(x1, x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.2
y = np.sum(w*x)+b
if y<=0:
return 0
else:
return 1
if __name__ == '__main__':
print(AND(1,1))
print(NAND(0,0))
print(OR(1,1))
单层感知机的局限性
无法处理非线性问题如异或门
多层感知机实现异或门
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
这样,异或门的实现就完成了。下面我们试着用感知机的表示方法(明确地显示神经元)来表示这个异或门,结果如图
- 感知机是具有输入和输出的算法。
- 给定一个输入后,将输出一个既定的值。
- 感知机将权重和偏置设定为参数。
- 使用感知机可以表示与门和或门等逻辑电路。
- 异或门无法通过单层感知机来表示。
- 使用2层感知机可以表示异或门。
- 单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。
- 多层感知机(在理论上)可以表示计算机。