# 1.什么是感知机?
# --感知机接收多个输入信号,输出一个信号,感知机的信号会形成流,向前方输送信息;
# 感知机的信号只有“流/不流(1/0)”两种取值
"""
0:w1x1+w2x2<=θ
1:w1x1+w2x2>θ
"""
"""
感知机的三种逻辑电路:
1.与门(AND):是有两个输入和一个输出的门电路。与门仅在两个输入信号均为1时输出1,其他时候则输出0
2.与非门(NAND):仅当X1和X2同时为1时输出0,其他时候输出1
3.或门(OR):只要有一个输入信号是1,输出就是1的门电路
神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值(阈值θ),
才会输出1,这也成为“神经元被激活”
"""
"""
机器学习的概念:
我们看到真值表这种“训练数据”,人工考虑到了参数值。而机器学习的课题就是将这个决定参数值的工作交由
计算机自动进行。“学习”是确定合适参数的过程,而人要做的是思考感知机的构造(模型),
并把训练数据交给计算机
"""
# 与门、与非门、或门的感知机构造是一样的,3个门电路只有参数的值(权重和阈值)不同
# 感知机的实现
# 与门
def AND(x1, x2):
"""
简单与门的实现
:param x1: 输入信号1
:param x2: 输入信号2
:return: 输出信号(1/0)
"""
w1, w2, theta = 0.5, 0.5, 0.7 # 权重和阈值
tmp = x1 * w1 + x2 * w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))
# 与非门
def NAND(x1, x2):
"""
简单与非门逻辑电路的实现
:param x1: 输入信号1
:param x2: 输入信号2
:return: 输出信号(1/0)
"""
w1, w2, theta = -0.5, -0.5, -0.7
tmp = x1 * w1 + x2 * w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(NAND(0, 0))
print(NAND(1, 0))
print(NAND(0, 1))
print(NAND(1, 1))
# 与非门
def OR(x1, x2):
"""
简单与非门逻辑电路的实现
:param x1: 输入信号1
:param x2: 输入信号2
:return: 输出信号(1/0)
"""
w1, w2, theta = 1, 1, 0.8
tmp = x1 * w1 + x2 * w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(OR(0, 0))
print(OR(1, 0))
print(OR(0, 1))
print(OR(1, 1))
import numpy as np
# 使用权重和偏置的实现
x = np.array([0, 1]) # 输入
w = np.array([0.5, 0.5]) # 权重
print(x) # [0 1]
print(w) # [0.5 0.5]
b = -0.7 # 偏置
print(w*x) # 对应元素相乘 [0. 0.5]
# 求和
print(np.sum(w*x)) # 0.5
print(np.sum(w*x)+b) # 加偏置,-0.19999999999999996,大约为-0.2(由浮点小数造成的误差)
# 使用权重和偏置实现感知机的逻辑电路
"""
0:b+w1x1+w2x2<=0
1:b+w1x1+w2x2>0
把-θ命名为偏置b,偏置和权重w1、w2的作用是不一样的
w1和w2是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数
有时会根据上下文,将b、w1、w2统称为权重
当输入x1和x2为0时,只输出偏置的值
"""
"""
与门、与非门、或门是具有相同构造的感知机,区别只在于权重参数的值。(这里权重应该包括偏置b)
在与非门和或门的实现中,仅设置权重和偏置的值这一点和与门的实现不同
"""
def AND(x1, x2):
"""
使用权重和偏置实现与门
:param x1: 输入信号1
:param x2: 输入信号2
:return: 输出信号(1/0)
"""
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
else:
return 1
def NAND(x1, x2):
"""
使用权重和偏置实现与非门
:param x1: 输入信号1
:param x2: 输入信号2
:return: 输出信号(1/0)
"""
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # 仅权重和偏置与AND不同!
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
def OR(x1, x2):
"""
使用权重和偏置实现或门
:param x1: 输入信号1
:param x2: 输入信号2
:return: 输出信号(1/0)
"""
x = np.array([x1, x2])
w = np.array([0.5, 0.5]) # 仅权重和偏置与AND不同!
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
import numpy as np
# 异或门(XOR gate),也被称为“逻辑异或”电路,仅当x1或x2中的一方为1时,才会输出1
"""
真值表
与门
x1 x2 |y
0 0 |0
1 0 |0
0 1 |0
1 1 |1
与非门
x1 x2 |y
0 0 |1
1 0 |1
0 1 |1
1 1 |0
或门
x1 x2 |y
0 0 |0
1 0 |1
0 1 |1
1 1 |1
异或门
x1 x2 |y
0 0 |0
1 0 |1
0 1 |1
1 1 |0
"""
"""
感知机的局限性就在于它只能表示由一条直线分割的空间
线性空间:由直线分割而成的空间
非线性空间:由曲线分割而成的空间
严格的讲,“单层感知机无法表示异或门”或者“单层感知机无法分离非线性空间”
通过组合感知机(叠加层)就可以实现异或门
"""
# 要点:感知机可以“叠加层”(通过叠加层来表示异或门)
# x1和x2是与非门和或门的输入,而与非门(s1)和或门(s2)的输出则是与门的输入
"""
异或门
第0层 第1层 第2层
x1 x2 |s1 s2 |y
0 0 |1 0 |0
1 0 |1 1 |1
0 1 |1 1 |1
1 1 |0 0 |0
"""
def AND(x1, x2):
"""
使用权重和偏置实现与门
:param x1: 输入信号1
:param x2: 输入信号2
:return: 输出信号(1/0)
"""
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
else:
return 1
def NAND(x1, x2):
"""
使用权重和偏置实现与非门
:param x1: 输入信号1
:param x2: 输入信号2
:return: 输出信号(1/0)
"""
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # 仅权重和偏置与AND不同!
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
def OR(x1, x2):
"""
使用权重和偏置实现或门
:param x1: 输入信号1
:param x2: 输入信号2
:return: 输出信号(1/0)
"""
x = np.array([x1, x2])
w = np.array([0.5, 0.5]) # 仅权重和偏置与AND不同!
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
# 异或门的实现
def XOR(x1, x2):
"""
通过与门、与非门、或门的组合(叠加层)实现异或门
:param x1: 与非门、或门的输入信号
:param x2: 与非门、或门的输入信号
:return: 0/1
"""
# 与门的输入
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
pass
print(XOR(0, 0))
print(XOR(1, 0))
print(XOR(0, 1))
print(XOR(1, 1))
# 异或门是一种多层结构的神经网络
# 与门、与非门、或门是单层感知机,而异或门是2层感知机。--单层感知机无法表示的东西,通过增加一层就可以解决。
# 也就是说,通过叠加层(加深层),感知机能进行更加灵活地表示。
# 感知机总共有3层构成,但是因为拥有权重的层实质上只有2层(第0层和第1层之间,第1层和第2层之间),
# 所以称为“2层感知机”(有的文献称为“3层感知机”)
# 叠加了多层的感知机也称为多层感知机(multi-layered perceptron)
"""
先在第0层和第1层的神经元之间进行信号的传送和接收,然后在第1层和第2层之间进行信号的传送和接收,具体如下:
1.第0层的两个神经元接收输入信号,并将信号发送至第1层的神经元
2.第1层的神经元将信号发送至第2层的神经元,第2层的神经元输出y
"""
"""
计算机是处理信息的机器,和感知机一样,也有输入和输出,会按照某个既定的规则尽进行计算
感知机也可以表示计算机
只需要通过与非门的组合,就能再现计算机进行的处理
感知机通过叠加层能够进行非线性的表示,理论上还可以表示计算机进行的处理
"""
"""
小结:
1.感知机是具有输入和输出的算法。给定一个输入后,将输出一个既定的值
2.感知机将权重和偏置设定为参数
3.使用感知机可以表示与门和或门等逻辑电路
4.异或门无法通过排单层感知机来表示
5.使用2层感知机可以表示异或门
6.单层感知机只能表示线性空间,而多层感知机能表示非线性空间
7.多层感知机(在理论上)可以表示计算机
"""