python實(shí)現(xiàn)感知器算法詳解
在1943年,沃倫麥卡洛可與沃爾特皮茨提出了第一個腦神經(jīng)元的抽象模型,簡稱麥卡洛可-皮茨神經(jīng)元(McCullock-Pitts neuron)簡稱MCP,大腦神經(jīng)元的結(jié)構(gòu)如下圖。麥卡洛可和皮茨將神經(jīng)細(xì)胞描述為一個具備二進(jìn)制輸出的邏輯門。樹突接收多個輸入信號,當(dāng)輸入信號累加超過一定的值(閾值),就會產(chǎn)生一個輸出信號。弗蘭克羅森布拉特基于MCP神經(jīng)元提出了第一個感知器學(xué)習(xí)算法,同時它還提出了一個自學(xué)習(xí)算法,此算法可以通過對輸入信號和輸出信號的學(xué)習(xí),自動的獲取到權(quán)重系數(shù),通過輸入信號與權(quán)重系數(shù)的乘積來判斷神經(jīng)元是否被激活(產(chǎn)生輸出信號)。

一、感知器算法
我們將輸入信號定義為一個x向量,x=(x1,x2,x3..),將權(quán)重定義為ω=(ω1,ω2,ω3...)其中ω0的值為,將z定義為為兩個向量之間的乘積,所以輸出z=x1*ω1 + x2*ω2+....,然后將z通過激勵(激活)函數(shù),作為真正的輸出。其中激活函數(shù)是一個分段函數(shù),下圖是一個階躍函數(shù),當(dāng)輸入信號大于0的時候輸出為1,小于0的時候輸出為0,這里的階躍函數(shù)閾值設(shè)置為0了。定義激活函數(shù)為Φ(z),給激活函數(shù)Φ(z)設(shè)定一個閾值θ,當(dāng)激活函數(shù)的輸出大于閾值θ的時候,將輸出劃分為正類(1),小于閾值θ的時候?qū)⑤敵鰟澐譃樨?fù)類(-1)。如果,將閾值θ移到等式的左邊z=x1*ω1+x2*ω2+....+θ,我們可以將θ看作為θ=x0*ω0,其中輸出x0為1,ω0為-θ。將閾值θ移到等式的左邊之后,就相當(dāng)于激活函數(shù)的閾值由原來的θ變成了0。

感知器算法的工作過程:
1、將權(quán)重ω初始化為零或一個極小的隨機(jī)數(shù)。
2、迭代所有的訓(xùn)練樣本(已知輸入和輸出),執(zhí)行如下操作:
a、通過權(quán)重和已知的輸入計算輸出
b、通過a中的輸出與已知輸入的輸出來更新權(quán)重

權(quán)重的更新過程,如上圖的公式,其中ω與x都是相對應(yīng)的(當(dāng)ω為ω0的時候,x為1),η為學(xué)習(xí)率介于0到1之間的常數(shù),其中y為輸入所對應(yīng)的輸出,后面的y(打不出來)為a中所計算出來的輸出。通過迭代對權(quán)重的更新,當(dāng)遇到類標(biāo)預(yù)測錯誤的情況下,權(quán)重的值會趨于正類別和負(fù)類別的方向。

第一個公式表示的是,當(dāng)真實(shí)的輸出為1的情況下,而預(yù)測值為-1,所以我們就需要增加權(quán)重來使得預(yù)測值往1靠近。
第二個公式表示的是,當(dāng)真實(shí)的輸出為-1的情況下,而預(yù)測值為1,所以我們就需要減少權(quán)重來使得預(yù)測值往-1靠近。
注意:感知器收斂的前提是兩個類別必須是線性可分的,且學(xué)習(xí)率足夠小。如果兩個類別無法通過一個線性決策邊界進(jìn)行劃分,我們可以設(shè)置一個迭代次數(shù)或者一個判斷錯誤樣本的閾值,否則感知器算法會一直運(yùn)行下去。

最后,用一張圖來表示感知器算法的工作過程

