官术网_书友最值得收藏!

2.2 用Python實(shí)現(xiàn)感知器學(xué)習(xí)算法

在上一節(jié),我們學(xué)習(xí)了Rosenblatt感知器規(guī)則的工作機(jī)制,現(xiàn)在讓我們用Python進(jìn)行實(shí)現(xiàn),并將其應(yīng)用于第1章所介紹的鳶尾花數(shù)據(jù)集。

2.2.1 面向?qū)ο蟮母兄鰽PI

本章將用面向?qū)ο蟮姆椒ò迅兄鹘涌诙x為一個(gè)Python類,它允許初始化新的Perceptron對(duì)象,這些對(duì)象可以通過fit方法從數(shù)據(jù)中學(xué)習(xí),并通過單獨(dú)的predict方法進(jìn)行預(yù)測(cè)。雖然在創(chuàng)建時(shí)未初始化對(duì)象,但可以通過調(diào)用該對(duì)象的其他方法,作為約定,我們?cè)趯傩缘暮竺嫣砑酉聞澗€(_)來表達(dá),例如self.w_

008-01

與Python相關(guān)的其他科學(xué)計(jì)算資源

如果對(duì)Python科學(xué)庫(kù)不熟或需要回顧,請(qǐng)參考下面的資源:

  • NumPy:https://sebastianraschka.com/pdf/books/dlb/appendix_f_numpy-intro.pdf
  • pandas:https://pandas.pydata.org/pandasdocs/stable/10min.html
  • Matplotlib:https://matplotlib.org/tutorials/introductory/usage.html

下面的Python代碼實(shí)現(xiàn)了感知器:

032-01
033-01

依托這段感知器代碼,我們可以用學(xué)習(xí)速率eta和學(xué)習(xí)次數(shù)n_iter(遍歷訓(xùn)練數(shù)據(jù)集的次數(shù))來初始化新的Perceptron對(duì)象。

通過fit方法初始化self.w_的權(quán)重為向量033-02,m代表數(shù)據(jù)集的維數(shù)或特征數(shù),為偏置單元向量的第一個(gè)分量+1。請(qǐng)記住該向量的第一個(gè)分量self.w_[0]代表前面討論過的偏置單元。

另外,該向量包含來源于正態(tài)分布的小隨機(jī)數(shù),通過調(diào)用rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])產(chǎn)生標(biāo)準(zhǔn)差為0.01的正態(tài)分布,其中rgen為NumPy隨機(jī)數(shù)生成器,隨機(jī)種子由用戶指定,因此可以保證在需要時(shí)可以重現(xiàn)以前的結(jié)果。

不把權(quán)重初始化為零的原因是,只有當(dāng)權(quán)重初始化為非零的值時(shí),學(xué)習(xí)速率η(eta)才會(huì)影響分類的結(jié)果。如果把所有的權(quán)重都初始化為零,那么學(xué)習(xí)速率參數(shù)η(eta)只會(huì)影響權(quán)重向量的大小,而無法影響其方向。如果你熟悉三角函數(shù),考慮一下向量v1=[1 2 3],v1和向量v2=0.5×v1之間的角度將會(huì)是0,參見下面的代碼片段:

033-03

這里np.arccos為三角反余弦函數(shù),np.linalg.norm是計(jì)算向量長(zhǎng)度的函數(shù)(隨機(jī)數(shù)從隨機(jī)正態(tài)分布而不是均勻分布中抽取,以及選擇標(biāo)準(zhǔn)偏差為0.01,這些決定是任意的。記住,只對(duì)小隨機(jī)值感興趣的目的是避免前面討論過的所有向量為零的情況)。

008-01

NumPy數(shù)組的索引

對(duì)一維數(shù)組,NumPy索引與用[]表達(dá)的Python列表類似。對(duì)二維數(shù)組,第一個(gè)元素為行,第二個(gè)元素為列。例如用X[2, 3]來指二維數(shù)組X的第三行第四列。

初始化權(quán)重后,調(diào)用fit方法遍歷訓(xùn)練數(shù)據(jù)集的所有樣本,并根據(jù)我們?cè)谇耙还?jié)中討論過的感知器學(xué)習(xí)規(guī)則來更新權(quán)重。

為了獲得分類標(biāo)簽以更新權(quán)重,fit方法在訓(xùn)練時(shí)調(diào)用predict來預(yù)測(cè)分類標(biāo)簽。但是也可以在模型擬合后調(diào)用predict來預(yù)測(cè)新數(shù)據(jù)的標(biāo)簽。另外,我們也把在每次迭代中收集的分類錯(cuò)誤記入self.errors_列表,用于后期分析訓(xùn)練階段感知器的性能。用net_input方法中的np.dot函數(shù)來計(jì)算向量點(diǎn)積wTx

