深度學習之單層感知器(一)
當我們最初學習機器學習時候,了解到最簡單的神經網路可能便是單層感知器,他也是監督學習的最簡單一種。本文章就通過《人工神經網路理論、設計及應用》書中介紹的單層感知器一節,進行python的代碼實現。
單層感知器的網路結構如下:
上圖便是一個單層感知器,很簡單的一個結構,圖中說明我們有個3維的輸入值分別是x1、x2、x3,輸入端和其上的權值0.3相乘,然後將乘積相加後,最後通過激活函數對乘積和進行處理得到輸出值y。
感知器學習演算法:
採用感知器學習規則(對誤差平方求導推極值問題),考慮到訓練過程是感知器權值隨每一步調整改變的過程,為此用t表示學習的迭代次數,權值看作t的函數。t=0表示學習開始前的初始狀態,此時對應的權值為初始化值。訓練可按如下步驟進行:
(1)、對各權值 (m為計算層的節點數)賦予較小的非零隨機數;
(2)、輸入樣本對 { } ,x是訓練樣本,d是樣本的目標值;
(3)、計算各節點的實際輸出 (t) = sgn[ (t) ] , j =1 ,2 ...... m;
(4)、調整各節點的權值 (t+1) = + [ ] ,j=1,2......m;其中 為學習率,用於控制調整速度,學習率太大會影響訓練的穩定性,太小則使訓練的收斂速度變慢,一般取值範圍0< 1;
(5)、返回到步驟2輸入下一對樣本
好了,有了上面的基本知識後,我們通過簡單的python代碼來實現單層感知網路。比如我們有如下圖的例子:
首先建立數據集
import numpy as np#建立數據集x = np.mat([[1,0,0],[1,0,1],[1,1,0],[1,1,1],[0,0,1],[0,1,0],[0,1,1],[0,0,0]])y = np.mat([[-1],[1],[1],[1],[-1],[-1],[1],[-1],])#設置初始權值和偏置值w = np.mat([0.3,0.3,0.3])baise = 0.4#學習率rate = 0.01#激活函數def sgn(x): return np.where(x >= 0.0, 1, -1)#通過學習規則,進行迭代for i in range(1000): #誤差計算 errors = 0 for j in range(len(x)): #誤差計算 r = rate*(y[j] - sgn(x[j]*w.T+baise)) #r = rate*(y[j] - (x[j]*w.T+baise)) #調整權值 w += r*x[j] baise += r #誤差計算 errors += abs(r) print(i, iter :error is , errors) if errors ==0: break
下圖,是我運行上面程序的結果,可以看到迭代了8次後,誤差為0:
通過計算出來的權值W和偏置值baise進行驗證模型是否正確:
sgn(x*w.T+baise)
可以看到模型的輸出和實際y的值一模一樣:
推薦閱讀:
※我的人工智慧學習筆記(一)
※Siamese network 孿生神經網路--一個簡單神奇的結構
※馬庫斯:DeepMind新出的機器心智網路不錯,但有誤導性
※自動調參、ROC——2017.03.13
※李宏毅機器學習筆記(一)前言
TAG:機器學習 |