偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

僅需六步,從零實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法

開(kāi)發(fā) 開(kāi)發(fā)工具 機(jī)器學(xué)習(xí) 算法
本文以感知器為例,介紹了從零實(shí)現(xiàn)機(jī)器學(xué)習(xí)方法的具體步驟以及重要性。這是一種在更深層次上學(xué)習(xí)算法的好方法,而你還可以自己實(shí)現(xiàn)它。

從頭開(kāi)始寫(xiě)機(jī)器學(xué)習(xí)算法能夠獲得很多經(jīng)驗(yàn)。當(dāng)你最終完成時(shí),你會(huì)驚喜萬(wàn)分,而且你明白這背后究竟發(fā)生了什么。

有些算法比較復(fù)雜,我們不從簡(jiǎn)單的算法開(kāi)始,而是要從非常簡(jiǎn)單的算法開(kāi)始,比如單層感知器。

機(jī)器學(xué)習(xí)算法

本文以感知器為例,通過(guò)以下 6 個(gè)步驟引導(dǎo)你從頭開(kāi)始寫(xiě)算法:

  • 對(duì)算法有基本的了解
  • 找到不同的學(xué)習(xí)資源
  • 將算法分解成塊
  • 從簡(jiǎn)單的例子開(kāi)始
  • 用可信的實(shí)現(xiàn)進(jìn)行驗(yàn)證
  • 寫(xiě)下你的過(guò)程

一、基本了解

不了解基礎(chǔ)知識(shí),就無(wú)法從頭開(kāi)始處理算法。至少,你要能回答下列問(wèn)題:

  • 它是什么?
  • 它一般用在什么地方?
  • 什么時(shí)候不能用它?

就感知器而言,這些問(wèn)題的答案如下:

  • 單層感知器是最基礎(chǔ)的神經(jīng)網(wǎng)絡(luò),一般用于二分類問(wèn)題(1 或 0,「是」或「否」)。
  • 它可以應(yīng)用在一些簡(jiǎn)單的地方,比如情感分析(積極反應(yīng)或消極反應(yīng))、貸款違約預(yù)測(cè)(「會(huì)違約」,「不會(huì)違約」)。在這兩種情況中,決策邊界都是線性的。
  • 當(dāng)決策邊界是非線性的時(shí)候不能使用感知器,要用不同的方法。

機(jī)器學(xué)習(xí)算法

二、借助不同的學(xué)習(xí)資源

在對(duì)模型有了基本了解之后,就可以開(kāi)始研究了。有人用教科書(shū)學(xué)得更好,而有人用視頻學(xué)得更好。就我而言,我喜歡到處轉(zhuǎn)轉(zhuǎn),用各種各樣的資源學(xué)習(xí)。

