二、感知器
1.感知机
接收多个输入信号,输出一个信号,有“流/不流”(1/0)两种取值。在本书中,0对应“不传递信号”,1对应“传递信号”。其中,x1、x2是输入信号,y是输出信号,w1、w2是权重(w是weight的首字母)。图中的○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重(w1x1、w2x2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被**”。这里将这个界限值称为阈值,用符号θ表示。
w1和w2是控制输入信号的重要性的参数,而偏置是调整神经元被**的容易程度(输出信号为1的程度)的参数。比如,若b为−0.1,则只要输入信号的加权总和超过0.1,神经元就会被**。
2.简单实现
与门
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7#权重,偏置
tmp = x1w1 + x2w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
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
与非门
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # 仅权重和偏置与AND不同
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
或门
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5]) # 仅权重和偏置与AND不同
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
异或,非线性,多层
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
输出
XOR(0, 0) # 输出0
XOR(1, 0) # 输出1
XOR(0, 1) # 输出1
XOR(1, 1) # 输出0