自適應(yīng)線性神經(jīng)網(wǎng)絡(luò):ADAptive LInear NEuron (Adaline)
大綱
1. look --- 比Rosenblatt感知器算法的優(yōu)勢
2. write --- 吐槽實驗結(jié)果
3. code --- python
對比Rosenblatt
憋說話,先上圖 -.-
Rosenblatt的計算模型
Rosenblatt
Adaline的計算模型
Adaline
找不同:激活函數(shù)用階躍函數(shù)換成了連續(xù)型函數(shù)肴颊,用一個Quantizer函數(shù)進(jìn)行類別預(yù)測
激活函數(shù):用線性函數(shù)代替階躍函數(shù)進(jìn)行誤差計算和權(quán)值更新
量化函數(shù):類似Rosenblatt模型的激活函數(shù)染簇,能預(yù)測對應(yīng)輸入的類別
梯度下降最小化代價函數(shù)
- Adaline模型相比Rosenblatt模型娄蔼,定義了代價函數(shù)(cost function)窥翩,最小化代價函數(shù)是許多機(jī)器學(xué)習(xí)算法的主要思想恭金。
- Adaline模型中坟瓢,代價函數(shù)用的是均方誤差(Sum of Squared Errors :SSE)
好處:可以微分勇边,是凸函數(shù)
可以用梯度下降的方法找到均方誤差最小的權(quán)值
尋找最小均方誤差就像下山一樣,每次算法循環(huán)都相當(dāng)于下降一步折联,下降一步的歩幅取決于學(xué)習(xí)率粒褒,與圖中的權(quán)值點的切線斜率相關(guān)
每次權(quán)值逼近均方誤差最小點的過程就是梯度下降(Gradient Descent)
證明一下偏導(dǎo)函數(shù)計算方法
最終的權(quán)值更新公式如下
Adaline算法是基于全部的訓(xùn)練數(shù)據(jù),而感知器算法是每個樣本都要計算一次誤差诚镰,Adaline的處理方法有點像批處理的感覺奕坟。
Adaline的更新
self.w_[1:] += self.eta * X.T.dot(errors)
Perceptron的更新
update = self.eta * (target - self.predict(xi))
學(xué)習(xí)率的影響和選擇
學(xué)習(xí)率設(shè)置為0.01的時候,結(jié)果如左圖清笨,均方誤差最小的點是第一個點月杉,然后越來越大。當(dāng)學(xué)習(xí)率設(shè)置為0.0001的時候抠艾,結(jié)果如右圖苛萎,誤差在逐漸減小,但是沒有收斂的趨勢检号。
學(xué)習(xí)率設(shè)置腌歉,偏大偏小都會大幅降低算法效率。采取的方法是進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化(standardization)公式如下
經(jīng)過標(biāo)準(zhǔn)化的數(shù)據(jù)谨敛,會體現(xiàn)出一些數(shù)學(xué)分布的特點究履。標(biāo)準(zhǔn)化后,我們再次使用0.01的學(xué)習(xí)率進(jìn)行訓(xùn)練分類脸狸。
最后的分類平面如下圖
然后進(jìn)入Coding環(huán)節(jié)~
# encoding:utf-8
__author__ = 'Matter'
import numpy as np
class AdalineGD(object):
# 自適應(yīng)線性神經(jīng)網(wǎng)絡(luò):ADAptive LInear NEuron (Adaline)
# -------- 參數(shù) --------#
# 參數(shù)1 eta:float 學(xué)習(xí)率
# 參數(shù)2 n_iter:int 循環(huán)次數(shù)
# -------- 屬性 --------#
# 屬性1 w_:1d_array 擬合后權(quán)值
# 屬性2 errors_:list 每次迭代的錯誤分類
# 初始化
def __init__(self,eta=0.01,n_iter=10):
self.eta = eta
self.n_iter = n_iter
# 訓(xùn)練模型
def fit(self,X,y):
self.w_ = np.zeros(1+X.shape[1])
self.errors_ = []
self.cost_ = []
for i in range(self.n_iter):
output = self.net_input(X)
errors = (y-output)
self.w_[1:] += self.eta * X.T.dot(errors)
self.w_[0] += self.eta * errors.sum()
cost = (errors ** 2).sum()/2.0
self.cost_.append(cost)
return self
# 輸入和權(quán)值的點積,即公式的z函數(shù),圖中的net_input
def net_input(self,X):
return np.dot(X,self.w_[1:]) + self.w_[0]
# 線性激活函數(shù)
def activation(self,X):
return self.net_input(X)
# 利用階躍函數(shù)返回分類標(biāo)簽
def predict(self,X):
return np.where(self.activation(X)>=0.0,1,-1)