如果是學(xué)數(shù)學(xué)細(xì)節(jié)的話,書(shū)的效果很好(參見(jiàn):

https://www.dataoptimal.com/data-science-books-2018/),但對(duì)于更實(shí)際的例子,我更推薦博客和 YouTube 視頻。

以下列舉了一些關(guān)于感知器不錯(cuò)的資源:

書(shū):

  • 《統(tǒng)計(jì)學(xué)習(xí)基礎(chǔ)》(The Elements of Statistical Learning),第 4.5.1 節(jié)(https://web.stanford.edu/~hastie/Papers/ESLII.pdf)
  • 《深入理解機(jī)器學(xué)習(xí):從原理到算法》,第 21.4 節(jié)(https://www.cs.huji.ac.il/~shais/UnderstandingMachineLearning/understanding-machine-learning-theory-algorithms.pdf)

博客:

  • Jason Brownlee 寫(xiě)的《如何用 Python 從零開(kāi)始實(shí)現(xiàn)感知器算法》(https://machinelearningmastery.com/implement-perceptron-algorithm-scratch-python/)
  • Sebastian Raschka 寫(xiě)的《單層神經(jīng)網(wǎng)絡(luò)和梯度下降》(https://sebastianraschka.com/Articles/2015_singlelayer_neurons.html)

視頻:

  • 感知器訓(xùn)練(https://www.youtube.com/watch?v=5g0TPrxKK6o)
  • 感知器算法的工作原理(https://www.youtube.com/watch?v=1XkjVl-j8MM)

三、將算法分解成塊

現(xiàn)在我們已經(jīng)收集好了資料,是時(shí)候開(kāi)始學(xué)習(xí)了。與其從頭讀一個(gè)章節(jié)或者一篇博客,不如先瀏覽章節(jié)標(biāo)題和其他重要信息。寫(xiě)下要點(diǎn),并試著概述算法。

在看過(guò)這些資料之后,我將感知器分成下列 5 個(gè)模塊:

  • 初始化權(quán)重
  • 將輸入和權(quán)重相乘之后再求和
  • 比較上述結(jié)果和閾值,計(jì)算輸出(1 或 0)
  • 更新權(quán)重
  • 重復(fù)

接下來(lái)我們?cè)敿?xì)敘述每一個(gè)模塊的內(nèi)容。

1. 初始化權(quán)重

(1) 首先,我們要初始化權(quán)重向量。

權(quán)重?cái)?shù)量要和特征數(shù)量相同。假設(shè)我們有三個(gè)特征,權(quán)重向量如下圖所示。權(quán)重向量一般會(huì)初始化為 0,此例中將一直采用該初始化值。

(2) 輸入和權(quán)重相乘再求和

接下來(lái),我們就要將輸入和權(quán)重相乘,再對(duì)其求和。為了更易于理解,我給***行中的權(quán)重及其對(duì)應(yīng)特征涂上了顏色。

在我們將特征和權(quán)重相乘之后,對(duì)乘積求和。一般將其稱為點(diǎn)積。

最終結(jié)果是 0,此時(shí)用「f」表示這個(gè)暫時(shí)的結(jié)果。

(3) 和閾值比較

計(jì)算出點(diǎn)積后,我們要將它和閾值進(jìn)行比較。我將閾值定為 0,你可以用這個(gè)閾值,也可以試一下其他值。

由于之前計(jì)算出的點(diǎn)積「f」為 0,不比閾值 0 大,因此估計(jì)值也等于 0。

將估計(jì)值標(biāo)記為「y hat」,y hat 的下標(biāo) 0 對(duì)應(yīng)的是***行。當(dāng)然你也可以用 1 表示***行,這無(wú)關(guān)緊要,我選擇從 0 開(kāi)始。

如果將這個(gè)結(jié)果和真值比較的話,可以看出我們當(dāng)前的權(quán)重沒(méi)有正確地預(yù)測(cè)出真實(shí)的輸出。

由于我們的預(yù)測(cè)錯(cuò)了,因此要更新權(quán)重,這就要進(jìn)行下一步了。

(4) 更新權(quán)重

我們要用到下面的等式:

基本思想是在迭代「n」時(shí)調(diào)整當(dāng)前權(quán)重,這樣我們將在下一次迭代「n+1」時(shí)得到新權(quán)重。

為了調(diào)整權(quán)重,我們需要設(shè)定「學(xué)習(xí)率」,用希臘字母「eta(η)」標(biāo)記。我將學(xué)習(xí)率設(shè)為 0.1,當(dāng)然就像閾值一樣,你也可以用不同的數(shù)值。

目前本教程主要介紹了:

現(xiàn)在我們要繼續(xù)計(jì)算迭代 n=2 時(shí)的新權(quán)重了。

我們成功完成了感知器算法的***次迭代。

(5) 重復(fù)

由于我們的算法沒(méi)能計(jì)算出正確的輸出,因此還要繼續(xù)。

一般需要進(jìn)行大量的迭代。遍歷數(shù)據(jù)集中的每一行,每一次迭代都要更新權(quán)重。一般將完整遍歷一次數(shù)據(jù)集稱為一個(gè)「epoch」。

我們的數(shù)據(jù)集有 3 行,因此如果要完成 1 個(gè) epoch 需要經(jīng)歷 3 次迭代。我們也可以設(shè)置迭代總數(shù)或 epoch 數(shù)來(lái)執(zhí)行算法,比如指定 30 次迭代(或 10 個(gè) epoch)。與閾值和學(xué)習(xí)率一樣,epoch 也是可以隨意使用的參數(shù)。

在下一次迭代中,我們將使用第二行特征。

此處不再重復(fù)計(jì)算過(guò)程,下圖給出了下一個(gè)點(diǎn)積的計(jì)算:

接著就可以比較該點(diǎn)積和閾值來(lái)計(jì)算新的估計(jì)值、更新權(quán)重,然后再繼續(xù)。如果我們的數(shù)據(jù)是線性可分的,那么感知器最終將會(huì)收斂。

五、從簡(jiǎn)單的例子開(kāi)始

我們已經(jīng)將算法分解成塊了,接下來(lái)就可以開(kāi)始用代碼實(shí)現(xiàn)它了。

簡(jiǎn)單起見(jiàn),我一般會(huì)以非常小的「玩具數(shù)據(jù)集」開(kāi)始。對(duì)這類問(wèn)題而言,有一個(gè)很好的小型線性可分?jǐn)?shù)據(jù)集,它就是與非門(mén)(NAND gate)。這是數(shù)字電路中一種常見(jiàn)的邏輯門(mén)。

由于這個(gè)數(shù)據(jù)集很小,我們可以手動(dòng)將其輸入到 Python 中。我添加了一列值為 1 的虛擬特征(dummy feature)「x0」,這樣模型就可以計(jì)算偏置項(xiàng)了。你可以將偏置項(xiàng)視為可以促使模型正確分類的截距項(xiàng)。

以下是輸入數(shù)據(jù)的代碼:

  1. # Importing libraries 
  2. # NAND Gate 
  3. # Note: x0 is a dummy variable for the bias term 
  4. #     x0  x1  x2 
  5. x = [[1., 0., 0.], 
  6.      [1., 0., 1.], 
  7.      [1., 1., 0.], 
  8.      [1., 1., 1.]] 
  9.  
  10. y =[1., 
  11.     1., 
  12.     1., 
  13.     0.] 

與前面的章節(jié)一樣,我將逐步完成算法、編寫(xiě)代碼并對(duì)其進(jìn)行測(cè)試。

1.初始化權(quán)重

***步是初始化權(quán)重。

  1. # Initialize the weights 
  2. import numpy as np 
  3. w = np.zeros(len(x[0])) 
  1. Out: 
  2. [ 0.  0.  0.] 

注意權(quán)重向量的長(zhǎng)度要和特征長(zhǎng)度相匹配。以 NAND 門(mén)為例,它的長(zhǎng)度是 3。

2.將權(quán)重和輸入相乘并對(duì)其求和

我們可以用 Numpy 輕松執(zhí)行該運(yùn)算,要用的方法是 .dot()。

從權(quán)重向量和***行特征的點(diǎn)積開(kāi)始。

  1. # Dot Product 
  2. f = np.dot(w, x[0]) 
  3. print f 
  1. Out: 
  2. 0.0 

如我們所料,結(jié)果是 0。為了與前面的筆記保持連貫性,設(shè)點(diǎn)積為變量「f」。

3.與閾值相比較

為了與前文保持連貫,將閾值「z」設(shè)為 0。若點(diǎn)積「f」大于 0,則預(yù)測(cè)值為 1,否則,預(yù)測(cè)值為 0。將預(yù)測(cè)值設(shè)為變量 yhat。

  1. # Activation Function 
  2. z = 0.0 
  3. if f > z: 
  4.     yhat = 1
  5. else: 
  6.     yhat = 0
  7.  
  8. print yhat 
  1. Out: 
  2. 0.0 

正如我們所料,預(yù)測(cè)值是 0。

你可能注意到了在上文代碼的注釋中,這一步被稱為「激活函數(shù)」。這是對(duì)這部分內(nèi)容的更正式的描述。

從 NAND 輸出的***行可以看到實(shí)際值是 1。由于預(yù)測(cè)值是錯(cuò)的,因此需要繼續(xù)更新權(quán)重。

4.更新權(quán)重

現(xiàn)在已經(jīng)做出了預(yù)測(cè),我們準(zhǔn)備更新權(quán)重。

  1. # Update the weights 
  2. eta = 0.1 
  3. w[0] = w[0] + eta*(y[0] - yhat)*x[0][0] 
  4. w[1] = w[1] + eta*(y[0] - yhat)*x[0][1] 
  5. w[2] = w[2] + eta*(y[0] - yhat)*x[0][2] 
  6.  
  7. print w 
  1. Out: 
  2. [ 0.1  0.   0. ] 

要像前文那樣設(shè)置學(xué)習(xí)率。為與前文保持一致,將學(xué)習(xí)率 η 的值設(shè)為 0.1。為了便于閱讀,我將對(duì)每次權(quán)重的更新進(jìn)行硬編碼。

權(quán)重更新完成。

5.重復(fù)

現(xiàn)在我們完成了每一個(gè)步驟,接下來(lái)就可以把它們組合在一起了。

我們尚未討論的***一步是損失函數(shù),我們需要將其最小化,它在本例中是誤差項(xiàng)平方和。

我們要用它來(lái)計(jì)算誤差,然后看模型的性能。

把它們都放在一起,就是完整的函數(shù):

  1. import numpy as np 
  2.  
  3.  
  4. # Perceptron function 
  5. def perceptron(x, y, z, eta, t): 
  6.     ''' 
  7.     Input Parameters: 
  8.         x: data set of input features 
  9.         y: actual outputs 
  10.         z: activation function threshold 
  11.         eta: learning rate 
  12.         t: number of iterations 
  13.     ''' 
  14.  
  15.     # initializing the weights 
  16.     w = np.zeros(len(x[0]))       
  17.     n = 0                         
  18.  
  19.     # initializing additional parameters to compute sum-of-squared errors 
  20.     yhat_vec = np.ones(len(y))     # vector for predictions 
  21.     errors = np.ones(len(y))       # vector for errors (actual - predictions) 
  22.     J = []                         # vector for the SSE cost function 
  23.  
  24.     while n < t: for i in xrange(0, len(x)): # dot product f = np.dot(x[i], w) # activation function if f >= z:                                
  25.                 yhat = 1.                                
  26.             else:                                    
  27.                 yhat = 0
  28.             yhat_vec[i] = yhat 
  29.  
  30.             # updating the weights 
  31.             for j in xrange(0, len(w)):              
  32.                 w[j] = w[j] + eta*(y[i]-yhat)*x[i][j] 
  33.  
  34.         n += 1 
  35.         # computing the sum-of-squared errors 
  36.         for i in xrange(0,len(y)):      
  37.            errors[i] = (y[i]-yhat_vec[i])**2 
  38.         J.append(0.5*np.sum(errors)) 
  39.  
  40.     return w, J 

現(xiàn)在已經(jīng)編寫(xiě)了完整的感知器代碼,接著是運(yùn)行代碼:

  1. #     x0  x1  x2 
  2. x = [[1., 0., 0.], 
  3.      [1., 0., 1.], 
  4.      [1., 1., 0.], 
  5.      [1., 1., 1.]] 
  6.  
  7. y =[1., 
  8.     1., 
  9.     1., 
  10.     0.] 
  11.  
  12. z = 0.0 
  13. eta = 0.1 
  14. t = 50 
  15.  
  16. print "The weights are:" 
  17. print perceptron(x, y, z, eta, t)[0] 
  18.  
  19. print "The errors are:" 
  20. print perceptron(x, y, z, eta, t)[0] 

我們可以看到,第 6 次迭代時(shí)誤差趨近于 0,且在剩余迭代中誤差一直是 0。當(dāng)誤差趨近于 0 并保持為 0 時(shí),模型就收斂了。這告訴我們模型已經(jīng)正確「學(xué)習(xí)」了適當(dāng)?shù)臋?quán)重。

