本身從頭寫一個算法,不只能給你帶來成就感,也能幫你真正理解算法的原理。可能你以前用 Scikit-learn 實現過算法,可是從零開始寫個算法簡單嗎?絕對不簡單。html
有些算法要比其它算法複雜的多,因此在寫算法時能夠先從簡單的開始,好比單層的感知機。python
下面就介紹機器學家 John Sullivan 總結出的 6 個步驟,以感知機算法爲例,教你從頭開始寫出一個機器學習算法。文中的方法論一樣能應用到其它機器學習算法上。這 6 個步驟是:web
對算法有個基本的瞭解算法
若是你不瞭解算法的基本知識,先不要嘗試從頭寫算法。至少。你應該能回答如下問題:網絡
以感知機爲例,咱們試着回答這些問題:機器學習
單層感知機是最簡單的神經網絡,一般用於二元分類問題(1或0,「是」或「否」)。學習
它至關於一個二元分類器,因此只有出現線性決策邊界時纔會用到它。還有些簡單的用途,好比情感分析(正面或負面迴應)或貸款違約預測(會違約,不會違約)。在這兩類用途中,決策邊界都須要是線性的。測試
若是決策邊界是非線性的,那麼就不能使用感知機。對於這類問題,須要使用其它算法。3d
尋找一些學習資源調試
在對算法有個基本的理解後,就能夠開始作點研究了。建議多用一些不一樣的資源,有些人看書學得快,有些是看視頻學得快。學習感知機知識,這裏有一些不錯的資源:
《統計學習精要》:
《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…
感知機算法訓練:
感知機算法工做原理:
把算法拆成幾部分
等收集好資源後,就開始學習了。首先準備好紙筆,咱們不是通讀整個章節或整篇博客,而是略讀章節標題和其它一些重要信息。寫下內容要點,試着概述算法。
在看完學習資料後,咱們將感知機算法拆成如下幾個部分:
像這樣將算法拆成幾個部分,學起來會更容易。基本上咱們先以僞代碼概述算法,再回頭填補細節。下圖是第二步時John Sullivan所作的筆記,即權重和輸入的點積:
以一個簡單的例子開始
整理好算法的筆記後,開始用代碼實現。在深刻研究一個複雜的問題以前,建議先從一個簡單的例子開始。對於感知機來講,與非門(NAND gate)是一個完美的簡單數據集。若是兩個輸入都爲真(1)則輸出爲假(0),不然輸出爲真。如下是數據集的示例:
如今使用一個簡單的數據集,開始實現咱們在步驟 3 中概述的算法。最好以塊的方式寫算法,並進行測試,不要試圖一次性寫完。這樣你在剛開始時更容易調試。固然最後能夠回去整理一下,使代碼看起來更整潔一些。
下面是在第 3 步中算法的點積部分的 Python 代碼:
使用可靠的實現進行驗證
等寫完代碼並用小數據集測試之後,接下來嘗試較大的數據集。爲了確保代碼能在更復雜的數據集上正確運行,最好用可靠的實現進行測試。對於感知機來講,咱們能夠用 Scikit-learn 中的實現。
測試代碼時須要查看權重。若是正確地實現了算法,權重應該與 scikit-learn 感知機的權重相匹配。
若是最開始沒有獲得相同的權重,那麼就須要調整 scikit-learn 感知機中的默認設置。若是每次都實現一個新的隨機狀態,只是一個固定的種子,那麼就必須關閉它。在 Jason Sullivan 本身的實踐操做中,爲了匹配學習率,他將 eta0 改成 0.1。最後,他關閉了 fit_intercept 選項,在特徵數據集中包含了一個 1 的虛擬列,因此已經自動擬合了截距(也就是偏置項)。
這就給咱們一個很重要的啓示。在驗證模型的現有實現時,你須要很是瞭解模型的輸入。永遠不該盲目地使用模型,要始終對你的假設以及每一個輸入的確切含義保持懷疑。
整理出寫算法的過程
過程的最後一步多是最重要的,前面完成學習、作筆記、寫算法以及將結果和可靠實現比較等這幾個步驟後,最後把這個過程整理出來很重要,有兩個緣由:
以上就是從頭開始實現一個機器學習算法的 6 個步驟,剛開始最好先從簡單的算法開始,熟練這套方法論後再擴展到其它更復雜的算法上。
參考資料:
www.kdnuggets.com/2018/09/6-s…
咱們的新課程平臺,歡迎試用:jizhi.ai/