"""
感知机:接收多个输入信号,输出一个信号,并且多个信号是二值信号,只有0或者1两种类似的选择。
其局限性在于,它只能表示由一条直线分割的空间。(无法表示异或门)
但是可以使用两层感知机来表示异或门。
单层感知机只能表示线性空间,而多层感知机可以表示非线性空间
多层感知机在理论上可以表示计算机。
"""
import numpy as np
'''
感知机:
与门:只有当两个输入x1和x2都为1的时候,输出y才为1
x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1'''
def add(x1, x2):
w1, w2, theta_add = 0.5, 0.5, 0.7
tmp = x1 * w1 + x2 * w2
if tmp < theta_add:
return 0
elif tmp > theta_add:
return 1
print(add(0, 0), add(1, 0), add(0, 1), add(1, 1))
'''
与非门:只有当两个输入x1和x2都为1的时候,输出y才为0(和与门恰好相反)
x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0
'''
def add_flase(x1, x2):
w1, w2, theta_add = 0.5, 0.5, 0.7
tmp = x1 * w1 + x2 * w2
if tmp < theta_add:
return 1
elif tmp > theta_add:
return 0
print('')
print(add_flase(0, 0), add_flase(0, 1), add_flase(1, 0), add_flase(1, 1))
'''
或门:当两个输入x1和x2有一个或者都为1的时候,输入y为1.当x1和x2都为0的时候,输出y为0
x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1
'''
def or_gate(x1, x2):
w1, w2, theta_add = 0.5, 0.5, 0.3
tmp = x1 * w1 + x2 * w2
if tmp < theta_add:
return 0
elif tmp > theta_add:
return 1
print('')
print(or_gate(0, 0), or_gate(1, 0), or_gate(0, 1), or_gate(1, 1))
""" 使用numpy包来实现与门、非门、与非门 """
print('')
def Add(x1, x2): # 与门的实现
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1
print(Add(0,0),Add(0,1), Add(1,0), Add(1,1))
def NAND(x1, x2): # 与非门,权重与偏置均与与门相反
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1
print(NAND(0,0), NAND(0,1), NAND(1, 0), NAND(1,1))
def Or(x1, x2): # 或门
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.3
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1
print(Or(0,0), Or(0,1), Or(1, 0), Or(1,1))
''' 异或门的实现
x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0
'''
# 组合与门、与非门以及或门,形成异或门
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = Or(x1, x2)
y = Add(s1, s2)
return y
print(XOR(0,0), XOR(0, 1), XOR(1, 0), XOR(1, 1)) # print(XOR(0,0), XOR(0, 1), XOR(1, 0), XOR(1, 1))
感知机-神经网络编程(深度学习)
最新推荐文章于 2022-12-14 22:13:24 发布