感知机算法是由美国学者 Frank Rosenblatt 在1957年提出来的。感知机算法自己很是简单,可是它是神经网络(深度学习)的起源的算法。下面,就简单介绍下这个算法。python
感知机接收多个输入信号,输出一个信号。感知机的信号只有(1/0)两种取值。算法
下图是一个接收两个输入信号的感知机的例子。x1 和 x2是输入信号, y是输出信号,ω1、ω2 是权重。图中的 ⭕️表示神经元(或者节点)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号 θ 表示。网络
那么感知机的公式就能够很容易表示出来了 :ide
(公式 1.1)学习
简单逻辑电路其实是感知机的一个简单的应用场景,这里定义3个概念:与门(AND gate)、 与非门(NAND gate)、或门(OR gate)、异或门(XOR gate)。spa
这和逻辑条件的判断类似,对于参数肯定的感知机模型,x1 和 x2取相应的值时,对应的y值以下图: 3d
针对每个电路实例,很容易获得结论: 前3种能够有多种不一样类型的感知机,不一样的模型,参数不一致。code
下面,是用python实现3种感知机模型(肯定ω1、ω2,让它们知足与门、与非门和或门的条件):blog
1 def AndGate(x1,x2): 2 theata = 0.6 3 w1 = 0.5 4 w2 = 0.5 5 sum = w1*x1 + w2*x2 6 if sum <= theata: 7 return 0 8 else: return 1 9 10 def NotAndGate(x1,x2): 11 theata = -0.6 12 w1 = -0.5 13 w2 = -0.5 14 sum = w1*x1 + w2*x2 15 if sum <= theata: 16 return 0 17 else: return 1 18 19 def OrGate(x1,x2): 20 theata = 0.3 21 w1 = 0.5 22 w2 = 0.5 23 sum = w1*x1 + w2*x2 24 if sum <= theata: 25 return 0 26 else: return 1
下面,想象着对感知机的公式作一个变体,让θ = -b,那么公式就变成了:深度学习
(公式1.2)
固然,这时候问题变成了,若是肯定了 b、ω1、ω2,也能够肯定感知机模型,下面一样道理,咱们快速写出该模型的python代码(只要让 b= -θ 便可):
1 import numpy as np 2 3 def AndGateSecond(x1,x2): 4 X = np.array([x1,x2]) 5 w1,w2 = 0.5,0.5 6 b=-0.6 7 # print (np.array([w1,w2])*X) 8 sum = b + np.sum(np.array([w1,w2])*X) 9 if sum<=0 : 10 return 0 11 else: 12 return 1 13 14 def NotAndGateSecond(x1,x2): 15 X = np.array([x1,x2]) 16 w1,w2 = -0.5,-0.5 17 b=0.6 18 # print (np.array([w1,w2])*X) 19 sum = b + np.sum(np.array([w1,w2])*X) 20 if sum<=0 : 21 return 0 22 else: 23 return 1 24 25 def OrGateSecond(x1,x2): 26 X = np.array([x1,x2]) 27 w1,w2 = 0.5, 0.5 28 b = -0.3 29 # print (np.array([w1,w2])*X) 30 sum = b + np.sum(np.array([w1,w2])*X) 31 if sum<=0 : 32 return 0 33 else: 34 return 1
异或门,不能用感知机表示,下面用图形的方式来解释缘由。
y = ω1*x1 + ω2*x1 + b 能够理解为一条直线,二维空间。若是 ω1 = 1 , ω2 = 1 , b = -0.5 ,是知足或门的参数。下图是该参数的直线,将三角和圆形符号区分开了。
三角形符号: (1,0) , (0,1) , (1,1) 圆形符号:(0,0)
那么,异或门,实际上找到一条曲线,将下图中的三角和圆形符号区分开。
很明显,用直线没法将上图中三角和圆形符号区分开。 只能用曲线了:
感知机的局限性就在于它只能表示由一条直线分割的空间。而没法解决上边异或门的曲线问题。
上一节中,提到了感知机的局限性,没法实现异或门。也就是说,在线性空间中,感知机没法实现异或门。
可是,咱们能够经过前边3个感知机的组合来实现异或门,看下边的真值表:
容易发现,咱们使用与非门、或门和与门组合完成了异或门的实现。这样,python实现代码也容易完成:
1 def NotOrGate(x1,x2): 2 s1=NotAndGateSecond(x1,x2) 3 s2=OrGateSecond(x1,x2) 4 y=AndGateSecond(s1,s2) 5 return y 6 7 NotOrGate(0,0),NotOrGate(1,0),NotOrGate(0,1),NotOrGate(1,1)
叠加了多层的感知机也称为多层感知机(multi-layered perceptron)。
图形化表示异或门,以下: