教你6步從頭寫機器學習算法——以感知機算法爲例

本身從頭寫一個算法,不只能給你帶來成就感,也能幫你真正理解算法的原理。可能你以前用 Scikit-learn 實現過算法,可是從零開始寫個算法簡單嗎?絕對不簡單。html


有些算法要比其它算法複雜的多,因此在寫算法時能夠先從簡單的開始,好比單層的感知機。python


下面就介紹機器學家 John Sullivan 總結出的 6 個步驟,以感知機算法爲例,教你從頭開始寫出一個機器學習算法。文中的方法論一樣能應用到其它機器學習算法上。這 6 個步驟是:web

  • 對算法有個基本的瞭解
  • 尋找實用的學習資源
  • 把算法拆成幾個部分
  • 以一個簡單的例子開始
  • 使用可靠的實現進行驗證
  • 整理出寫算法的過程


對算法有個基本的瞭解算法


若是你不瞭解算法的基本知識,先不要嘗試從頭寫算法。至少。你應該能回答如下問題:網絡


  • 算法的含義?
  • 它一般用來幹嘛?
  • 何時不能用它?


以感知機爲例,咱們試着回答這些問題:機器學習

單層感知機是最簡單的神經網絡,一般用於二元分類問題(1或0,「是」或「否」)。學習

它至關於一個二元分類器,因此只有出現線性決策邊界時纔會用到它。還有些簡單的用途,好比情感分析(正面或負面迴應)或貸款違約預測(會違約,不會違約)。在這兩類用途中,決策邊界都須要是線性的。測試


若是決策邊界是非線性的,那麼就不能使用感知機。對於這類問題,須要使用其它算法。3d



尋找一些學習資源調試


在對算法有個基本的理解後,就能夠開始作點研究了。建議多用一些不一樣的資源,有些人看書學得快,有些是看視頻學得快。學習感知機知識,這裏有一些不錯的資源:


  • 書本:

《統計學習精要》:

web.stanford.edu/~hastie/Pap…


《Understanding Machine Learning: From Theory To Algorithms》:

www.cs.huji.ac.il/~shais/Unde…


  • 博客:

John Brownslee 寫的這篇《用 Python 從頭實現感知機算法》:

machinelearningmastery.com/implement-p…


Sebastian Raschka 的博客《單層神經網絡與梯度降低》:

sebastianraschka.com/Articles/20…


  • 視頻:

感知機算法訓練:

www.youtube.com/watch?v=5g0…


感知機算法工做原理:

www.youtube.com/watch?v=1Xk…


把算法拆成幾部分

等收集好資源後,就開始學習了。首先準備好紙筆,咱們不是通讀整個章節或整篇博客,而是略讀章節標題和其它一些重要信息。寫下內容要點,試着概述算法。


在看完學習資料後,咱們將感知機算法拆成如下幾個部分:


  • 初始化權重
  • 將權重和輸入相乘,並求和
  • 將結果和闕值進行比較,以計算輸出(1或0)
  • 更新權重
  • 重複


像這樣將算法拆成幾個部分,學起來會更容易。基本上咱們先以僞代碼概述算法,再回頭填補細節。下圖是第二步時John Sullivan所作的筆記,即權重和輸入的點積:



以一個簡單的例子開始


整理好算法的筆記後,開始用代碼實現。在深刻研究一個複雜的問題以前,建議先從一個簡單的例子開始。對於感知機來講,與非門(NAND gate)是一個完美的簡單數據集。若是兩個輸入都爲真(1)則輸出爲假(0),不然輸出爲真。如下是數據集的示例:



如今使用一個簡單的數據集,開始實現咱們在步驟 3 中概述的算法。最好以塊的方式寫算法,並進行測試,不要試圖一次性寫完。這樣你在剛開始時更容易調試。固然最後能夠回去整理一下,使代碼看起來更整潔一些。


下面是在第 3 步中算法的點積部分的 Python 代碼:



使用可靠的實現進行驗證


等寫完代碼並用小數據集測試之後,接下來嘗試較大的數據集。爲了確保代碼能在更復雜的數據集上正確運行,最好用可靠的實現進行測試。對於感知機來講,咱們能夠用 Scikit-learn 中的實現。



測試代碼時須要查看權重。若是正確地實現了算法,權重應該與 scikit-learn 感知機的權重相匹配。



若是最開始沒有獲得相同的權重,那麼就須要調整 scikit-learn 感知機中的默認設置。若是每次都實現一個新的隨機狀態,只是一個固定的種子,那麼就必須關閉它。在 Jason Sullivan 本身的實踐操做中,爲了匹配學習率,他將 eta0 改成 0.1。最後,他關閉了 fit_intercept 選項,在特徵數據集中包含了一個 1 的虛擬列,因此已經自動擬合了截距(也就是偏置項)。


這就給咱們一個很重要的啓示。在驗證模型的現有實現時,你須要很是瞭解模型的輸入。永遠不該盲目地使用模型,要始終對你的假設以及每一個輸入的確切含義保持懷疑。


整理出寫算法的過程

過程的最後一步多是最重要的,前面完成學習、作筆記、寫算法以及將結果和可靠實現比較等這幾個步驟後,最後把這個過程整理出來很重要,有兩個緣由:

  1. 隨着你向別人展現本身所學的東西,你會對算法有更深刻的理解;
  2. 能夠做爲一項成果,展現給潛在的僱主,做爲求職的加分項。使用機器學習庫實現一個算法是一回事,本身從頭開始寫出一個算法是另外一回事,然後者給人留下的印象更深入。


以上就是從頭開始實現一個機器學習算法的 6 個步驟,剛開始最好先從簡單的算法開始,熟練這套方法論後再擴展到其它更復雜的算法上。


參考資料:
www.kdnuggets.com/2018/09/6-s…

咱們的新課程平臺,歡迎試用:jizhi.ai/

相關文章
相關標籤/搜索