一文搞懂單層感知機

1 結構

如下圖所示,其實質就是一種映射關係。
在這裏插入圖片描述

2 學習規則

實質是更新權值,具體過程見如下公式。

  • y=f(i=1nxiwi)y=f\left(\sum_{i=1}^{n} x_{i} \cdot w_{i}\right)
    其中,i=0,1,2,…; y是網絡輸出;f是sign函數

  • Δwi=η(ty)xi\Delta w_{i}=\eta(t-y) x_{i}
    其中,η\eta 是學習率;t是正確標籤,取值也是{1,-1}

  • wi=wi+Δwiw_{i}=w_{i}+\Delta w_{i}

3 學習率

如上節所示,學習率對權值更新速度影響極大。取值在0~1。

學習率太大,容易造成權值調整不穩定;

學習率太小,權值調整太慢,迭代次數太多。

4 收斂條件

一般有以下幾種情形:

  • 誤差小於某個預先設定的較小的值
  • 兩次迭代之間的權值變化已經很小
  • 設定最大迭代次數,當迭代超過最大次數就停止

5 案例

假設我們有4個2維的數據,數據的特徵分別(3,3),(4,3),(1,1),(2,1)。(3,3),(4,3)這兩個數據的標籤爲1,(1,1),(2,1)這兩個數據的標籤爲-1,構建神經網絡來進行分類。

import numpy as np
import matplotlib.pyplot as plt

# 定義輸入數據:2維數據爲2個輸入節點,加一個偏置值,此處設爲1
X = np.array([[1,3,3],
              [1,4,3],
              [1,1,1],
              [1,2,1]])
# 定義標籤
T = np.array([[1],
              [1],
              [-1],
              [-1]])
# 權值初始化(3行:輸入個數,1列:輸出個數),0~1的隨機數
W = np.random.random([3,1])
# 學習率設置
lr = 0.1
# 神經網絡輸出
Y = 0

# 更新權值函數
def train():
    global X,Y,W,lr,T
    # 同時計算4個數據的預測值,Y(4,1)
    Y = np.sign(np.dot(X,W))
    # T-Y得到4個標籤值與預測值的誤差E(4,1)
    E = T - Y
    # 計算權值的變化(求均值)
    delta_W = lr * (X.T.dot(E)) / X.shape[0]
    # 更新權值
    W = W + delta_W
    
# 訓練模型
for i in range(100):
    # 更新權值
    train()
    # 打印當前訓練次數
    print('epoch:',i+1)
    # 當前的權值
    print('weights:',W)
    # 計算當前輸出
    Y = np.sign(np.dot(X,W))
    # all()表示Y中的所有值跟T中的所有值都對應相等,才爲真
    if (Y == T).all():
        print('Finished')
        # 跳出循環
        break 
        
# 可視化
# 正樣本的xy座標
x1 = [3,4]
y1 = [3,3]
# 負樣本xy座標
x2 = [1,2]
y2 = [1,1]
# 定義分類邊界線的斜率和截距(邊界線是W0+W1X1+W2X2=0)
k = -W[1]/W[2]
d = -W[0]/W[2]
# 設定兩個點
xdata = (0,5)
# 通過兩點來確定一條直線,用紅色的線來畫出分界線
plt.plot(xdata,xdata*k+d,'r')
# 用藍色的點畫正樣本
plt.scatter(x1,y1,c='b')
# 用黃色的點畫負樣本
plt.scatter(x2,y2,c='y')
plt.show()

在這裏插入圖片描述

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