从零实现来理解机器学习算法:书籍推荐及障碍的克服
從零實(shí)現(xiàn)來理解機(jī)器學(xué)習(xí)算法:書籍推薦及障礙的克服
發(fā)表于2015-09-10 16:16| 1261次閱讀| 來源Machine Learning Mastery| 2 條評論| 作者Jason Brownlee
機(jī)器學(xué)習(xí)編程語言RubyPythonAPI width="22" height="16" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-09-08%2F2825646&type=3&count=&appkey=&title=%E7%8E%B0%E9%98%B6%E6%AE%B5%E6%9C%89%E4%BA%9B%E5%BC%80%E5%8F%91%E8%80%85%E5%B9%B6%E6%B2%A1%E6%9C%89%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AE%97%E6%B3%95%E7%9A%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%EF%BC%8C%E4%BD%86%E6%98%AF%E6%80%8E%E4%B9%88%E6%89%8D%E8%83%BD%E8%AE%A9%E5%BC%80%E5%8F%91%E8%80%85%E4%BB%8E%E9%9B%B6%E5%85%A5%E9%97%A8%E6%9D%A5%E5%AD%A6%E4%B9%A0%E5%A5%BD%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AE%97%E6%B3%95%EF%BC%8C%E8%BF%99%E7%AF%87%E6%96%87%E4%BE%BF%E5%B8%AE%E5%8A%A9%E5%BC%80%E5%8F%91%E8%80%85%E6%80%BB%E7%BB%93%E6%8E%A8%E8%8D%90%E4%BA%86%E4%B8%80%E4%BA%9B%E5%8A%9E%E6%B3%95%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1442237231087" frameborder="0" scrolling="no" allowtransparency="true">摘要:現(xiàn)階段有些開發(fā)者并沒有機(jī)器學(xué)習(xí)算法的基礎(chǔ)知識,但是怎么才能讓開發(fā)者從零入門來學(xué)習(xí)好機(jī)器學(xué)習(xí)算法,這篇文便幫助開發(fā)者總結(jié)推薦了一些辦法。【編者按】并非所有的開發(fā)者都有機(jī)器學(xué)習(xí)算法的基礎(chǔ)知識,那么開發(fā)者如何從零入門來學(xué)習(xí)好機(jī)器學(xué)習(xí)算法呢?本文總結(jié)推薦了一些從零開始學(xué)習(xí)機(jī)器學(xué)習(xí)算法的辦法,包括推薦了一些合適的書籍,如何克服所面臨的各種障礙,以及快速獲得更多知識的竅門。
從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法似乎是開發(fā)者理解機(jī)器學(xué)習(xí)的一個(gè)出色方式。或許真的是這樣,但這種做法也有一些缺點(diǎn)。
在這篇文章中,你會發(fā)現(xiàn)一些很好的資源,可以用來從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法。你也會發(fā)現(xiàn)一些看似完美的方法的局限性。你已經(jīng)從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法并努力學(xué)習(xí)留下的每一條評論了么?我很樂意聽到關(guān)于你的經(jīng)驗(yàn)。
從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法!圖片來自Tambako The Jaguar
從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的好處
我推廣了從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的觀念。
我認(rèn)為你可以學(xué)到很多關(guān)于算法是如何工作的。我也認(rèn)為,作為一名開發(fā)者,它提供了一個(gè)學(xué)習(xí)用于機(jī)器學(xué)習(xí)的數(shù)學(xué)符號、描述以及直覺的橋梁。
?在“從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的好處”這篇文章里,我已經(jīng)討論了從零實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的好處。
在那篇文章,我列出的好處如下:
在這篇文章中,我對如何利用現(xiàn)有的教程和書籍來縮短這個(gè)學(xué)習(xí)過程表達(dá)了一些個(gè)人看法。有一些用于初學(xué)的豐富資源,但也要堤防一些絆腳石。
下一節(jié),我指出了三本書,你可以照著書籍從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法。
在過去的幾年里,我已經(jīng)在機(jī)器學(xué)習(xí)入門中幫助了許多程序員。根據(jù)我的經(jīng)驗(yàn),我列出了五項(xiàng)曾困擾過程序員的最常見的障礙,以及你可以用來克服它們的技巧。
最后,你會發(fā)現(xiàn)3個(gè)快速技巧,用以從代碼教程中獲得更豐富的知識,并從一個(gè)復(fù)制粘貼的程序員(如果你碰巧是其中一個(gè))到一個(gè)真正深入機(jī)器學(xué)習(xí)算法的學(xué)者。
用于實(shí)現(xiàn)算法的優(yōu)秀書籍
我從零實(shí)現(xiàn)過許多算法,這些算法直接來自研究論文。這個(gè)過程可能非常困難。
跟著別人的教程來做是一個(gè)非常溫和的開始。有很多優(yōu)秀的資源,可以讓你用來從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法。也許最具權(quán)威性的是能指導(dǎo)你完成整個(gè)教程的書籍。
從啃書本開始學(xué)習(xí)有很多好處。例如:
- 其他人已經(jīng)研究出了該算法并把它轉(zhuǎn)換成了代碼;
- 你可以使用它作為一個(gè)用于修改和實(shí)驗(yàn)的已知工作起點(diǎn)。
那么,一步一步引導(dǎo)你完成機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)的出色書籍有:
Data Science from Scratch: First Principles with Python by Joel Grus
這本書的確是從零開始,貫穿可視化操作、統(tǒng)計(jì)、概率、數(shù)據(jù)處理,然后是大約12個(gè)不同的機(jī)器學(xué)習(xí)算法。
這本書是我今年最喜歡的機(jī)器學(xué)習(xí)初學(xué)者書籍之一。
Machine Learning: An Algorithmic Perspective by Stephen Marsland
這本書是我期待已久的這本流行書籍的第二版。它涵蓋了大量的不同種類的機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)。我喜歡它既給出了數(shù)學(xué)描述和偽代碼,又包含了能執(zhí)行的源代碼。
Machine Learning in Action by Peter Harrington
該書貫穿了10個(gè)最受歡迎的機(jī)器學(xué)習(xí)算法,提供了案例研究問題并用Python代碼實(shí)例來解決。我喜歡它用符號和箭頭把代碼和描述緊密聯(lián)系在一起的形式。
我是否有漏掉一本從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的編程教程書籍呢?
如果有,請?jiān)谠u論中指出!
從零實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的5個(gè)障礙(以及如何克服它們)
根據(jù)教程從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法是很有趣的。但也有可能會成為絆腳石,而且如果你不小心,他們可能會絆倒你并抹殺你的學(xué)習(xí)動機(jī)。
在這一節(jié)中,我想指出我所看到的五個(gè)常見的絆腳石,以及如何與它們共存,而不是讓它們阻礙你。我的目的是讓你完全擺脫它并且破浪前行(或是轉(zhuǎn)移到另一個(gè)教程)。
用來避免下面障礙的一些好的常規(guī)建議是在你深入一個(gè)教程之前,仔細(xì)檢查書籍的評論(或博客帖子的評論)。你要確保代碼是能夠工作的并且保證你不是在浪費(fèi)時(shí)間。
另一個(gè)常規(guī)策略是,無論深入的是什么,找出不工作的那部分,并自己去重新實(shí)現(xiàn)他們。這是一個(gè)強(qiáng)行理解的出色解決方法,但它可能不適合初學(xué)者,并且你可能需要一個(gè)很好的技術(shù)參考資料放在手邊。
無論如何,讓我們從零開始機(jī)器學(xué)習(xí)教程,深入研究這5個(gè)常見的障礙:
1)代碼不能正常工作
最糟糕并且最常見的障礙就是實(shí)例當(dāng)中的代碼不能正常工作。
事實(shí)上,如果你花一些時(shí)間瀏覽亞馬遜網(wǎng)站的一些書籍評論或博文評論,很顯然,這個(gè)問題比你想象的更為普遍。
這是怎么發(fā)生的呢?有幾個(gè)原因可能會給你提供一些線索,可以應(yīng)用到你自己的修改中并繼續(xù)使用:
- 代碼從不工作。這意味著,這本書沒有經(jīng)過精心編輯就出版了。在這種情況下,你能做的并不多,除非是進(jìn)入作者的大腦,并試圖推測出他們的想法。或許還可以嘗試聯(lián)系作者本人或是出版商。
- 語言已變動。這種情況可能會發(fā)生,特別是如果該文章是發(fā)布已久的或者該書已印刷了很長一段時(shí)間。兩個(gè)很好的例子是Ruby從1.x版本到2.x版本和Python從2.x版本到3.x版本。
- 第三方庫已變動。這通常發(fā)生在那些情況下,即實(shí)現(xiàn)不完全是從零開始并且使用了一些有用的庫,如用于繪圖的庫。這通常不會那么糟糕。你可以通過經(jīng)常更新代碼來使用最新版本的庫以及修改參數(shù)來滿足API的修改。甚至可以安裝一個(gè)舊版本的庫(如果版本很少或是幾乎不需要可能破壞開發(fā)環(huán)境的其它依賴庫)。
- 該數(shù)據(jù)集已變動。如果數(shù)據(jù)文件是一個(gè)下載鏈接,并且已經(jīng)失效(也許你可以在其它地方找到該文件),這種情況下就有可能會發(fā)生。如果這個(gè)例子是針對第三方API數(shù)據(jù)來源,比如Facebook或Twitter,該情況會更加糟糕。這些APIs可以迅速地改變很多。如果可能的話,你最好的辦法是了解最新版本的API,并改寫代碼中的實(shí)例。
如果它是一本書、GitHub庫、代碼下載或者類似的,如果代碼不工作,一個(gè)好的常規(guī)策略是尋找相關(guān)的勘誤表。有時(shí)這些問題已經(jīng)在書上或作者的網(wǎng)站上修正了。一些簡單的谷歌搜索就能找到它們。
2) 代碼不規(guī)范描述
當(dāng)從零開始實(shí)現(xiàn)算法時(shí),我認(rèn)為第二個(gè)糟糕的絆腳石是提供的代碼描述很糟糕。
對于初學(xué)者來說,這類問題特別不好,因?yàn)槟阏谂S持積極性,而實(shí)際上你是從練習(xí)中學(xué)習(xí)一些東西。如果代碼和文本不一致,所有的這些都會在煙霧中漸漸消失。
我(或許比較溫和)把他們稱為“糟糕的描述”,因?yàn)榭赡苡泻芏嗟陌Y狀和原因。例如:
- 代碼和描述之間的不匹配。這可能是由于代碼和文本在不同時(shí)間準(zhǔn)備而造成的,并且不能正確地編輯起來。它可能是一些小的,如一個(gè)變量名稱的變化,或者它可能是整個(gè)函數(shù)名或函數(shù)本身的變化。
- 缺失的解釋。有時(shí),你會得到你所期望獲得的大量代碼。這是令人沮喪的,特別是書中連篇累牘的代碼,可能在屏幕上更容易理解。如果是這樣的話,最好的方法是找到在線下載的代碼并直接使用它來工作。
- 過于簡潔的解釋。有時(shí)你會對代碼進(jìn)行解釋,但它們可能過于簡單,如“使用信息增益”或任何其它的。令人沮喪!你可能還要花更多的時(shí)間來研究這個(gè)術(shù)語,但如果作者在上下文中包含了一個(gè)該術(shù)語的解釋以及相關(guān)的實(shí)例,那么這就會顯得更簡單。
一個(gè)好的常規(guī)方法是在其它的資源里尋找算法的描述,并嘗試將它們映射到你所使用的代碼中。從本質(zhì)上講,是嘗試建立你自己的代碼描述。
這對初學(xué)者來說可能不是一個(gè)好的選擇,你可能需要轉(zhuǎn)到另一個(gè)資源上。
3)代碼不符合語言習(xí)慣
我們程序員可以對我們語言的 “正確”使用咬文嚼字(如Python代碼不是Pythonic)。這其實(shí)是一件好事,它顯示了對細(xì)節(jié)和最佳實(shí)踐的充分關(guān)注。
當(dāng)實(shí)例代碼不符合語言編寫習(xí)慣時(shí),它可能會讓人排斥。有時(shí)它會使代碼零散以至于難以理解。
這種情況有許多原因,例如:
- 來自另一種語言的接口。實(shí)例代碼可能是另一種編程語言的接口。如在Java中調(diào)用FORTRAN或在Python中調(diào)用C。在老手眼里,這會很顯眼。
- 作者正在學(xué)習(xí)語言。有時(shí),作者可能使用一本書或一個(gè)教程項(xiàng)目來學(xué)習(xí)語言。在整個(gè)代碼示例中,可能會不一致。當(dāng)實(shí)例多次使用難以理解的語言特征和API時(shí),這可能會讓人失望甚至分散注意力。
- 作者沒有使用專業(yè)語言。這可能是更加微妙的一點(diǎn),可以通過使用深奧的語言功能和APIs來體現(xiàn)。當(dāng)你必須研究或解讀奇怪的代碼時(shí),這可能會讓你混淆。
如果你慣用的代碼對你非常重要,這些障礙可能會是一個(gè)機(jī)會。你可以把接口代碼從“Java-Python”混合體(或別的什么)化為一個(gè)純Python的實(shí)現(xiàn)。
這么做之后,你將得到一個(gè)更深層次的算法理解以及更多的代碼所屬權(quán)。
4)代碼和數(shù)學(xué)無關(guān)
一個(gè)很好的代碼示例或教程將提供一個(gè)從數(shù)學(xué)描述到代碼的橋梁。
這很重要,因?yàn)樗试S你跨越代碼和數(shù)學(xué),并開始為符號和簡明的數(shù)學(xué)描述形成一個(gè)直覺。
問題是,有時(shí)候這個(gè)橋梁可能會被徹底破壞或是丟失。
- 數(shù)學(xué)上的錯(cuò)誤。這對初學(xué)者來說是潛在的,因?yàn)榻臄?shù)學(xué)到代碼的關(guān)聯(lián)已經(jīng)很緊張了。不正確的數(shù)學(xué)可能會誤導(dǎo)或者嚴(yán)重地消耗大量的時(shí)間,并且還沒有回報(bào)。知道這個(gè)可能會發(fā)生,就是一個(gè)很好的開始。
- 簡明的數(shù)學(xué)描述。方程可以在示例代碼中四處散落,讓你去弄清楚它究竟是什么,以及它是如何與代碼相關(guān)聯(lián)的。你的選擇不多,你可以把它當(dāng)做是一個(gè)與數(shù)學(xué)無關(guān)的例子,并參考一個(gè)不同的更加完整的參考文本,或者你可以努力把數(shù)學(xué)與自己的代碼關(guān)聯(lián)起來。這更有可能的是作者本身就不熟悉算法的數(shù)學(xué)描述,而且似乎是事后才添加到文章里的。
- 缺失的數(shù)學(xué)。有些參考文獻(xiàn)在描述數(shù)學(xué)時(shí)是自由的。在這種情況下,你可能需要找到自己的參考文本,并建立自己的橋梁。這可能不適合初學(xué)者,但這是一個(gè)技能,很值得去投入時(shí)間。
一個(gè)初學(xué)者可能會堅(jiān)持代碼而忽略數(shù)學(xué),建立信心和動力。之后,它將為一個(gè)高質(zhì)量的參考文本以及關(guān)聯(lián)代碼和數(shù)學(xué)付出代價(jià)。
你想要擅長于關(guān)聯(lián)代數(shù)和標(biāo)準(zhǔn)代碼,并為有關(guān)過程建立一個(gè)直覺。這是一個(gè)應(yīng)用技巧。需要你投入工作與實(shí)踐。
5)不完整的代碼列表
我們在2)中看到,你可以有不帶任何描述和長列表的代碼。然而,當(dāng)你沒有大量代碼的時(shí)候,這個(gè)問題會逆轉(zhuǎn)。這也就是代碼列表不完整時(shí)的情況。
事實(shí)上,我是一個(gè)完整代碼列表的忠實(shí)信徒。我認(rèn)為代碼列表應(yīng)該給你所需要的,給你一個(gè)“完整”的代碼和工作實(shí)現(xiàn),即使它是最簡單的情況。
你可以建立一個(gè)簡單的實(shí)例,但你不能運(yùn)行一個(gè)不完整的例子。你必須把它放在工作中并把所有的都聯(lián)系在一起。
這個(gè)障礙可能成為事實(shí)的一些原因是:
- 冗長的描述。冗長的編寫可能是一個(gè)不完整思維的標(biāo)志。但有時(shí)候,也不一直都是這樣。如果理解的不是很好,可能會在潛意識里試圖用一堆詞來掩飾。如果沒有任何代碼,你可以把它當(dāng)作是一個(gè)挑戰(zhàn),根據(jù)描述來設(shè)計(jì)算法,并從其它描述和資源來證實(shí)它。
- 代碼片段。概念可能會精心描述,然后使用一個(gè)小代碼片段來證實(shí)。這有助于緊密配合代碼段的概念,但它需要你自己大量的工作,將其結(jié)合在一起,形成一個(gè)工作系統(tǒng)。
- 無樣本輸出。代碼實(shí)例經(jīng)常失誤的一個(gè)關(guān)鍵方面通常是樣本輸出。如果有輸出的話,當(dāng)你運(yùn)行它時(shí),它可以給你一個(gè)期待的明確想法。沒有樣本輸出的話,那就完全是猜測。
在某些情況下,把代碼聚在一起,這對你可能會是一個(gè)有趣的挑戰(zhàn)。這同樣不適合初學(xué)者,但是一旦你有一些算法之后,這也許會是一個(gè)有趣的鍛煉。
3個(gè)訣竅讓你從算法實(shí)現(xiàn)中獲得更多知識
你可以實(shí)現(xiàn)一個(gè)合理的算法。一旦你這樣做過,那么你可以做得更多,并在你知道它之前,你已經(jīng)建立了你自己非常理解的小算法庫。
在這一節(jié)中,我想給你3個(gè)你可以使用的快速技巧,可以讓你從實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法過程中獲得最多的經(jīng)驗(yàn)。
我認(rèn)為這些技巧與教程和代碼實(shí)例相比,會讓你走的更遠(yuǎn)。
特別是最后一點(diǎn),會給你在算法行為上更深層次的見解,很少有從業(yè)人員花時(shí)間去學(xué)習(xí)它。
你的行動步驟
這是一篇很長的文章,現(xiàn)在,你已經(jīng)學(xué)會了如何從零開始實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法。
重要的是,你已經(jīng)了解了最常見的障礙、一些框架是如何形成的以及一些你可以運(yùn)用的戰(zhàn)術(shù),你可以把它們轉(zhuǎn)化為機(jī)遇。
你的下一步很明顯:從零開始實(shí)現(xiàn)算法。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的从零实现来理解机器学习算法:书籍推荐及障碍的克服的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国进入“非结构化”数据分析新时代
- 下一篇: 关于数据科学,书上不曾提及的三点经验