接下来我们小试牛刀,为感知机设定权重及阀值,实现一些简单的逻辑电路。
----------------------------------------------------与门------------------------------------------------------------
让我讲一个与门的故事,从前有个叫‘与门’的门会在两个输入都为1的情况下输出1,其他情况输出0。全剧终!
现在我们创造一个感知机,用于模拟与门的功能。
(w 1 , w 2 , θ) =(0.5, 0.5, 0.7) ---->验证一下:
输入0,0时:0*0.5+0*0.5<0.7--输出0
输入1,0时:1*0.5+0*0.5<0.7--输出0
输入0,1时:0*0.5+1*0.5<0.7--输出0
输入1,1时:1*0.5+1*0.5>0.7--输出1
嗯,果然和与门一模一样。
既然创建感知机这么简单,我们再创建10000个感知机
(w 1 , w 2 , θ) =(0.5, 0.5, 0.8)
(w 1 , w 2 , θ) =(1.0, 1.0, 1.0)
。。。。。。
实际上实现这种功能的感知机有无数个。
----------------------------------------------------与非门------------------------------------------------------------
'与非门'也就是'与门'的死对头。它的输出和'与门'完全相反。除了输入(1,1)时输出为0外,其他情况输出1。
我们同样创造了一些实现'与非门'逻辑的感知机。请自行验证。
(w 1 , w 2 , θ) =(-0.5,- 0.5, -0.7)
(w 1 , w 2 , θ) =(-0.5, -0.5, -0.8)
(w 1 , w 2 , θ) =(-1.0, -1.0, -1.0)
眼尖的你已经发现我只是把'与门'的参数全部进行了取反。为什么呢?聪明的你花费1至+∞分钟思考其中的逻辑吧。
----------------------------------------------------或门------------------------------------------------------------
或门:只要有一个输入信号是1,输出就为1
惯例,让我们创造一些'或门'感知机。
(w 1 , w 2 , θ) =(1.0,1.0,0.9)
(w 1 , w 2 , θ) =(0.8,0.8,0.7)
(w 1 , w 2 , θ) =(0.2,0.3,0.1)
----------------------------------------------------感知机的实现------------------------------------------------------------
以与门为例:
#与门
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
或者我们应该使用numpy实现相同的功能:
#用np实现与门
def AND(x1,x2):
x=np.array([x1,x2])
w=np.array([0.5,0.5])
b=-0.7
tem=np.sum(x*w)+b
return 1 if tem>0 else 0
眼尖的你已经发现,我偷偷把权重变成了负值。并且修改了后面的判断逻辑。这是一个简单的转换,一图便知。
之所以这么做。是因为我们已经对原理有了认识,应该向便于使用的方向渐进。这个公式对后面的学习及应用更加方便。
----------------------------------------------------与非门感知机的实现------------------------------------------------------------
#用np实现与非门
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # 仅权重和偏置与AND不同!
b = 0.7
tem=np.sum(x*w)+b
return 1 if tem>0 else 0
----------------------------------------------------或门感知机的实现------------------------------------------------------------
#用np实现或门
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.2, 0.3]) # 仅权重和偏置与AND不同!
b = -0.1
tem=np.sum(x*w)+b
return 1 if tem>0 else 0
----------------------------------------------------运行下面的代码验证我们的感知机------------------------------------------------------------
def main():
print(AND(0, 0),end='|') # 输出0
print(AND(1, 0),end='|') # 输出0
print(AND(0, 1),end='|') # 输出0
print(AND(1, 1),end='|') # 输出1
print()
print(NAND(0, 0),end='|') # 输出1
print(NAND(1, 0),end='|') # 输出1
print(NAND(0, 1),end='|') # 输出1
print(NAND(1, 1),end='|') # 输出0
print()
print(OR(0, 0),end='|') # 输出0
print(OR(1, 0),end='|') # 输出1
print(OR(0, 1),end='|') # 输出1
print(OR(1, 1),end='|') # 输出1
print()
if __name__=='__main__':
main()
拿眼珠子可以看到,结果与我们期待的结果完全一致。
----------------------------------------------------结语------------------------------------------------------------
做完上面那些你可能已经激动难耐,毕竟修改下参数就可以‘做任何事情’。但不要妄图这样就能创造人工智能,然后机器人反叛,一统天下。你会在下一节看到感知机的局限性。