下一部分,我們將用計(jì)算好的權(quán)重在更大的數(shù)據(jù)集上進(jìn)行預(yù)測(cè)。

五、用可信的實(shí)現(xiàn)進(jìn)行驗(yàn)證

到目前為止,我們已經(jīng)找到了不同的學(xué)習(xí)資源、手動(dòng)完成了算法,并用簡(jiǎn)單的例子測(cè)試了算法。

現(xiàn)在要用可信的實(shí)現(xiàn)和我們的模型進(jìn)行比較了。我們使用的是 scikit-learn 中的感知器

(http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html)。

我們將按照以下幾步進(jìn)行比較:

  • 導(dǎo)入數(shù)據(jù)
  • 將數(shù)據(jù)分割為訓(xùn)練集和測(cè)試集
  • 訓(xùn)練感知器
  • 測(cè)試感知器
  • 和 scikit-learn 感知器進(jìn)行比較

1.導(dǎo)入數(shù)據(jù)

首先導(dǎo)入數(shù)據(jù)。你可以在這里

(https://github.com/dataoptimal/posts/blob/master/algorithms from scratch/dataset.csv)得到數(shù)據(jù)集的副本。這是我創(chuàng)建的線性可分?jǐn)?shù)據(jù)集,確保感知器可以起作用。為了確認(rèn),我們還將數(shù)據(jù)繪制成圖。

從圖中很容易看出來(lái),我們可以用一條直線將數(shù)據(jù)分開(kāi)。

  1. import pandas as pd 
  2. import numpy as np 
  3. import matplotlib.pyplot as plt 
  4.  
  5. df = pd.read_csv("dataset.csv") 
  6. plt.scatter(df.values[:,1], df.values[:,2], c = df['3'], alpha=0.8) 

text

在繼續(xù)之前,我先解釋一下繪圖的代碼。我用 Pandas 導(dǎo)入 csv,它可以自動(dòng)將數(shù)據(jù)放入 DataFrame 中。為了繪制數(shù)據(jù),我要將值從 DataFrame 中取出來(lái),因此我用了 .values 方法。特征在***列和第二列,因此我在散點(diǎn)圖函數(shù)中用了這些特征。第 0 列是值為 1 的虛擬特征,這樣就能計(jì)算截距。這與上一節(jié)中的 NAND 門(mén)操作相似。***,在散點(diǎn)圖函數(shù)中令 c = df['3'], alpha = 0.8 為兩個(gè)類著色。輸出是第三列數(shù)據(jù)(0 或 1),所以我告訴函數(shù)用列「3」給這兩個(gè)類著色。

你可以在此處(https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html)找到更多關(guān)于 Matplotlib 散點(diǎn)圖函數(shù)的信息。

2.將數(shù)據(jù)分割成訓(xùn)練集/測(cè)試集

現(xiàn)在我們已經(jīng)確定數(shù)據(jù)可線性分割,那么是時(shí)候分割數(shù)據(jù)了。

在與測(cè)試集不同的數(shù)據(jù)集上訓(xùn)練模型是很好的做法,這有助于避免過(guò)擬合。還有不同的方法,但是簡(jiǎn)單起見(jiàn),我要用一個(gè)訓(xùn)練集和一個(gè)測(cè)試集。首先打亂數(shù)據(jù)。

  1. dfdf = df.values   
  2.  
  3. np.random.seed(5) 
  4. np.random.shuffle(df) 

先將數(shù)據(jù)從 DataFrame 變?yōu)?numpy 數(shù)組。這樣就可以更容易地使用 numpy 函數(shù)了,比如 .shuffle。為了結(jié)果的可重復(fù)性,我設(shè)置了隨機(jī)種子 (5)。完成后,我試著改變隨機(jī)種子,并觀察結(jié)果會(huì)產(chǎn)生怎樣的變化。接下來(lái),我將 70% 的數(shù)據(jù)分為訓(xùn)練集,將 30% 的數(shù)據(jù)作為測(cè)試集。

  1. train = df[0:int(0.7*len(df))] 
  2. test = df[int(0.7*len(df)):int(len(df))] 