008-01

對(duì)數(shù)組ab的向量點(diǎn)積計(jì)算,在純Python中,我們可以用sum([i * j for i, j in zip(a, b)])來實(shí)現(xiàn),而在NumPy中,用a.dot(b)或者np.dot(a, b)來完成。然而,與傳統(tǒng)Python相比,NumPy的好處是算術(shù)運(yùn)算向量化。向量化意味著基本的算術(shù)運(yùn)算自動(dòng)應(yīng)用在數(shù)組的所有元素上。把算術(shù)運(yùn)算形成一連串的數(shù)組指令,而不是對(duì)每個(gè)元素完成一套操作,這樣就能更好地使用現(xiàn)代CPU的單指令多數(shù)據(jù)支持(SIMD)架構(gòu)。另外,NumPy采用高度優(yōu)化的以C或Fortran語(yǔ)言編寫的線性代數(shù)庫(kù),諸如基本線性代數(shù)子程序(BLAS)和線性代數(shù)包(LAPACK)。最后,NumPy也允許用線性代數(shù)的基本知識(shí)(像向量和矩陣點(diǎn)積)以更加緊湊和自然的方式編寫代碼。

2.2.2 在鳶尾花數(shù)據(jù)集上訓(xùn)練感知器模型

為了測(cè)試前面實(shí)現(xiàn)的感知器,本章余下部分的分析和示例將僅限于兩個(gè)特征變量(維度)。雖然感知器規(guī)則并不局限于兩個(gè)維度,但是為了學(xué)習(xí)方便,只考慮萼片長(zhǎng)度和花瓣長(zhǎng)度兩個(gè)特征,將有利于我們?cè)谏Ⅻc(diǎn)圖上可視化訓(xùn)練模型的決策區(qū)域。

請(qǐng)記住,這里的感知器是二元分類器,為此我們僅考慮鳶尾花數(shù)據(jù)集中的山鳶尾和變色鳶尾兩種花。然而,感知器算法可以擴(kuò)展到多元分類,例如通過一對(duì)多(OvA)技術(shù)。

008-01

多元分類的OvA方法

OvA有時(shí)也被稱為一對(duì)其余(OvR),是可以把分類器從二元擴(kuò)展到多元的一種技術(shù)。OvA可以為每個(gè)類訓(xùn)練一個(gè)分類器,所訓(xùn)練的類被視為正類,所有其他類的樣本都被視為負(fù)類。假設(shè)要對(duì)新的數(shù)據(jù)樣本進(jìn)行分類,就可以用n個(gè)分類器,其中n為分類標(biāo)簽的數(shù)量,并以最高的置信度為特定樣本分配分類標(biāo)簽。在感知器的場(chǎng)景下,將用OvA來選擇與最大凈輸入值相關(guān)的分類標(biāo)簽。

首先,可以用pandas庫(kù)從UCI機(jī)器學(xué)習(xí)庫(kù)把鳶尾花數(shù)據(jù)集直接加載到DataFrame對(duì)象,然后用tail方法把最后5行數(shù)據(jù)列出來以確保數(shù)據(jù)加載的正確性,如圖2-5所示。

035-01
035-02

圖 2-5

008-01

加載鳶尾花數(shù)據(jù)集

如果無法上網(wǎng)或UCI的服務(wù)器(https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data)宕機(jī),你可以直接從本書的代碼集找到鳶尾花數(shù)據(jù)集(也包括本書所有其他的數(shù)據(jù)集)。可如下從本地文件目錄加載鳶尾花數(shù)據(jù),用

035-03

替換:

035-04

接下來,提取與50朵山鳶尾花和50朵變色鳶尾花相對(duì)應(yīng)的前100個(gè)分類標(biāo)簽,然后將其轉(zhuǎn)換為整數(shù)型的分類標(biāo)簽1(versicolor)和-1(setosa),并存入向量y,再通過調(diào)用pandas的DataFramevalue方法獲得相應(yīng)的NumPy表達(dá)式。

同樣,可以從100個(gè)訓(xùn)練樣本中提取特征的第一列(萼片長(zhǎng)度)和第三列(花瓣長(zhǎng)度),并將它們存入特征矩陣X,然后經(jīng)過可視化處理形成二維散點(diǎn)圖:

