圖文詳解感知機(jī)算法原理及Python實(shí)現(xiàn)
寫(xiě)在前面
機(jī)器學(xué)習(xí)強(qiáng)基計(jì)劃聚焦深度和廣度,加深對(duì)機(jī)器學(xué)習(xí)模型的理解與應(yīng)用。“深”在詳細(xì)推導(dǎo)算法模型背后的數(shù)學(xué)原理;“廣”在分析多個(gè)機(jī)器學(xué)習(xí)模型:決策樹(shù)、支持向量機(jī)、貝葉斯與馬爾科夫決策、強(qiáng)化學(xué)習(xí)等。
本期目標(biāo):實(shí)現(xiàn)這樣一個(gè)效果

1.什么是線性模型
線性模型的假設(shè)形式是屬性權(quán)重、偏置與屬性的線性組合,即

稱(chēng)為廣義線性模型(generalized linear model),其中g(shù)(⋅)稱(chēng)為聯(lián)系函數(shù)(link function)。
廣義線性模型本質(zhì)上仍是線性的,但通過(guò)g(⋅)進(jìn)行非線性映射,使之具有更強(qiáng)的擬合能力,類(lèi)似神經(jīng)元的激活函數(shù)。例如對(duì)數(shù)線性回歸(log-linear regression)是g(⋅)=ln(⋅)時(shí)的情形,此時(shí)模型擁有了指數(shù)逼近的性質(zhì)。
線性模型的優(yōu)點(diǎn)是形式簡(jiǎn)單、易于建模、可解釋性強(qiáng),是更復(fù)雜非線性模型的基礎(chǔ)。
2.感知機(jī)概述
感知機(jī)(Perceptron)是最簡(jiǎn)單的二分類(lèi)線性模型,也是神經(jīng)網(wǎng)絡(luò)的起源算法,如圖所示。

y=w^Tx^是 Rd空間的一條直線,因此感知機(jī)實(shí)質(zhì)上是通過(guò)訓(xùn)練參數(shù)w^改變直線位置,直至將訓(xùn)練集分類(lèi)完全,如圖所示,或者參考文章開(kāi)頭的動(dòng)圖。

3.手推感知機(jī)原理
機(jī)器學(xué)習(xí)強(qiáng)基計(jì)劃的初衷就是搞清楚每個(gè)算法、每個(gè)模型的數(shù)學(xué)原理,讓我們開(kāi)始吧!
感知機(jī)的損失函數(shù)定義為全體誤分類(lèi)點(diǎn)到感知機(jī)切割超平面的距離之和:

對(duì)于二分類(lèi)問(wèn)題y∈{−1,1},則誤分類(lèi)點(diǎn)的判斷方法為


這在二分類(lèi)問(wèn)題中是個(gè)很常用的技巧,后面還會(huì)遇到這種等效形式。
從而損失函數(shù)也可簡(jiǎn)化為下面的形式以便于求導(dǎo):

方程兩邊同時(shí)乘以系數(shù)都成立,所以直線系數(shù) w^可以隨意縮放,這里可令|w^|=1
若采用梯度下降法進(jìn)行優(yōu)化(梯度法可參考圖文詳解梯度下降算法的原理及Python實(shí)現(xiàn)),則算法流程為:

4.Python實(shí)現(xiàn)
4.1 創(chuàng)建感知機(jī)類(lèi)
class Perceptron:
def __init__(self):
self.w = np.mat([0,0]) # 初始化權(quán)重
self.b = 0 # 初始化偏置
self.delta = 1 # 設(shè)置學(xué)習(xí)率為1
self.train_set = [[np.mat([3, 3]), 1], [np.mat([4, 3]), 1], [np.mat([1, 1]), -1]] # 設(shè)置訓(xùn)練集
self.history = [] # 訓(xùn)練歷史
4.2 更新權(quán)重與偏置
def update(self,error_point):
self.w += self.delta*error_point[1]*error_point[0]
self.b += self.delta*error_point[1]
self.history.append([self.w.tolist()[0],self.b])
4.3 判斷誤分類(lèi)點(diǎn)
def judge(self,point):
return point[1]*(self.w*point[0].T+self.b)
4.4 訓(xùn)練感知機(jī)
def train(self):
flag = True
while(flag):
count = 0
for point in self.train_set:
if(self.judge(point)<=0):
self.update(point)
else:
count += 1
if(count == len(self.train_set)):
flag = False
4.5 動(dòng)圖可視化
def show():
print("參數(shù)w,b更新過(guò)程:",perceptron.history)
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(perceptron.history),
interval=1000, repeat=False,blit=True)
plt.show()

5.總結(jié)
感知機(jī)最大的缺陷在于其線性,單個(gè)感知機(jī)只能表達(dá)一條直線,即使是如圖(a)所示簡(jiǎn)單的異或門(mén)樣本,都無(wú)法進(jìn)行分類(lèi)。對(duì)此有兩種解決方式:
通過(guò)多條直線,即多層感知機(jī)(Multi-Layer Perceptron, MLP)進(jìn)行分類(lèi),如圖(b)所示;在線性加權(quán)的基礎(chǔ)上引入非線性變換,如圖(c)所示。

到此這篇關(guān)于圖文詳解感知機(jī)算法原理及Python實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python感知機(jī)算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python設(shè)計(jì)模式結(jié)構(gòu)型享元模式
這篇文章主要介紹了Python享元模式,享元模式即Flyweight Pattern,指運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象,下面和小編一起進(jìn)入文章了解更多詳細(xì)內(nèi)容吧2022-02-02
numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法
今天小編就為大家分享一篇numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
python從入門(mén)到精通 windows安裝python圖文教程
這篇文章主要為大家詳細(xì)介紹了python從入門(mén)到精通,windows安裝python圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
pytorch訓(xùn)練神經(jīng)網(wǎng)絡(luò)爆內(nèi)存的解決方案
這篇文章主要介紹了pytorch訓(xùn)練神經(jīng)網(wǎng)絡(luò)爆內(nèi)存的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Python基于matplotlib畫(huà)箱體圖檢驗(yàn)異常值操作示例【附xls數(shù)據(jù)文件下載】
這篇文章主要介紹了Python基于matplotlib畫(huà)箱體圖檢驗(yàn)異常值操作,涉及Python針對(duì)xls格式數(shù)據(jù)文件的讀取、matplotlib圖形繪制等相關(guān)操作技巧,并附帶xls數(shù)據(jù)文件供讀者下載參考,需要的朋友可以參考下2019-01-01
pytorch?dataset實(shí)戰(zhàn)案例之讀取數(shù)據(jù)集的代碼
這篇文章主要介紹了pytorch?dataset實(shí)戰(zhàn)案例讀取數(shù)據(jù)集的相關(guān)知識(shí),這段代碼可以作為讀取數(shù)據(jù)集的一個(gè)DataSet類(lèi)的基礎(chǔ)類(lèi),可以擴(kuò)充進(jìn)行修改,以后有類(lèi)似需要可以拿過(guò)來(lái)修改,本文結(jié)合實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10
python+selenium 鼠標(biāo)事件操作方法
今天小編就為大家分享一篇python+selenium 鼠標(biāo)事件操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