***一步是分離訓(xùn)練集和測(cè)試集的特征和輸出。

  1. x_train = train[:, 0:3] 
  2. y_train = train[:, 3] 
  3.  
  4. x_test = test[:, 0:3] 
  5. y_test = test[:, 3] 

我在這個(gè)例子中將 70% 的數(shù)據(jù)作為訓(xùn)練集,將 30% 的數(shù)據(jù)作為測(cè)試集,你們可以研究 k 折交叉驗(yàn)證等其他方法。

3.訓(xùn)練感知器

我們可以重復(fù)使用之前的章節(jié)中構(gòu)建的代碼。

  1. def perceptron_train(x, y, z, eta, t): 
  2.     ''' 
  3.     Input Parameters: 
  4.         x: data set of input features 
  5.         y: actual outputs 
  6.         z: activation function threshold 
  7.         eta: learning rate 
  8.         t: number of iterations 
  9.     ''' 
  10.  
  11.     # initializing the weights 
  12.     w = np.zeros(len(x[0]))       
  13.     n = 0                         
  14.  
  15.     # initializing additional parameters to compute sum-of-squared errors 
  16.     yhat_vec = np.ones(len(y))     # vector for predictions 
  17.     errors = np.ones(len(y))       # vector for errors (actual - predictions) 
  18.     J = []                         # vector for the SSE cost function 
  19.  
  20.     while n < t:          for i in xrange(0, len(x)):                                           # dot product             f = np.dot(x[i], w)                                   # activation function             if f >= z:                                
  21.                 yhat = 1.                                
  22.             else:                                    
  23.                 yhat = 0
  24.             yhat_vec[i] = yhat 
  25.  
  26.             # updating the weights 
  27.             for j in xrange(0, len(w)):              
  28.                 w[j] = w[j] + eta*(y[i]-yhat)*x[i][j] 
  29.  
  30.         n += 1 
  31.         # computing the sum-of-squared errors 
  32.         for i in xrange(0,len(y)):      
  33.            errors[i] = (y[i]-yhat_vec[i])**2 
  34.         J.append(0.5*np.sum(errors)) 
  35.  
  36.     return w, J 
  37.  
  38. z = 0.0 
  39. eta = 0.1 
  40. t = 50 
  41.  
  42. perceptron_train(x_train, y_train, z, eta, t) 