二、python實(shí)現(xiàn)感知器算法
import numpy as np
class Perceptron(object):
'''''
輸入?yún)?shù):
eta:學(xué)習(xí)率,在0~1之間,默認(rèn)為0.01
n_iter:設(shè)置迭代的次數(shù),默認(rèn)為10
屬性:
w_:一維數(shù)組,模型的權(quán)重
errors_:列表,被錯誤分類的數(shù)據(jù)
'''
#初始化對象
def __init__(self,eta=0.01,n_iter=10):
self.eta = eta
self.n_iter = n_iter
#根據(jù)輸入的x和y訓(xùn)練模型
def fit(self,x,y):
#初始化權(quán)重
self.w_ = np.zeros(1 + x.shape[1])
#初始化錯誤列表
self.errors_=[]
#迭代輸入數(shù)據(jù),訓(xùn)練模型
for _ in range(self.n_iter):
errors = 0
for xi,target in zip(x,y):
#計算預(yù)測與實(shí)際值之間的誤差在乘以學(xué)習(xí)率
update = self.eta * (target - self.predict(xi))
#更新權(quán)重
self.w_[1:] += update * xi
#更新W0
self.w_[0] += update * 1
#當(dāng)預(yù)測值與實(shí)際值之間誤差為0的時候,errors=0否則errors=1
errors += int(update != 0)
#將錯誤數(shù)據(jù)的下標(biāo)加入到列表中
self.errors_.append(errors)
return self
#定義感知器的傳播過程
def net_input(self,x):
#等價于sum(i*j for i,j in zip(x,self.w_[1:])),這種方式效率要低于下面
return np.dot(x,self.w_[1:]) + self.w_[0]
#定義預(yù)測函數(shù)
def predict(self,x):
#類似于三元運(yùn)算符,當(dāng)self.net_input(x) >= 0.0 成立時返回1,否則返回-1
return np.where(self.net_input(x) >= 0.0 , 1 , -1)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用Python進(jìn)行屏幕錄制的實(shí)現(xiàn)
關(guān)于屏幕錄制這個功能需求,之前用過基于ffmpeg的Capture錄屏軟件,但是fps拉高以后會變得很卡,聲音也同樣出現(xiàn)卡頓,所以本文給大家介紹了用Python進(jìn)行屏幕錄制的實(shí)現(xiàn),感興趣的朋友可以參考下2024-04-04
使用Pytorch實(shí)現(xiàn)Swish激活函數(shù)的示例詳解
激活函數(shù)是人工神經(jīng)網(wǎng)絡(luò)的基本組成部分,他們將非線性引入模型,使其能夠?qū)W習(xí)數(shù)據(jù)中的復(fù)雜關(guān)系,Swish 激活函數(shù)就是此類激活函數(shù)之一,在本文中,我們將深入研究 Swish 激活函數(shù),提供數(shù)學(xué)公式,探索其相對于 ReLU 的優(yōu)勢,并使用 PyTorch 演示其實(shí)現(xiàn)2023-11-11
selenium XPath定位的實(shí)現(xiàn)示例
XPath是一種在XML文檔中定位和選擇節(jié)點(diǎn)的語言,通過路徑表達(dá)式遍歷XML樹,支持節(jié)點(diǎn)選取、字符串匹配、數(shù)值計算、邏輯運(yùn)算等功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
在Django中實(shí)現(xiàn)定時任務(wù)的多種方法
在 Django 項目中實(shí)現(xiàn)定時任務(wù)可以幫助自動化執(zhí)行一些后臺任務(wù),如數(shù)據(jù)清理、定期報告生成等,以下是幾種常見的實(shí)現(xiàn)方式,每種方法都有其獨(dú)特的優(yōu)勢和適用場景,感興趣的小伙伴跟著小編一起來看看吧2024-08-08
Python BeautifulSoup基本用法詳解(通過標(biāo)簽及class定位元素)
這篇文章主要介紹了Python BeautifulSoup基本用法(通過標(biāo)簽及class定位元素),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
pycharm軟件實(shí)現(xiàn)設(shè)置自動保存操作
這篇文章主要介紹了pycharm軟件實(shí)現(xiàn)設(shè)置自動保存操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

