(1)
"""
感知机是什么?感知机接受多个输入信号,输出一个信号。感知机的多个输入信号都有各自固有的权重,这些权重发挥着各个信号的重要性作用。
也即权重越大,对应该权重的信号的重要性就越高。
如下例子:x1,x2是输入信号,y是输出信号,w1、w2是权重,当输人信号被送往神经元时,会被分别乘以固定权重(w1*x1,w2*x2)。
神经元会计算传送过来的信号总和,只有当这个总和超过了某个界限值时,才会输出1.此处将这个界限值称为阈值,用theta表示。
"""
"""
感知机的运行原理用数学式表示如下:
y={0,1}
(w1*x1+w2*x2<=theta时,y=0)
(w1*x1+w2*x2>theta时,y=1)
"""
#简单逻辑电路
"""
与门(And gate):是有两个输入和一个输出的门电路。与门仅在两个输入值均为1时输出1,其他时候则输出0。
真值表如下:
x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1
"""
"""
与非门(Not AND Gate):颠倒了与门的输出,用真值表表示,仅当x1和x2同时为1时输出0,其他时候输出1.
x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0
"""
"""
或门:只要有一个输入信号为1,输出就为1的逻辑电路
x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1
"""
#这里决定感知机参数并不是计算机,而是我们人。我们看着真值表这种“训练数据”,人工想到了参数的值。而机器学习的课题就是将
#这个决定参数值的工作交由计算机自动进行。"学习"是确定合适的参数的过程,而人要做的就是思考感知机的构造(模型),并把训练数据交给计算机。
#感知机的简单实现:现在使用Python来实现刚才的逻辑电路,此处先定义一个接收参数x1和x2的AND函数
def AND(x1,x2):
w1,w2,theta=0.5,0.5,0.7
tmp=x1*w1+x2*w2
if tmp<=theta:
return 0
elif tmp>theta:
return 1
#在函数内初始化参数w1,w2,theta,当输入的加权总和超过阈值时返回1,否则返回0,打印输出结果,实现了与门。
print(AND(0,0))#0
print(AND(0,1))#0
print(AND(1,0))#0
print(AND(1,1))#1
(2)导入权重和偏置
#2.导入权重和偏置
"""
刚才的与门实现比较直接、容易理解,此处我们将其修改为另外一种实现方式;先将上式的theta换为:-b,
y={0,1}
(b+w1*x1+w2*x2<=0时,y=0)
(b+w1*x1+w2*x2>0时,y=1)
此处b成为偏置,w1和w2称为权重,感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0.
"""
import numpy as np
x=np.array([0,1])#输入
w=np.array([0.5,0.5])#权重
b=-0.7 #偏置
print(w*x)#[0,0.5]
print(np.sum(w*x))#计算相乘后各个元素的总和
print(np.sum(w*x)+b)#结果再加上偏置#-0.19999999999999996
#使用权重和偏置可以如下面所示实现与门
def AND(x1,x2):
x=np.array([0,1])
w=np.array([0.5,0.5])
b=-0.7
tmp=np.sum(w*x)+b
if tmp<=0:
return 0
else:
return 1
#注意:偏置b和权重w1、和w2的作用不同。具体来说。w1和w2是控制输入信号的重要性的参数,而偏置b是调整神经元被激活的容易程度的参数。
#接着实现非门
def NAND(x1,x2):
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):
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
"""
异或门:也被称为逻辑异或电路。仅当x1或者x2中的一方为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 = AND(s1, s2)
return y
#这个XOR函数会输出预期的结果。
XOR(0, 0) # 输出0
XOR(1, 0) # 输出1
XOR(0, 1) # 输出1
XOR(1, 1) # 输出0
?用感知机表示异或门:异或门是一种多层结构的神经网络。这里,将最左边的 一列称为第0层,中间的一列称为第1层,最右边的一列称为第2层。
?
|