接下來(lái)看權(quán)重和誤差項(xiàng)平方和。

  1. w = perceptron_train(x_train, y_train, z, eta, t)[0] 
  2. J = perceptron_train(x_train, y_train, z, eta, t)[1] 
  3.  
  4. print w 
  5. print J 
  1. Out: 
  2. [-0.5        -0.29850122  0.35054929] 
  3. [4.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] 

現(xiàn)在權(quán)重對(duì)我們來(lái)說(shuō)意義不大了,但是我們?cè)跍y(cè)試感知器時(shí)還要再使用這些數(shù)值,以及用這些權(quán)重比較我們的模型和 scikit-learn 的模型。

根據(jù)誤差項(xiàng)平方和可以看出,感知器已經(jīng)收斂了,這是我們預(yù)料中的結(jié)果,因?yàn)閿?shù)據(jù)是線性可分的。

4.測(cè)試感知器

現(xiàn)在是時(shí)候測(cè)試感知器了。我們要建立一個(gè)小的 perceptron_test 函數(shù)來(lái)測(cè)試模型。與前文類似,這個(gè)函數(shù)取我們之前用 perceptron_train 函數(shù)和特征計(jì)算出的權(quán)重的點(diǎn)積以及激活函數(shù)進(jìn)行預(yù)測(cè)。之前唯一沒(méi)見(jiàn)過(guò)的只有 accuracy_score,這是 scikit-learn 中的評(píng)估指標(biāo)函數(shù)。

