-
1 # 機器學習乾貨君
-
2 # 機器之心Pro
數學是機器學習的基礎。斯坦福大學教授 Stephen Boyd 聯合加州大學洛杉磯分校的 Lieven Vandenberghe 教授出版了一本基礎數學書籍,從向量到最小二乘法,分三部分進行講解並配以輔助資料。此外,這本書也是斯坦福 EE103 課程、UCLA EE133A 課程的教材,由劍橋大學出版社出版(允許網路公開)。
專案地址:https://web.stanford.edu/~boyd/vmls/
這一本書的資料還是比較齊全的,除了本身 473 頁的教材,還有另一本 178 頁的對應程式碼講解。當然如果讀者只需要瞭解數學部分的話,程式碼部分是不需要了解的。但是如果比較關注線性代數的應用,可能就需要閱讀這些基礎程式碼,並順便學一學 Julia 語言了。最後,這一本書還提供了對應的課程 PPT,讀者也可以把它們作為輔助資料。
書籍簡介
這本書旨在介紹向量、矩陣和最小二乘方法等應用線性代數的基礎內容,它的目標是為只有很少或根本沒有線性代數基礎的初學者提供入門方法,包括線性代數的基本思想以及在資料科學和機器學習等領域的應用方法。
這本書比一般的應用線性代數課本要有更少的數學成分,只會詳細介紹基本線性代數、線性獨立性等理論概念,以及 QR 因式分解這一計算工具。而這本書討論的大多數機器學習等方面的應用只會使用一種方法,即最小二乘法及其擴充套件。在某種意義下,該書更強調的是應用,即依賴於少量基本數學概念和方法,而覆蓋大多數應用。但是這本書所呈現的數學是完整的,因為它會仔細證明每一個數學宣告。然而,與大多數介紹性的線性代數課本相比,這本書描述了許多實際應用。包括一些通常被認為是高階主題的應用,如文件分類、狀態估計和投資組合最佳化等。
這本書並不需要任何計算機程式設計的知識,因此可以作為傳統的教學課程,我們只需要閱讀對應章節並完成一些不涉及數值計算的練習題就行了。然而,這種方法會並不能使我們完全理解這本書,同時也得不到實際鍛鍊,例如我們可以使用這本書的觀點與方法構建一個基於資料的預測模型、增強影象資料或最佳化投資組合等。隨著計算力的不斷增長,以及 NumPy 等高效矩陣運算庫的發展,這本書中的描述的方法可以輕鬆地應用到實踐中。因此讀者還可以使用 Python 等程式語言練習不同的專案而補充學習資源,只有使用真實資料搭建應用才能真切地理解理論思想。本書提供了一些需要數值計算的練習題,且資料檔案與程式語言的資源都可線上獲得。
這本書主要分為三部分。第一部分介紹了向量及各種向量運算和函式,例如加法、向量內積、距離和角度等。本書還展示瞭如何使用向量表示文件中的詞數、時間序列、目標屬性、產品規格、音訊資料和影象等。第二部分如同前一部分重點關注矩陣的概念與應用,包括矩陣的求逆和解線性方程等。第三部分介紹了最小二乘法,它不僅展示瞭如何簡單而自然地近似求解一個超定方程組,同時還有一些可應用到很多方法的最小二乘擴充套件知識。
該書還可用於自學,並輔以線上提供的資料,例如下面這份 470 頁的 PPT。
地址:https://web.stanford.edu/~boyd/vmls/vmls-slides.pdf
按照設計,本書的進度會逐漸加快,也就是說第一部分和第二部分有許多細節和簡單的例子,第三部分有更多高階的例子和應用。對於只有很少線性代數基礎或根本沒有的讀者而言,課程可以側重於第一部分和第二部分,並且僅簡單瞭解一些更高階的應用。而熟悉背景知識的讀者可以快速過一遍前面兩部分,並將重點放在最後的應用部分上。
除了線性代數等數學基礎,這本書還介紹了很多機器學習應用,包括比較流行的 K 均值聚類等。而這些機器學習演算法主要都介紹了數學表現形式和偽演算法,並不涉及具體的程式碼,讀者可另外檢視這本書的配套程式碼實現。這本書提供的了基於 Julia 語言的配套程式碼!
下面我們將簡要介紹聚類這一方面課本內容與對應的 Julia 程式碼。聚類也就是說將同類的無監督資料聚在一起,它的目標函式可以簡單地定義為各樣本到對應聚類中心的距離和。如果這個距離和非常大,那麼聚類的效果就不好,我們會希望透過最最佳化演算法最小化這個距離。在這本書中,距離可以定義為:
而 K 均值聚類會更形象地利用影象展示聚類效果,下圖展示了 K 均值聚類迭代一次的更新過程:
而這一更新過程會有對應的為程式碼:
除了這些基礎內容外,這本書還會展示很多視覺化內容以幫助理解理論知識,例如展示了最終聚類結果的圖 4.4 和展示了損失函式下降趨勢的圖 4.5:
當然,K 均值聚類還提供了對應 Julia 實現,如下展示了實現該演算法的程式碼,讀者在學習這本書的同時還能順便學學 Julia 語言。
function kmeans(X, k; maxiters = 100, tol = 1e-5) if ndims(X) == 2 X = [X[:,i] for i in 1:size(X,2)] end; N = length(X) n = length(X[1]) distances = zeros(N) reps = [zeros(n) for j=1:k] assignment = [ rand(1:k) for i in 1:N ] Jprevious = Inf for iter = 1:maxiters for j = 1:k group = [i for i=1:N if assignment[i] == j] reps[j] = sum(X[group]) / length(group); end; for i = 1:N (distances[i], assignment[i]) = findmin([norm(X[i] - reps[j]) for j = 1:k]) end; J = norm(distances)^2 / N println("Iteration ", iter, ": Jclust = ", J, ".") if iter > 1 && abs(J - Jprevious) < tol * J return assignment, reps end Jprevious = J endend最後,這本書的對應程式碼和資料都可以在 GitHub 中找到:https://github.com/VMLS-book。
回覆列表
強烈推薦:
3blue1brown《線性代數的本質》系列
B站上就有
這個系列用幾何直觀幫助我們理解線性代數的幾何本質,用於入門是最好的