深度學習之(神經網絡)單層感知器(python)(一)

感知器介紹

感知器(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章