將所有的這些放在一起,代碼如下:

  1. from sklearn.metrics import accuracy_score 
  2.  
  3. w = perceptron_train(x_train, y_train, z, eta, t)[0] 
  4.  
  5. def perceptron_test(x, w, z, eta, t): 
  6.     y_pred = [] 
  7.     for i in xrange(0, len(x-1)): 
  8.         f = np.dot(x[i], w)    
  9.  
  10.         # activation function 
  11.         if f > z:                                
  12.             yhat = 1                                
  13.         else:                                    
  14.             yhat = 0 
  15.         y_pred.append(yhat) 
  16.     return y_pred 
  17.  
  18. y_pred = perceptron_test(x_test, w, z, eta, t) 
  19.  
  20. print "The accuracy score is:" 
  21. print accuracy_score(y_test, y_pred) 

得分為 1.0 表示我們的模型在所有的測(cè)試數(shù)據(jù)上都做出了正確的預(yù)測(cè)。因?yàn)閿?shù)據(jù)集明顯是可分的,所以結(jié)果正如我們所料。

5.和 scikit-learn 感知器進(jìn)行比較

***一步是將我們的感知器和 scikit-learn 的感知器進(jìn)行比較。下面的代碼是 scikit-learn 感知器的代碼:

  1. from sklearn.linear_model import Perceptron 
  2.  
  3. # training the sklearn Perceptron 
  4. clf = Perceptron(random_state=Noneeta0=0.1, shuffle=Falsefit_intercept=False
  5. clf.fit(x_train, y_train) 
  6. y_predict = clf.predict(x_test) 

現(xiàn)在我們已經(jīng)訓(xùn)練了模型,接下來(lái)要比較這個(gè)模型的權(quán)重和我們的模型計(jì)算出來(lái)的權(quán)重。

  1. Out: 
  2. sklearn weights: 
  3. [-0.5        -0.29850122  0.35054929] 
  4. my perceptron weights: 
  5. [-0.5        -0.29850122  0.35054929] 

scikit-learn 模型中的權(quán)重和我們模型的權(quán)重完全相同。這意味著我們的模型可以正確地工作,這是個(gè)好消息。

在結(jié)束之前還有一些小問(wèn)題。在 scikit-learn 模型中,我們將隨機(jī)狀態(tài)設(shè)置為「None」而且沒(méi)有打亂數(shù)據(jù)。這是因?yàn)槲覀円呀?jīng)設(shè)置了隨機(jī)種子,而且已經(jīng)打亂過(guò)數(shù)據(jù),不用再做一次。還需要將學(xué)習(xí)率 eta0 設(shè)置為 0.1,和我們的模型相同。***一點(diǎn)是截距。因?yàn)槲覀円呀?jīng)設(shè)置了值為 1 的虛擬特征列,因此模型可以自動(dòng)擬合截距,所以不必在 scikit-learn 感知器中打開(kāi)它。

