感知机是什么
感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。像电流流过导线,向前方输送电子一样,感知机的信号也会形成流,向前方输送信息。但是,和实际的电流不同的是,感知机的信号只有“流/ 不流”(1/0)两种取值。
下图是一个接收两个输入信号的感知机的例子。x1、x2是输入信号,y 是输出信号,w1、w2是权重(w weight 的首字母)。图中的○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重(w1x1、w2x2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也为“神经元被激活”。这里将这个界限值称为阈值,用符号θ 表示。

感知机的运行原理只有这些!把上述内容用数学式来表示如下:
使用感知机简单模拟电路上的与门
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7 #这是参数
tmp = w1 * x1 + w2 * x2
if tmp > theta:
return 1
else:
return 0
print(AND(1, 1))
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
1
0
0
0
首先把上式的θ 换成−b,于是就可以下面的式子来表示感知机的行为。
模拟一个感知机
import numpy as np
x=np.array([0,1])
w=np.array([0.5,0.5])
b=-0.7
print(np.sum(x*w))
print(np.sum(x*w)+b) #python有浮点数误差
0.5
-0.19999999999999996
使用权重和偏置实现一个与门
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 1
else:
return 0
print(AND(1, 1))
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
继续实现与非门和或门
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 1
else:
return 0
print(NAND(1, 1))
print(NAND(0, 0))
print(NAND(1, 0))
print(NAND(0, 1))
0
1
1
1
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 1
else:
return 0
print(OR(0,0))
print(OR(1,1))
print(OR(1,0))
print(OR(0,1))
0
1
1
1
感知机的局限性——无法实现异或
解决方法:多个门电路的组合,如下图

异或的实现
def XOR(x1,x2):
s1=NAND(x1,x2)
s2=OR(x1,x2)
return AND(s1,s2)
print(XOR(0,0))
print(XOR(1,1))
print(XOR(1,0))
print(XOR(0,1))
0
0
1
1
异或门的实现可以抽象成一个两层感知机

网友评论