036-01

執(zhí)行前面的代碼示例可以看到圖2-6所示的二維散點(diǎn)圖。

036-02

圖 2-6

前面的散點(diǎn)圖顯示了鳶尾花數(shù)據(jù)集的樣本在花瓣長(zhǎng)度和萼片長(zhǎng)度兩個(gè)特征軸之間的分布情況。從這個(gè)二維特征子空間中可以看到,一個(gè)線性的決策邊界足以把山鳶尾花與變色山鳶尾花區(qū)分開。

因此,像感知器這樣的線性分類器應(yīng)該能夠完美地對(duì)數(shù)據(jù)集中的花朵進(jìn)行分類。

現(xiàn)在是在鳶尾花數(shù)據(jù)集上訓(xùn)練感知器算法的時(shí)候了。此外,我們還將繪制每次迭代的分類錯(cuò)誤,以檢查算法是否收斂,并找到分隔兩類鳶尾花的決策邊界:

036-03

執(zhí)行前面的代碼,我們可以看到分類錯(cuò)誤與迭代次數(shù)之間的關(guān)系,如圖2-7所示。

037-01

圖 2-7

正如從圖2-7中可以看到的那樣,感知器在第六次迭代后開始收斂,現(xiàn)在我們應(yīng)該能夠完美地對(duì)訓(xùn)練樣本進(jìn)行分類了。下面通過實(shí)現(xiàn)一個(gè)短小精干的函數(shù)來完成二維數(shù)據(jù)集決策邊界的可視化:

037-02

首先,我們通過ListedColormap根據(jù)顏色列表來定義一些顏色和標(biāo)記并創(chuàng)建色度圖。然后,確定兩個(gè)特征的最小值和最大值,通過調(diào)用NumPy的meshgrid函數(shù),利用特征向量來創(chuàng)建網(wǎng)格數(shù)組對(duì)xx1xx2。因?yàn)槭窃趦蓚€(gè)特征維度上訓(xùn)練感知器分類器,所以我們需要對(duì)網(wǎng)格數(shù)組進(jìn)行扁平化,以創(chuàng)建一個(gè)與鳶尾花訓(xùn)練數(shù)據(jù)子集相同列數(shù)的矩陣,這樣就可以調(diào)用predict方法來預(yù)測(cè)相應(yīng)網(wǎng)格點(diǎn)的分類標(biāo)簽z

在把預(yù)測(cè)獲得的分類標(biāo)簽z改造成與xx1xx2相同維數(shù)的網(wǎng)格后,現(xiàn)在可以通過調(diào)用Matplotlib的contourf函數(shù)畫出輪廓圖,把網(wǎng)格數(shù)組中的每個(gè)預(yù)測(cè)分類結(jié)果標(biāo)注在不同顏色的決策區(qū)域:

038-01

執(zhí)行示例代碼后,我們可以看到圖2-8所示的決策區(qū)域。

038-02

圖 2-8

如圖2-8所示,感知器通過學(xué)習(xí)掌握了決策邊界,從而完美地為鳶尾花訓(xùn)練數(shù)據(jù)子集分類。

008-01

感知器收斂

雖然感知器可以完美地區(qū)分兩類鳶尾花,但收斂是感知器的最大問題之一。Frank Rosenblatt從數(shù)學(xué)上證明,如果兩個(gè)類可以通過一個(gè)線性超平面分離,那么感知器學(xué)習(xí)規(guī)則可以收斂。然而,如果兩個(gè)類不能被這樣的線性決策邊界完全分隔,那么除非設(shè)定最大的迭代次數(shù),否則算法將永遠(yuǎn)都不會(huì)停止權(quán)重更新。有興趣的讀者可以從下述網(wǎng)站找到我的講義中關(guān)于該問題的證明概述:https://sebastianraschka.com/pdf/lecture-notes/stat479ss19/L03_perceptron_slides.pdf。

主站蜘蛛池模板: 凤阳县| 温州市| 兖州市| 郧西县| 定州市| 嵩明县| 额敏县| 永修县| 昌都县| 卓资县| 兰溪市| 阳东县| 龙山县| 红河县| 宜宾县| 崇左市| 荆州市| 讷河市| 禹城市| 永昌县| 华阴市| 夹江县| 乐安县| 抚远县| 苏州市| 临泽县| 宁明县| 霸州市| 永靖县| 嵊泗县| 金阳县| 克东县| 通江县| 诏安县| 广东省| 富民县| 黄骅市| 边坝县| 台北县| 宜春市| 噶尔县|