圖解機器學習
每當提到機器學習,大家總是被其中的各種各樣的演算法和方法搞暈,覺得無從下手。確實,機器學習的各種套路確實不少,但是如果掌握了正確的路徑和方法,其實還是有跡可循的,這裡我推薦SAS的Li Hui的這篇博客,講述了如何選擇機器學習的各種方法。
另外,Scikit-learn 也提供了一幅清晰的路線圖給大家選擇:
其實機器學習的基本演算法都很簡單,下面我們就利用二維數據和交互圖形來看看機器學習中的一些基本演算法以及它們的原理。(另外向Bret Victor致敬,他的 Inventing on principle 深深的影響了我)
所有的代碼即演示可以在我的Codepen的這個Collection中找到。
首先,機器學習最大的分支的監督學習和無監督學習,簡單說數據已經打好標籤的是監督學習,而數據沒有標籤的是無監督學習。從大的分類上看,降維和聚類被劃在無監督學習,回歸和分類屬於監督學習。
無監督學習
如果你的數據都沒有標籤,你可以選擇花錢請人來標註你的數據,或者使用無監督學習的方法。
首先你可以考慮是否要對數據進行降維。
降維
降維顧名思義就是把高維度的數據變成為低維度。常見的降維方法有PCA, LDA, SVD等。
主成分分析 PCA
降維里最經典的方法是主成分分析PCA,也就是找到數據的主要組成成分,拋棄掉不重要的成分。
https://www.zhihu.com/video/952755312994807808這裡我們先用滑鼠隨機生成8個數據點,然後繪製出表示主成分的白色直線。這根線就是二維數據降維後的主成分,藍色的直線是數據點在新的主成分維度上的投影線,也就是垂線。主成分分析的數學意義可以看成是找到這根白色直線,使得投影的藍色線段的長度的和為最小值(嚴格地說應該是平方和最小)。
See the Pen ML Explained PCA by gangtao (@gangtao) on CodePen.
更多PCA的相關例子,可以參考:
- D3 http://bl.ocks.org/hardbyte/40cd6622cffbe98055d3
- http://setosa.io/ev/principal-component-analysis/
聚類
因為在非監督學習的環境下,數據沒有標籤,那麼能對數據所做的最好的分析除了降維,就是把具有相同特質的數據歸併在一起,也就是聚類。
層級聚類 Hierachical Cluster
該聚類方法用於構建一個擁有層次結構的聚類,
https://www.zhihu.com/video/952755268329758720
如上圖所示,層級聚類的演算法非常的簡單:
- 初始時刻,所有點都自己是一個聚類
- 找到距離最近的兩個聚類(剛開始也就是兩個點),形成一個聚類
- 兩個聚類的距離指的是聚類中最近的兩個點之間的距離
- 重複第二步,直到所有的點都被聚集到聚類中。
See the Pen ML Explained Hierarchical Clustering by gangtao (@gangtao) on CodePen.
KMeans
KMeans中文翻譯K均值演算法,是最常見的聚類演算法。
https://www.zhihu.com/video/952755189871026176- 隨機在圖中取K(這裡K=3)個中心種子點。
- 然後對圖中的所有點求到這K個中心種子點的距離,假如點P離中心點S最近,那麼P屬於S點的聚類。
- 接下來,我們要移動中心點到屬於他的「聚類」的中心。
- 然後重複第2)和第3)步,直到,中心點沒有移動,那麼演算法收斂,找到所有的聚類。
KMeans演算法有幾個問題:
- 如何決定K值,在上圖的例子中,我知道要分三個聚類,所以選擇K等於3,然而在實際的應用中,往往並不知道應該分成幾個類
- 由於中心點的初始位置是隨機的,有可能並不能正確分類,大家可以在我的Codepen中嘗試不同的數據
- 如下圖,如果數據的分布在空間上有特殊性,KMeans演算法並不能有效的分類。中間的點被分別歸到了橙色和藍色,其實都應該是藍色。
https://www.zhihu.com/video/952755146149617664
See the Pen ML Explained KMeans by gangtao (@gangtao) on CodePen.
DBSCAN
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)中文是基於密度的聚類演算法。
DBSCAN演算法基於一個事實:一個聚類可以由其中的任何核心對象唯一確定。
演算法的具體聚類過程如下:掃描整個數據集,找到任意一個核心點,對該核心點進行擴充。擴充的方法是尋找從該核心點出發的所有密度相連的數據點(注意是密度相連)。遍歷該核心點的鄰域內的所有核心點(因為邊界點是無法擴充的),尋找與這些數據點密度相連的點,直到沒有可以擴充的數據點為止。最後聚類成的簇的邊界節點都是非核心數據點。之後就是重新掃描數據集(不包括之前尋找到的簇中的任何數據點),尋找沒有被聚類的核心點,再重複上面的步驟,對該核心點進行擴充直到數據集中沒有新的核心點為止。數據集中沒有包含在任何簇中的數據點就構成異常點。
https://www.zhihu.com/video/952755076066983936See the Pen ML Explained DBSCAN by gangtao (@gangtao) on CodePen.
如上圖所示,DBSCAN可以有效的解決KMeans不能正確分類的數據集。並且不需要知道K值。
當然,DBCSAN還是要決定兩個參數,如何決定這兩個參數是分類效果的關鍵因素:
- 一個參數是半徑(Eps),表示以給定點P為中心的圓形鄰域的範圍;
- 另一個參數是以點P為中心的鄰域內最少點的數量(MinPts)。如果滿足:以點P為中心、半徑為Eps的鄰域內的點的個數不少於MinPts,則稱點P為核心點。
監督學習
監督學習中的數據要求具有標籤。也就是說針對已有的結果去預測新出現的數據。如果要預測的內容是數值類型,我們稱作回歸,如果要預測的內容是類別或者是離散的,我們稱作分類。
其實回歸和分類本質上是類似的,所以很多的演算法既可以用作分類,也可以用作回歸。
回歸
線性回歸
線性回歸是最經典的回歸演算法。
在統計學中,線性回歸(Linear regression)是利用稱為線性回歸方程的最小二乘函數對一個或多個自變數和因變數之間關係進行建模的一種回歸分析。 這種函數是一個或多個稱為回歸係數的模型參數的線性組合。 只有一個自變數的情況稱為簡單回歸,大於一個自變數情況的叫做多元回歸。
https://www.zhihu.com/video/952755489080090624See the Pen ML Explained Linear Regression by gangtao (@gangtao) on CodePen.
如上圖所示,線性回歸就是要找到一條直線,使得所有的點預測的失誤最小。也就是圖中的藍色直線段的和最小。這個圖很像我們第一個例子中的PCA。仔細觀察,分辨它們的區別。
如果對於演算法的的準確性要求比較高,推薦的回歸演算法包括:隨機森林,神經網路或者Gradient Boosting Tree。
如果要求速度優先,建議考慮決策樹和線性回歸。
分類
邏輯回歸
邏輯回歸雖然名字是回歸,但是卻是個分類演算法。因為它和SVM類似是一個二分類,數學模型是預測1或者0的概率。所以我說回歸和分類其實本質上是一致的。
https://www.zhihu.com/video/952755546030342144
See the Pen ML Explained Logistic Regression by gangtao (@gangtao) on CodePen.
這裡要注意邏輯回歸和線性SVM分類的區別,可以閱讀:
- https://www.zhihu.com/question/26768865
- http://blog.jobbole.com/98635/
支持向量機 SVM
如果對於分類的準確性要求比較高,可使用的演算法包括Kernel SVM,隨機森林,神經網路以及Gradient Boosting Tree。
給定一組訓練實例,每個訓練實例被標記為屬於兩個類別中的一個或另一個,SVM訓練演算法創建一個將新的實例分配給兩個類別之一的模型,使其成為非概率二元線性分類器(準確的說,SVM不是線性分類器)。SVM模型是將實例表示為空間中的點,這樣映射就使得單獨類別的實例被儘可能寬的明顯的間隔分開。然後,將新的實例映射到同一空間,並基於它們落在間隔的哪一側來預測所屬類別。
https://www.zhihu.com/video/952755603039272960See the Pen ML Explained SVM by gangtao (@gangtao) on CodePen.
如上圖所示,SVM演算法就是在空間中找到一條直線,能夠最好的分割兩組數據。使得這兩組數據到直線的距離的絕對值的和儘可能的大。
https://www.zhihu.com/video/952755658848739328See the Pen ML Explained SVM Kernels by gangtao (@gangtao) on CodePen.
上圖示意了不同的核方法的不同分類效果。
決策樹
如果要求分類結果是可以解釋的,可以考慮決策樹或者邏輯回歸。
決策樹(decision tree)是一個樹結構(可以是二叉樹或非二叉樹)。
其每個非葉節點表示一個特徵屬性上的測試,每個分支代表這個特徵屬性在某個值域上的輸出,而每個葉節點存放一個類別。
使用決策樹進行決策的過程就是從根節點開始,測試待分類項中相應的特徵屬性,並按照其值選擇輸出分支,直到到達葉子節點,將葉子節點存放的類別作為決策結果。
決策樹可以用於回歸或者分類,下圖是一個分類的例子。
https://www.zhihu.com/video/952755717564850176See the Pen ML Explained Decision Tree by gangtao (@gangtao) on CodePen.
如上圖所示,決策樹把空間分割成不同的區域。
樸素貝葉斯
當數據量相當大的時候,樸素貝葉斯方法是一個很好的選擇。
15年我在公司給小夥伴們分享過bayers方法,可惜speaker deck被牆了,如果有興趣可以自行想辦法。
(註:由於知乎文章最多只能上傳10個視頻,這裡開始就沒圖了,大家自行想像或者去圖解機器學習 - naughty的個人頁面 看動圖。)
https://github.com/gangtao/mlexplain/blob/master/movie/bayes_classifier.gif?raw=trueSee the Pen ML Explained Naive Bayes by gangtao (@gangtao) on CodePen.
如上圖所示,大家可以思考一下左下的綠點對整體分類結果的影響。
KNN
KNN分類可能是所有機器學習演算法里最簡單的一個了。
https://github.com/gangtao/mlexplain/blob/master/movie/knn_classifier.gif?raw=trueSee the Pen ML Explained KNN by gangtao (@gangtao) on CodePen.
如上圖所示,K=3,滑鼠移動到任何一個點,就找到距離該點最近的K個點,然後,這K個點投票,多數表決獲勝。就是這麼簡單。
總結
本文利用二維交互圖幫助大家理解機器學習的基本演算法,希望能增加大家對機器學習的各種方法有所了解。所有的代碼可以在參考中找到。歡迎大家來和我交流。
參考:
- 代碼和演示動畫
- 我的Codepen Collection 包含了所有的演示代碼
- 我的github包含了所有的演示動畫
- 基於JavaScript的機器學習的類庫和演示
- Machine learning tools in JavaScript 基於JavaScript的機器學習庫,本文中的一些演示用到了該庫。
- 另一個基於JavaScript的機器學習庫,沒有前一個功能多,也沒有前一個活躍,但是有很好的演示
- 不錯的演示,有三種回歸和一個聚類
- 如果你像想要自己構建機器學的演算法,可以用到的一些數學基礎類庫
- Numeric Javascript 是基於JavaScript的數值計算和分析的類庫,提供線性代數,複數計算等功能。
- Mathjs 另一個基於JavaScript的數學計算庫,這個和前一個可以看作是和Python的numpy/scipy/sympy 對應JavaScript的庫。
- Victorjs 2D向量庫
- 推薦一些機器學習的路線圖
- https://ml-cheatsheet.readthedocs.io/en/latest/
- 10大機器學習演算法 https://www.gitbook.com/book/wizardforcel/dm-algo-top10
- http://blogs.sas.com/content/subconsciousmusings/2017/04/12/machine-learning-algorithm-use/
- http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
- 工具
- 把mov文件在線轉換為動圖 https://convertio.co/zh/mov-gif/ 或者 https://cloudconvert.com/mov-to-gif
- gif 編輯工具 https://ezgif.com
最後感謝我的朋友Zidong的意見,我對本文做了一些修改。把邏輯回歸提前介紹,並加了一些注釋,修正了一些不太準確的地方。
推薦閱讀:
※機器學習基石筆記13:過擬合(OverFitting)
※My First Machine Learning Study Notes
※十分種讀懂KNN
※Zero-Shot Learning with Semantic Output Codes(NIPS2009)
※機器學習面試之偏差方差