基本概念介绍
感知器接受多个信号输入,输出一个信号。每个信号就像电流或河流一样,流或者不流过。因此,每个感知器只有2个值:
- 0:不流
- 1:流
下图展示了一个有2个输入信号的感知器:
- x1,x2代表输入信号
- w1,w2代表输入信号的权重
- b代表偏置
- 圆圈被称为”神经元”或”节点
输入信号被送往神经元的时候,会分别乘以固定的权重,然后的到一个值,这个值在和偏置值相加,最终得到一个输入的值,如果这个值大于0,则输出1,否则输出0。当输出值为1的时候,我们称神经元激活
权重和偏置有不一样的意义的:
- 权重:代表输入信号的重要程度的参数
- 偏置:代表神经元被激活的容易程度的参数
# 一个感知器的实现(2个输入信号)
def perceptron(x1,x2,w1,w2,b):
return 1 if x1*w1+x2*w2+b > 0 else 0
感知器的实际应用
用感知器来实现与,或,与非,异或.
输入值 | 与 | 与非 | 或 | 异或 |
---|---|---|---|---|
0,0 | 0 | 1 | 0 | 0 |
0,1 | 0 | 1 | 1 | 1 |
1,0 | 0 | 1 | 1 | 1 |
1,1 | 1 | 0 | 1 | 0 |
先看:与,与非,或的实现
# 与的实现
def AND(x1,x2):
w1 = w2 = 0.5
b = -0.7
return perceptron(x1,x2,w1,w2,b)
# 与非的实现
def NAND(x1,x2):
w1 = w2 = -0.5
b = 0.7
return perceptron(x1,x2,w1,w2,b)
# 或的实现
def OR(x1,x2):
w1 = w2 = 0.5
b = -0.4
return perceptron(x1,x2,w1,w2,b)
# 单一的感知器并不能够实现异或操作。需要通过叠加感知器来实现异或
def XOR(x1,x2):
a = NAND(x1,x2)
b = OR(X1,x2)
return AND(a,b)
从上述代码中可以看出,只要调整权重和偏置,就可以实现and,nand,or。 比如and,我调整权重为0.4,0.4,偏置调整为 -0.5 也能实现.
Numpy的导入
上述的列子只用到了2个输入信号,实际上,感知器支持多个信号输入。因此,导入numpy可以很快速的解决这个问题
import numpy as np
def perceptron(x:np.ndarray,w:np.ndarray,b):
return 1 if np.sum(x*w)+b > 0 else 0
def AND(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.6
return perceptron(x,w,b)