機器之心整理算法
參與:機器之心編輯部編程
機器學習日益廣爲人知,愈來愈多的計算機科學家和工程師投身其中。不幸的是,理論、算法、應用、論文、書籍、視頻等信息如此之多,很容易讓初學者迷失其中,不清楚如何才能提高技能。本文做者依據自身經驗給出了一套快速上手的可行方法及學習資源的分類彙總,機器之心在其基礎上作了增益,但願對讀者有所幫助。設計模式
先決條件網絡
機器學習的基礎是數學。數學並不是是一個可選可不選的理論方法,而是不可或缺的支柱。若是你是一名計算機工程師,天天使用 UML、ORM、設計模式及其餘軟件工程工具/技術,那麼請閉眼一秒鐘,忘掉一切。這並非說這些概念不重要,毫不是!可是機器學習須要一種不一樣的方法。現在 Python 如此流行的緣由之一是其「原型設計速度」。在機器學習中,一種使用幾行代碼便可建模算法的語言絕對是必要的。多線程
微積分、線性代數、機率論在機器學習幾乎全部算法中不可或缺。若是你的數學背景很紮實,請跳過這一章節。如若否則,那麼從新溫習一下這些重要概念也不錯。考慮到理論的數量,我並不建議你們從大部頭開始。儘管一開始能夠用它查詢具體概念,可是初學者先關注簡單的話題比較好。網上有不少好的在線資源(好比 Coursera、可汗學院或優達學城),實用且適合各類背景的人羣。可是我建議從提綱之類的簡明書籍上手,其中全部核心概念均被涉及,次要概念可在須要的時候自行查詢。這種方法雖然不夠系統,但卻避免了這樣的缺陷:大量晦澀概念使得沒有紮實理論背景的人望而卻步。架構
初學者最好先學習下列內容:框架
機率論機器學習
離散型和連續型隨機變量分佈式
主要分佈(伯努利分佈、二項式分佈、正態分佈、 指數分佈、 泊松分佈、Beta 和 Gamma 分佈)函數
矩估計和最大似然估計
貝葉斯統計
相關性係數和協方差(Correlation and Covariance)
線性代數
向量和矩陣
矩陣的行列式
特徵向量和特徵值
矩陣分解(如 SVD)
微積分
極限與導數
微分和積分
數值計算與最優化方法
網上有不少免費資源,好比
《機率論入門》,Grinstead、Snell 著(https://www.dartmouth.edu/~chance/teaching_aids/books_articles/probability_book/amsbook.mac.pdf)
《線性代數入門》,Wise、Gallagher 著(http://www.stat.columbia.edu/~liam/teaching/4315-spr06/LinAlg.pdf)
《微積分入門》,Heinbockel 著(http://www.math.odu.edu/~jhh/Volume-1.PDF)
維基百科上也有不少好資源,對方程、定理等進行了清晰易懂的解釋。
機器之心也介紹過許多數學基礎與概念:
機器學習主要須要的數學基礎就是微積分、線性代數、機率論,咱們感受只須要掌握大學中常見的高數、線性代數、機率論與數理統計三門課程,基本上概念的理解就沒什麼問題了。若是再學一點數值計算和最優化等,咱們基本上就能理解機器學習的學習過程推導。
機器學習方法建議(面向初學者)
特徵工程
開始機器學習的第一步是理解如何評估和改進數據集的質量。管理特徵的類別和缺失、歸一化和降維(PCA、ICA、NMF)是大幅提升算法性能的基本技術,並且還有助於研究如何將數據集分割成訓練集和測試集、如何採起交叉驗證來取代傳統的測試方法。
機器之心也曾詳解過特徵工程如 PCA 降維算法的詳細理論與推導,固然咱們還介紹了其它有關特徵的概念:
Numpy:Python 數值計算之王!
使用 Python 時,Numpy 不只僅是一個庫。它是幾乎全部機器學習實現的基礎,所以瞭解它的工做原理、關注向量化和廣播(broadcasting)是很是必要的。這些技術能夠幫助加速大多數算法的學習過程,利用多線程和 SIMD、MIMD 架構的力量。
官方文檔已經很完整了,不過,我還建議你們看一下如下資源:
《Python 數據科學手冊:數據使用的核心工具》,VanderPlas J. 著
《Python 科學編程入門書》,LangTangen P. H. 著
數據可視化
Matplotlib 即便不是純粹的機器學習話題,瞭解如何可視化數據集也很重要。Matplotlib 多是最普遍使用的解決方案:Matplotlib 易用,容許繪製不一樣種類的圖表。Bokeh 和 Seaborne 提供了有趣的替代方案。沒必要要完全瞭解全部包,可是瞭解每個包的優勢和弱點仍是頗有用的,能夠幫助你選擇合適的包。
瞭解 Matplotlib 細節的資源:《掌握 Matplotlib》,McGreggor D. 著
線性迴歸
線性迴歸是最簡單的模型之一,能夠把它做爲一個優化問題來研究,該問題可經過最小化均方偏差而獲得求解。該方法雖然有效,可是限制了可利用的可能性。我建議還能夠把它看成貝葉斯問題,使用以前的可能性展現參數(好比,高斯分佈),優化變成了最大似然估計(Maximum Likelihood Estimation,MLE)。即便這看起來更加複雜,但該方法提供了一個可供幾十個其餘複雜模型共享的新方法。
Coursera 上介紹貝葉斯統計的課程:
《貝葉斯統計:從概念到數據分析》(https://www.coursera.org/learn/bayesian-statistics/)
《貝葉斯統計:技術與模型》(https://www.coursera.org/learn/mcmc-bayesian-statistics)
以及這兩本書:
《思考貝葉斯》,Downey B. A. 著
《黑客的貝葉斯方法》Davidson-Pilon C. 著
包括線性迴歸在內,機器之心曾介紹了一些解決迴歸問題的方法(後文提供了 CART 算法進行迴歸分析):
線性分類
一般狀況下,Logistic 迴歸是最佳起始點,也是研究信息論進而瞭解信息熵、交叉熵和互信息的好機會。類別交叉熵(Categorical cross-entropy)是深度學習分類中最穩定、使用最普遍的代價函數,一個簡單的 logistic 迴歸能夠展現它是如何加速學習過程的(與均方差相比)。另外一個重要的話題是正則化(Ridge、Lasso 和 ElasticNet)。不少狀況下,人們認爲它是一種提升模型準確率的深奧方式,可是它的真實意義是更準確,在具體實例的幫助下變得易於理解。我還建議剛開始的時候,把 logistic 迴歸看成一個簡單的神經網絡,可視化(以 2D 實例爲例)權重向量在學習過程當中的移動軌跡。
我還建議本節應包括超參數網格搜索。網格搜索不在沒有完整了解的狀況下嘗試不一樣的值,而是評估不一樣的超參數集的性能。所以,工程師能夠將注意力集中在可達到最高準確率的組合上。固然還有更增強大的貝葉斯優化方法,即利用先驗知識逼近未知目標函數的後驗分佈從而調節超參數的方法。
支持向量機(SVM)
支持向量機提供了不一樣的分類方法(包括線性和非線性方法)。該算法很是簡單,具有基礎幾何知識的人也能夠學會。不過,瞭解核支持向量機的工做原理很是有用,由於它會在線性方法失敗的時候展現出其真正實力。
一些有用的免費資源:
《支持向量機簡明教程》,Law 著
核函數方法,維基百科詞條
決策樹
決策樹提供了另外一種分類和迴歸的方法。一般,它們不是解決複雜問題的首選,但它們提供了徹底不一樣的方法,即便是非技術人員也能夠很容易理解,該方法還能夠在會議或演示中可視化。
集成學習一覽
在理解了決策樹的動態特性之後,研究集成訓練樹的集(集成)來提升總體準確率的方法頗有用。隨機森林、梯度樹提高和 AdaBoost 都是強大的算法,且複雜度較低。對比簡單的樹和提高方法與 bagging 方法採用的樹的學習過程挺有趣的。Scikit-Learn 提供了最多見的實現方法,可是若是你想更好地駕馭這些方法,我仍是建議你在 XGBoost 上多花些時間,XGBoost 是一個既適用於 CPU 又適用於 GPU 的分佈式框架,即便在較大的數據集上也能加速學習過程。
聚類
當開始聚類方法的學習時,個人建議是從高斯混合算法(基於指望最大化/EM)學起。雖然 K-均值聚類要更加簡單易懂(也是必需要學習的),可是高斯混合算法爲咱們提供了純粹的貝葉斯方法,在其餘相似任務中也十分實用。其它必學的算法還有層次聚類(Hierarchical Clustering)、譜聚類(Spectral Clustering)和 DBSCAN。這對你瞭解基於實例的學習或研究 K-近鄰算法(既適用於有監督又適用於無監督任務)也是有幫助的。譜聚類的一個有用的免費資源是:
《譜聚類教程》,Von Luxburg U 著
聚類算法是無監督學習中的表明,機器之心也曾詳細地介紹過各類聚類方法與實現:
神經網絡入門
神經網絡是深度學習的基礎,你能夠在單獨的課程中學習神經網絡。可是,我認爲理解感知機、多層感知機以及反向傳播算法的概念也頗有幫助。Scikit-Learn 提供了一個實現神經網絡的簡單方法,可是,開始探索 Keras 也是一個好主意,Keras 是一個基於 Tensorflow、Theano 或 CNTK 的高級架構,容許使用最少的努力對神經網絡進行建模和訓練。開始神經網絡學習的一些好資源:
《人工神經網絡基礎》Hassoun M 著
《Keras 深度學習》Gulli A.、 Pal S. 著
目前最好的深度學習書籍可能就是:
《深度學習》,Goodfellow I.、 Bengio Y.、Courville A. 著
最後,咱們將介紹部分機器之心曾發過的綜述性技術文章或論文,並但願這些文章能對你們全面理解各類方法有所幫助: