一、感知机是什么?
感知机是一种算法,把多个输入信号按一定的逻辑关系进行输出(一个输出),单层感知机公式如下:
通过调整权重和阈值
,可以用来实现各种逻辑电路。
二、如何用单层感知机实现各种逻辑电路?
比如或门:设置权重和阈值 w1=0.5,w2=0.5,theta=0.3即可,这个值不唯一,自己试试,无限多种组合方式。
# 或门
# w1=0.5,w2=0.5,theta=0.3
import numpy as np
def myOr(x1, x2):
w = np.array([0.5, 0.5])
theta = 0.3
x = np.array([x1, x2])
if np.sum(x*w) > theta:
return 1
else:
return 0
def main():
print("This is the result of OR:")
print("0 OR 0: ", myOr(0, 0))
print("1 OR 0: ", myOr(1, 0))
print("0 OR 1: ", myOr(0, 1))
print("1 OR 1: ", myOr(1, 1))
main()
输出结果:
三、为何单层感知机无法表达异或门?
异或门的真值表如下:(相同为假,不同为真)
x1 | x2 | y |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
从单层感知机的定义来看,他是划了一条直线,直线的一侧输出1,另一侧输出0,比如或门的阈值函数是:,下图中蓝色的直线就是这个函数的图形化表示,显然直线右侧的值都是真,左侧的值是假。
再回到异或门真值表,你会发现它的值呈对角排列,无法用一条直线划分开,所以异或门无法用单层感知机表示。
四、多层感知机有什么样的表达能力?
其实复杂的数字电路拆解到最后都是由一个个的逻辑门电路构成的,而单层感知机既然可以代表一个简单的门电路,那么多层组合的感知机自然可以表达一个复杂的数字电路。
比如异或门,在数字电路中是用
A | B | ![]() | ![]() | ![]() |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 0 | 0 |
但是呢,非门输入只有一个,所以上面这个公式不适用,改用与非门、或门和与门的组合。
A | B | ![]() | A+B | ![]() |
0 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
Python代码如下:
import numpy as np
def OR(x1, x2):
w = np.array([0.5, 0.5])
theta = 0.3
x = np.array([x1, x2])
if np.sum(x*w) > theta:
return 1
else:
return 0
def AND(x1, x2):
w = np.array([0.5, 0.5])
theta = 0.8
x = np.array([x1, x2])
if np.sum(x*w) > theta:
return 1
else:
return 0
def NAND(x1, x2):
w = np.array([-0.5, -0.5])
theta = -0.8
x = np.array([x1, x2])
if np.sum(x*w) > theta:
return 1
else:
return 0
def NOR(x1, x2):
return AND(NAND(x1, x2), OR(x1, x2))
def main():
print("This is the result of NOR:")
print("0 NOR 0: ", NOR(0, 0))
print("1 NOR 0: ", NOR(1, 0))
print("0 NOR 1: ", NOR(0, 1))
print("1 NOR 1: ", NOR(1, 1))
main()
运行结果如下: