感知机perceptron算法是Frank Rosenblatt于1957年提出,它是神经网络和深度学习的起源算法。
感知机接受多个信号,输出一个信号,具体更多原理,请参见这篇博文
三种门电路的感知机结构如上图,均为2输入单输出,
(1) y = { 0 , x 1 w 1 + x 2 w 2 + b ≤ 0 1 , x 1 w 1 + x 2 w 2 + b > 0 y=\left\{ \begin{aligned} 0&,&x_1w_1+x_2w_2+b\leq0\\ 1&,&x_1w_1+x_2w_2+b>0\\ \end{aligned} \right.\tag1 y={01,,x1w1+x2w2+b≤0x1w1+x2w2+b>0(1)
(1)式描述的是一条直线把二维空间线性地分割为两部分。
实际上,如果引入激活函数的概念,则感知机使用的激活函数是阶跃函数:
h ( x ) = { 0 , x ≤ 0 1 , x > 0 h(x)=\left\{ \begin{aligned} 0,x\leq0\\ 1,x>0\\ \end{aligned} \right. h(x)={0,x≤01,x>0
感知机使用阶跃函数作激活函数,而只要把激活函数换成其他函数(sigmoid或Relu),就得到了NN.
真值表
x 1 x_1 x1 | x 2 x_2 x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
代入(1)则有:
{ b ≤ 0 w 2 + b ≤ 0 w 1 + b ≤ 0 w 1 + w 2 + b > 0 \left\{ \begin{aligned} b\leq0\\ w_2+b\leq0\\ w_1+b\leq0\\ w_1+w_2+b>0 \end{aligned} \right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧b≤0w2+b≤0w1+b≤0w1+w2+b>0
满足这组关系的 w 1 , w 2 , b {w_1,w_2,b} w1,w2,b很多,我们取0.5,0.5,-0.7
import numpy as np
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
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
真值表
x 1 x_1 x1 | x 2 x_2 x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
代入(1)则有:
{ b ≤ 0 w 2 + b > 0 w 1 + b > 0 w 1 + w 2 + b > 0 \left\{ \begin{aligned} b\leq0\\ w_2+b>0\\ w_1+b>0\\ w_1+w_2+b>0 \end{aligned} \right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧b≤0w2+b>0w1+b>0w1+w2+b>0
满足这组关系的 w 1 , w 2 , b {w_1,w_2,b} w1,w2,b很多,我们取0.5,0.5,-0.2
import numpy as np
def OR(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))
真值表
x 1 x_1 x1 | x 2 x_2 x2 | y |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
代入(1)则有:
{ b > 0 w 2 + b > 0 w 1 + b > 0 w 1 + w 2 + b ≤ 0 \left\{ \begin{aligned} b>0\\ w_2+b>0\\ w_1+b>0\\ w_1+w_2+b\leq0 \end{aligned} \right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧b>0w2+b>0w1+b>0w1+w2+b≤0
满足这组关系的 w 1 , w 2 , b {w_1,w_2,b} w1,w2,b很多,我们取-0.5,-0.5,0.7
import numpy as np
def NAND(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
print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))
真值表
x 1 x_1 x1 | x 2 x_2 x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
学习数电时我们知道,简单门电路的组合可以实现复杂的门电路。所以:
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))
pycharm脚本运行后输出结果:
异或门是一个两层的感知机: