感知机是具有输入和输出的算法。给定一个输入之后,将输出一个既定的值。
上图展示了给定三个输入 x_1、x_2 和 x_3 以及一个可以计算输出值的神经元的感知机算法。Rosenblatt 通过引入权重的概念介绍这一简单的规则,用于生成输出值。权重通常是表示输入对应于输出的重要性的实数。上图中的神经元将会得到两个可能的结果,0 或 1,是由每个输入的加权和 ∑wjxj 决定的大于或小于阈值的结果。因此,感知机的主要思想就是去学到一些可以决定神经元兴奋还是抑制的与输入特征相乘的权重 w。我们可以写出一个如下的数学表达式
下面用感知机来简要表达逻辑门电路。
- 与门
x1 | x2 | y |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
input = np.array([x1, x2])
weight = np.array([w1, w2])
res = np.sum(input * weight)
if res > theta:
return 1
else:
return 0
- 或门
x1 | x2 | y |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
def OR(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.2
input = np.array([x1, x2])
weight = np.array([w1, w2])
res = np.sum(input * weight)
if res > theta:
return 1
else:
return 0
- 与非门
x1 | x2 | y |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 1 |
def NAND(x1, x2):
w1, w2, theta = -0.5, -0.5, -0.7
input = np.array([x1, x2])
weight = np.array([w1, w2])
res = np.sum(input * weight)
if res > theta:
return 1
else:
return 0
上面几个逻辑门实现都是可以线性表示,也就是像公式y = (w1 * x1 + w2 * x2) + b
一样。而在实现异或门时却无法用单层感知机来表达,这时候就需要叠加感知机来实现。
- 异或门
x1 | x2 | y |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
因为异或门不像上述一样,其是非线性空间来表示,所以采用叠加单层感知机来实现,用与非门
和或门
的输出结果作为与门
的输入再输出结果则就为异或门。下面s1为与非门
输出结果,s2为或门
输出结果。
x1 | x2 | s1 | s2 | y |
---|---|---|---|---|
1 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
0 | 0 | 1 | 0 | 1 |
由上述结果可知结果,用python表达为:
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
return AND(s1, s2)