单层感知机实现与门,或门,与非门&双层感知机实现异或门(python)

感知机perceptron算法是Frank Rosenblatt于1957年提出,它是神经网络和深度学习的起源算法。

感知机接受多个信号,输出一个信号,具体更多原理,请参见这篇博文

本文用python实现三个简单的逻辑电路,实际上这三种逻辑门电路用感知机实现都不是唯一的,都可以有很多种实现方式(区别只是权重和偏置不一样);且三个门电路之间也只是权重偏置不一样,代码实际上是一样的,也就是感知机的结构都一样,如下图:

单层感知机实现与门,或门,与非门&双层感知机实现异或门(python)_第1张图片
三种门电路的感知机结构如上图,均为2输入单输出,
(1) y = { 0 , x 1 w 1 + x 2 w 2 + b ≤ 0 1 , x 1 w 1 + x 2 w 2 + b > 0 y=\left\{ \begin{aligned} 0&,&x_1w_1+x_2w_2+b\leq0\\ 1&,&x_1w_1+x_2w_2+b>0\\ \end{aligned} \right.\tag1 y={01,,x1w1+x2w2+b0x1w1+x2w2+b>0(1)

权重w1,w2表示各个输入的重要程度。

偏置b表示神经元激活的难易程度,b越大则越易被激活。

(1)式描述的是一条直线把二维空间线性地分割为两部分。
实际上,如果引入激活函数的概念,则感知机使用的激活函数是阶跃函数:
h ( x ) = { 0 , x ≤ 0 1 , x > 0 h(x)=\left\{ \begin{aligned} 0,x\leq0\\ 1,x>0\\ \end{aligned} \right. h(x)={0,x01,x>0

激活函数就是连接NN和感知机的桥梁。

感知机使用阶跃函数作激活函数,而只要把激活函数换成其他函数(sigmoid或Relu),就得到了NN.


一、与门(AND gate)

真值表

x 1 x_1 x1 x 2 x_2 x2 y
0 0 0
0 1 0
1 0 0
1 1 1

代入(1)则有:
{ b ≤ 0 w 2 + b ≤ 0 w 1 + b ≤ 0 w 1 + w 2 + b > 0 \left\{ \begin{aligned} b\leq0\\ w_2+b\leq0\\ w_1+b\leq0\\ w_1+w_2+b>0 \end{aligned} \right. b0w2+b0w1+b0w1+w2+b>0
满足这组关系的 w 1 , w 2 , b {w_1,w_2,b} w1,w2,b很多,我们取0.5,0.5,-0.7
单层感知机实现与门,或门,与非门&双层感知机实现异或门(python)_第2张图片

import numpy as np
def AND(x1,x2):
    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

print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

pycharm脚本运行后输出结果:
在这里插入图片描述


二、或门(OR gate)

真值表

x 1 x_1 x1 x 2 x_2 x2 y
0 0 0
0 1 1
1 0 1
1 1 1

代入(1)则有:
{ b ≤ 0 w 2 + b > 0 w 1 + b > 0 w 1 + w 2 + b > 0 \left\{ \begin{aligned} b\leq0\\ w_2+b>0\\ w_1+b>0\\ w_1+w_2+b>0 \end{aligned} \right. b0w2+b>0w1+b>0w1+w2+b>0
满足这组关系的 w 1 , w 2 , b {w_1,w_2,b} w1,w2,b很多,我们取0.5,0.5,-0.2
单层感知机实现与门,或门,与非门&双层感知机实现异或门(python)_第3张图片

import numpy as np
def OR(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))

pycharm脚本运行后输出结果:
在这里插入图片描述


三、与非门(NAND gate)

真值表

x 1 x_1 x1 x 2 x_2 x2 y
0 0 1
0 1 1
1 0 1
1 1 0

代入(1)则有:
{ b > 0 w 2 + b > 0 w 1 + b > 0 w 1 + w 2 + b ≤ 0 \left\{ \begin{aligned} b>0\\ w_2+b>0\\ w_1+b>0\\ w_1+w_2+b\leq0 \end{aligned} \right. b>0w2+b>0w1+b>0w1+w2+b0
满足这组关系的 w 1 , w 2 , b {w_1,w_2,b} w1,w2,b很多,我们取-0.5,-0.5,0.7
单层感知机实现与门,或门,与非门&双层感知机实现异或门(python)_第4张图片

import numpy as np
def NAND(x1,x2):
        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

print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))

pycharm脚本运行后输出结果:
在这里插入图片描述

如上,单层感知机只能表示线性的空间划分,对于异或门,单层感知机则无法通过简单的一条直线划分开。这就是单层感知机的局限性。


四、异或门

真值表

x 1 x_1 x1 x 2 x_2 x2 y
0 0 0
0 1 1
1 0 1
1 1 0

学习数电时我们知道,简单门电路的组合可以实现复杂的门电路。所以:
单层感知机实现与门,或门,与非门&双层感知机实现异或门(python)_第5张图片

def XOR(x1,x2):
    s1 = NAND(x1,x2)
    s2 = OR(x1,x2)
    y = AND(s1,s2)
    return y

print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))

pycharm脚本运行后输出结果:
在这里插入图片描述
异或门是一个两层的感知机:
单层感知机实现与门,或门,与非门&双层感知机实现异或门(python)_第6张图片


总结:

  1. 可以看出,单层感知机无法表示的东西,加一层就解决了,所以加深层可以进行更复杂更灵活的表示,这就是深度神经网络可以学到复杂表示的理论源头。
  2. 本文实现的感知机的权重都是人工设置的,如果用感知机实现复杂的函数,权重的人工确定十分困难。而这个问题的解决就引入了神经网络,或者说神经网络解决了这个问题。因为NN的重要性质是他可以自动从数据中学得合适的参数(权重,偏置)。

你可能感兴趣的:(机器学习,python)