這些看似都是小細(xì)節(jié),但是如果不設(shè)置它們的話,我們的模型就無(wú)法重復(fù)得到相同的結(jié)果。這是重點(diǎn)。在使用模型之前,閱讀文檔并了解不同的設(shè)置有什么作用非常重要。

六、寫(xiě)下你的過(guò)程

這是該過(guò)程的***一步,可能也是最重要的一步。

你剛剛經(jīng)歷了學(xué)習(xí)、做筆記、從頭開(kāi)始寫(xiě)算法以及用可信實(shí)現(xiàn)進(jìn)行比較的流程。不要浪費(fèi)這些努力!

寫(xiě)下過(guò)程原因有二:

  • 你要更深刻地理解這個(gè)過(guò)程,因?yàn)槟氵€要將你學(xué)到的東西教給別人。
  • 你要向潛在雇主展示這個(gè)過(guò)程。

從機(jī)器學(xué)習(xí)庫(kù)中實(shí)現(xiàn)算法是一回事,從頭開(kāi)始實(shí)現(xiàn)算法是另一回事,它會(huì)給人留下深刻印象。

GitHub 個(gè)人資料是展示你所做工作的一種很好的方法。

總結(jié)

本文介紹了如何從零開(kāi)始實(shí)現(xiàn)感知器。這是一種在更深層次上學(xué)習(xí)算法的好方法,而你還可以自己實(shí)現(xiàn)它。你在大多數(shù)情況下用的都是可信的實(shí)現(xiàn),但是如果你真的想要更深入地了解背后發(fā)生了什么,從頭實(shí)現(xiàn)算法是很好的練習(xí)。

原文鏈接:https://www.dataoptimal.com/machine-learning-from-scratch/

【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2020-01-19 11:10:44

機(jī)器學(xué)習(xí)人工智能數(shù)據(jù)科學(xué)

2013-08-23 09:30:56

BYOD方案BYODMDM

2010-06-09 17:58:14

UML活動(dòng)圖

2012-03-09 15:32:48

華為管理服務(wù)

2009-09-09 09:46:00

MyEclipse配置

2010-06-18 18:18:48

UML活動(dòng)圖

2010-07-09 12:08:36

設(shè)置SNMP協(xié)議

2021-11-15 23:44:56

網(wǎng)絡(luò)安全零信任隱私

2010-02-22 09:38:22

WCF開(kāi)發(fā)

2010-11-19 10:18:11

網(wǎng)絡(luò)連接故障

2009-10-27 17:40:35

Oracle表空間狀態(tài)

2010-06-29 19:23:20

UML活動(dòng)圖

2011-03-03 10:55:07

2009-12-11 13:31:31

策略路由配置

2011-07-30 13:28:03

2010-09-13 10:39:43

CSSCSS文件

2023-04-11 11:22:13

2009-02-06 13:01:00

綠色數(shù)據(jù)中心數(shù)據(jù)中心

2012-03-29 09:50:17

2024-05-06 13:15:45

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)