機器學習標準教科書PRML的Python實現:最佳讀書伴侶
機器學習神書之一的 PRML(模式識別與機器學習)是所有機器學習讀者或希望系統理解機器學習的讀者所必須了解的書籍。這本書系統而全面地論述了模式識別與機器學習領域的基本知識和最新發展,而該 GitHub 項目希望實現這本書的所有算法與概念,是非常優秀的資源與項目。
GitHub地址:https://github.com//ctgk/PRML
PRML 這本機器學習和模式識別領域中經典的教科書不僅反映了這些年該領域的最新發展,同時還全面而系統地介紹了模式識別和機器學習領域內詳細的概念與基礎。這本書主要針對高級本科生或研究生,以及人工智能相關的研究人員和從業人員。如果讀者以前沒有模式識別或機器學習相關的概念或知識,我們可能需要熟悉一些多元微積分和基本的線性代數等數學基礎。此外,我們本科學的概率論與數理統計也需要復習一些,但這本書包含了對基本概率論的介紹,所以也可以借由這些章節進行復習。
PRML 適用于機器學習、統計學、計算機科學、信號處理、計算機視覺、數據挖掘和生物信息學等課程。它也為廣大的讀者提供了豐富的支持,例如書籍官網提供了 400 多個詳細的練習資源,且根據難度分級。以下提供了該書籍的中英文資源,但我們還是建議讀者查閱原版的英文書籍。此外,我們在 GitHub 上也能找到非常多的學習資源,例如中文翻譯項目、Matlab 實現項目或各種讀書筆記等。本文主要介紹了一個新的 GitHub 項目,該項目希望能實現 PRML 這本書籍的各種算法與概念。
PRML 實現地址:https://github.com//ctgk/PRML
PRML 書籍資源:http://pan.baidu.com/s/1skRgcjF 密碼:cquc
該 GitHub 項目主要是希望使用 Python 代碼實現在 Bishop 書籍「Pattern Recognition and Machine Learning」中介紹的算法。其中代碼可以分為兩部分,即實現各章節具體算法的 Python 代碼文件和有助于理解各章節具體內容的 Jupyter Notebook 文件。在本文中,機器之心將簡要介紹描述各章節的 Notebook,而各個算法的具體實現就需要讀者朋友自行深入了解該項目了。
該 GitHub 項目所需要的編程語言為 Python 3,其它科學計算庫還需要 NumPy 和 SciPy。若我們需要閱讀各章節的 Notebook 文件,就需要安裝 Jupyter,若希望在 Notebook 上繪制結果曲線或其他圖表,我們需要安裝 Matplotlib。此外,若我們希望饋送數據進行訓練,還需要安裝 sklearn 包。
在各章節具體算法的 Python 代碼中,其羅列了聚類方法、特征抽取、線性模型、核方法、馬爾科夫模型、概率分布模型、采樣方法和神經網絡方法等主題的實現。如下展示了線性模型文件夾下所包含的具體算法:
而對于 Notebook 部分來說,該項目展示了 PRML 各章節的輔助內容與實現代碼,這一部分的內容目錄如下:
- ch1. 簡介
- ch2. 概率分布
- ch3. 線性模型和回歸
- ch4. 線性模型和分類
- ch5. 神經網絡
- ch6. 核方法
- ch7. 稀疏核機器
- ch9. 混合模型與 EM 算法
- ch10. 近似推斷
- ch11. 采樣方法
- ch12. 連續隱變量
這些章節都是根據原書章節進行展示的,例如在簡介章節中,該項目重點展示了多項式曲線擬合和貝葉斯曲線擬合。如在多項式擬合中,我們希望用以下形式的多項式擬合數據:
其中 M 為多項式的階數,多項式系數 w_0, . . . , w_M 可以整體表示為向量 w。這些多項式系數可以通過梯度下降等方法調整多項式曲線擬合數據的情況。該 GitHub 項目先導入前面定義的具體模型,然后如下所示,再在 Notebook 部分展示模型的結果:
這和原書中的結果是非常相似的,我們甚至可以進一步調整不同的多項式復雜度以查看不同的擬合效果。因為增加了實踐過程,這樣的實現非常有助于我們理解原書中的概念與算法。此外,如果我們對算法的理解有什么疑惑,也可以查看具體的代碼加深理解。
前面展示的案例是簡介部分非常簡單的多項式擬合方法,而對于更復雜一些的模型與方法,該項目也有非常好的實現與展示。例如在第七章中,PRML 主要介紹了稀疏核機器(Sparse Kernel Machines),包括最大間隔分類器、相關向量機(Relevance Vector Machines/RVM)等方法。如下所述,該項目對這一部分的內容也有非常好的輔助作用。
例如在最大間隔分類器或支持向量機中,我們假設訓練數據集在特征空間中是線性可分的。因此根據定義,存在至少?個 參數 w 和 b 的選擇方式,使得對于 t_n = +1 的點,線性模型 y(x) = w*φ(x) + b 都滿足y(x_n) > 0,而對于 t_n = -1 的點,都有 y(x_n) < 0。因此對于所有訓練數據點,我們有 t_n*y(x_n) > 0。
但是這種分類的情況會有很多,我們可以選擇最穩妥的分類方法,即決策邊界盡可能地處于所分類別的中間。支持向量機解決這個問題的方法是:引入間隔(margin)的概念,這 個概念被定義為決策邊界與任意樣本之間的最小距離,如原書第七章圖 7.1 所示。
如左圖所示,間隔被定義為決策邊界與最近的數據點之間的垂直距離。最大化間隔會生成對決策邊界的一個特定的選擇,如右圖所示。這個決策邊界的位置由數據點的一個子集確定,被稱為支持向量,用圓圈表示。
在該 GitHub 項目中,其展示的代碼與繪圖如下所示:
若我們應用和方法將這種大間隔分類的方法應用核技巧,將原本線性不可分的數據投影到線性線性可分的特征空間中,那么我們就能將這種具有大間隔或具有更強泛化能力的分類器推廣到非線性分類中。如下展示了該項目這種擴展的支持向量機模型:
當然,本項目還有更多的模型與方法案例,我們可以按照 README 文件中所給出的 Notebook 文檔加強對 PRML 這本權威教材的理解。該項目目前還在進一步完善,也希望各位 PRML 的讀者能共同完善它,為我們自己提供更加優秀的學習資源。
來自:https://www.jiqizhixin.com/articles/2017-11-27-3