美文网首页Artificial Intelligence大数据 爬虫Python AI Sql
深度学习之(神经网络)单层感知器(python)

深度学习之(神经网络)单层感知器(python)

作者: Lee_5566 | 来源:发表于2018-08-20 16:23 被阅读8次

    感知器介绍

    感知器(Perceptron),是神经网络中的一个概念,在1950s由Frank Rosenblatt第一次引入。
    单层感知器(Single Layer Perceptron)是最简单的神经网络。它包含输入层和输出层,而输入层和输出层是直接相连的。
    与最早提出的MP模型不同,神经元突触权值可变,因此可以通过一定规则进行学习。可以快速、可靠地解决线性可分的问题。

    单层感知器由一个线性组合器和一个二值阈值元件组成。


    image.png

    输入向量为x,权重向量为w,w0为偏执。

    简单的理解可以解释为:将x0,x1······xn的变量输入,经过组合器的整合,输出1或者-1,也就是通过组合器对输入变量判断其正确与否。

    而这个判断的依据就是权重w0,w1······wn。

    因为线性组合器是实现加法的方式,根据向量的运算法则,所以以上公式的输入值可以理解为:
    w0+x1w1+······+xnwn


    image.png

    单个数据的输入判断就是这样,下面我们将它扩展到多个数据,如下图所示:


    image.png

    在整个的感知器算法中,是有明确的数学公式,通过线性组合器的组装进行分类判断:


    image.png

    这就是详细的组合器算法。其中偏振因子b,一般会用w0表示,这时会加入一个偏振输入变量x0,不过x0恒等于1,也就是以上所描述的公式。

    下面整体的介绍一下单层感知器算法模型:


    image.png

    感知器算法模型

    神经元期望的输出值已知;
    根据实际的输入值向量X,和初始的权值向量W(已知),经过线性感知器求得实际的输出值(一般为值是1或者-1的向量)。
    使用神经元期望的输出值减去实机的输出值,求得差值,再和设定的学习率相乘后,再和输入向量相乘,求得权值变化的向量。(也就是得到对输入向量的调整后的向量)
    将权值向量W和得到的变化向量相加,重复以上动作,直到期望输出和实际输出相等。

    因为期望输出的值为(1或者-1)
    即:w0+w1x1+······+wnxn>0或w0+w1x1+······+wnxn<0
    所以它们的分界线为:
    w0+w1x1+······+wnxn=0

    二维时为:
    w0+w1x1+w2x2=0

    w2x2=-w1x1-w0
    x2=-(w1/w2)x1-w0/w2

    x2=kx1+b

    image.png

    代码:

    # -*- coding: UTF-8 -*-
    
    # numpy 支持高级大量的维度数组与矩阵运算
    import numpy  as np
    # Matplotlib 是一个 Python 的 2D绘图库
    import matplotlib  as mpl
    import matplotlib.pyplot as plt
    
    
    #定义坐标,设定6组输入数据,每组为(x0,x1,x2)
    X=np.array([[1,4,3],
                [1,5,4],
                [1,4,5],
                [1,1,1],
                [1,2,1],
                [1,3,2]]);
    
    #设定输入向量的期待输出值
    Y=np.array([1,1,1,-1,-1,-1]);
    
    #设定权值向量(w0,w1,w2),权值范围为-1,1
    W = (np.random.random(3)-0.5)*2; 
    
    #设定学习率
    lr = 0.3;
    #计算迭代次数
    n=0;
    #神经网络输出
    O=0;
    
    
    def  update():
        global  X,Y,W,lr,n;
        n=n+1;
        O=np.sign(np.dot(X,W.T));
        #计算权值差
        W_Tmp = lr*((Y-O.T).dot(X));
        W = W+W_Tmp;
    
    
    if __name__ == '__main__':
        for index in range (100):
            update()
    
            O=np.sign(np.dot(X,W.T))
            print(O)
            print(Y)
            if(O == Y).all():
                print('Finished')
                print('epoch:',n)
                break
    x1=[3,4]
    y1=[3,3]
    x2=[1]
    y2=[1]
    
    k=-W[1]/W[2]
    d=-W[0]/W[2]
    print('k=',k)
    print('d=',d)
    xdata=np.linspace(0,5)
    plt.figure()
    plt.plot(xdata,xdata*k+d,'r')
    plt.plot(x1,y1,'bo')
    plt.plot(x2,y2,'yo')
    plt.show()
    

    运行结果:

    [-1. -1. -1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [-1. -1.  1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [-1. -1. -1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [-1. -1.  1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [ 1.  1.  1. -1. -1.  1.]
    [ 1  1  1 -1 -1 -1]
    [-1. -1.  1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [ 1.  1.  1. -1. -1.  1.]
    [ 1  1  1 -1 -1 -1]
    [-1. -1.  1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [ 1.  1.  1. -1. -1.  1.]
    [ 1  1  1 -1 -1 -1]
    [-1. -1.  1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [ 1.  1.  1. -1. -1.  1.]
    [ 1  1  1 -1 -1 -1]
    [-1. -1.  1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    [1. 1. 1. 1. 1. 1.]
    [ 1  1  1 -1 -1 -1]
    [ 1.  1.  1. -1. -1.  1.]
    [ 1  1  1 -1 -1 -1]
    [-1.  1.  1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    [ 1.  1.  1. -1. -1.  1.]
    [ 1  1  1 -1 -1 -1]
    [ 1.  1.  1. -1. -1. -1.]
    [ 1  1  1 -1 -1 -1]
    Find W.
    go to N:27
    
    image.png

    参考:

    博文 https://blog.csdn.net/qq_24708791/article/details/78370909
    感知器学习算法ppt
    https://wenku.baidu.com/view/ad50616a4a7302768f99390a.html
    网易视频课程——深度学习入门系列
    http://study.163.com/course/courseMain.htm?courseId=1004111045

    相关文章

      网友评论

        本文标题:深度学习之(神经网络)单层感知器(python)

        本文链接:https://www.haomeiwen.com/subject/zkgobftx.html