与门(AND Gate)
逻辑规则:全 1 出 1,有 0 出 0
| 输入 A | 输入 B | 输出 Y = A · B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
import numpy as np
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
return 1
print(AND(0, 0)) # 0
print(AND(1, 0)) # 0
print(AND(0, 1)) # 0
print(AND(1, 1)) # 1
与非门(NAND Gate)
逻辑规则:全 1 出 0,有 0 出 1(与门的取反)
| 输入 A | 输入 B | 输出 Y = |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
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
return 1
print(NAND(0, 0)) # 1
print(NAND(1, 0)) # 1
print(NAND(0, 1)) # 1
print(NAND(1, 1)) # 0
或门(OR Gate)
逻辑规则:有 1 出 1,全 0 出 0
| 输入 A | 输入 B | 输出 Y = A + B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 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 0
return 1
print(OR(0, 0)) # 0
print(OR(1, 0)) # 1
print(OR(0, 1)) # 1
print(OR(1, 1)) # 1
异或门(XOR Gate)
逻辑规则:相同出 0,相异出 1
| 输入 A | 输入 B | 输出 Y = A |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
def XOR(x, y):
s1 = NAND(x, y)
s2 = OR(x, y)
y = AND(s1, s2)
return y
print(XOR(0, 0)) # 0
print(XOR(1, 0)) # 1
print(XOR(0, 1)) # 1
print(XOR(1, 1)) # 0
感知机(perceptron)
- 感知机只能表示由一条直线分割的空间(线性空间)
- 单层感知机不能实现异或门
- 2层感知机可以实现异或门
- XOR(x, y) = AND(NAND(x, y), OR(x, y))