第二章 感知机(perceptron)
目录
2.1 简单感知机
1、有两个输入的感知机
输入:x1,x2;
权重:w1,w2;
输出:y
公式如下:
公式(1)
如同大脑中的神经元,感知机的传递方向只能单向传递;
2.2 简单逻辑电路
2.2.1 与门 (AND gate)
1)与门是由两个输入和一个输出的门电路。
2)与门仅在两个输入均为1是输出1,其他时候则输出0;
如下表所示:
eg. (w1,w2,) = (0.5,0.5,0.7)时,
(1) 0 * 0.5 + 0 * 0.5 0.7
(2) 1 * 0.5 + 0 * 0.5 0.7
(3) 0 * 0.5 + 1 * 0.5 0.7
(4) 1 * 0.5 + 1 * 0.5 0.7
3)满足与门的参数的选择有无数个;设定这样的参数后,仅当 x1 和 x2 同时为 1 时,信号的加权总和才会超过给定的阈值 。
2.2.2 与非门 (NAND gate)
1)与非门就是颠倒了与门的输出;
2)与非门仅在两个输入均为1是输出0,其他时候则输出1;
如下表所示:
3)实际上,只要把实现与门的参数值的符号取反,就可以实现与非门。
【eg. (w1,w2,) = (-0.5,-0.5,-0.7)】
2.2.3 或门 (OR gate)
1)或门:只要有一个输入信号是 1 ,输出就为 1 的逻辑电路;
2)真值表如下:
2.2.3 异或门 (XOR gate)
1)异或门也称逻辑异或电路;
2)异或门:仅当x1或 x2 中的一方为 1 时,才会输出 1 (“异或”是拒绝其他的意思);
3)真值表如下:
2.3 代码实现
2.3.1 与门代码
1)简单实现
def AND(x1, x2):
w1,w2,theta = 0.5,0.5,0.7 #初始化参数
tmp = x1 * w1 + x2 * w2
if tmp <= theta: #当输入的加权总和超过阈值时返回1,否则返回0;
return 0
elif tmp > theta:
return 1
2)导入权重与偏置
(1)把 公式(1) 中的 换成 -b 后,可用下式来表示感知机
公式(2)
b:偏置; w:权重; 参数:b、w;
(若 ,此时为一条直线)
(2)与门代码实现可用另一种方法实现:(这种方法更加简洁,运用了Numpy的矩阵运算)
def AND(x1, x2):
#Numpy数组
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.7
tmp = np.sum(w*x) + b #w*x:对位相乘,结果为一个数组;
#np.sum(w*x):计算相乘后的各个元素的总和;
if tmp <= 0:
return 0
else:
return 1
2.3.2 与非门代码
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
2.3.3 或门代码
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
2.3.4 异或门代码
1)由于感知机的局限性就在于它只能表示由一条直线分割的空间(即线性空间),而异或门为非线性问题,故其表示的空间则为曲线分割而成的非线性空间,所以单层感知机无法表示异或门;
2)组合感知机(叠加层)可以实现异或门,即可通过组合与门、与非门、或门来实现异或门;
3)通过组合后的真值表 可如下表示:
4)代码实现
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
总结:与门、与非门、或门是单层感知机;异或门是 2 层感知机;叠加了多层的感知机也称为多层感知机。