WEAI 為AI吶喊

昨天

史上最全機器學習經典演算法詳解(附實現程式碼)

以下內容整理自清華大學《2019中國人工智慧發展報告》

本文字數約1W字,仔細閱讀需要15分鐘以上,

建議關注本公眾號以及收藏本文!

因為人工智慧的興起,機器學習成為時下非常火熱的話題,那麼你知道什麼是機器學習嗎?

機器學習是一門多領域交叉學科,涉及機率論、統計學、逼近論、凸分析、演算法複雜度理論等多門學科。

專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。其過程可以用下圖簡單表示:

史上最全機器學習經典演算法詳解(附實現程式碼)

機器學習演算法可以按照不同的標準來進行分類。比如按函式 f (x, θ)的不同,機器學習演算法可以分為

線性模型

非線性模型

;按照學習準則的不同,機器學習演算法也可以分為

統計方法

非統計方法

。但一般來說,我們會按照訓練樣本提供的資訊以及反饋方式的不同,將機器學習演算法分為以下幾類:

史上最全機器學習經典演算法詳解(附實現程式碼)

監督學習(Supervised Learning)

監督學習中的資料集是有標籤的, 就是說對於給出的樣本我們是知道答案的。如果機器學習的目標是透過建模樣本的特徵x和標籤y之間的關係:f(x,θ)或p(y|x, θ),並且訓練集中每個樣本都有標籤,那麼這類機器學習稱為監督學習。根據標籤型別的不同,又可以將其分為分類問題和迴歸問題兩類。前者是預測某一樣東西所屬的類別(離散的),比如給定一個人的身高、年齡、體重等資訊,然後判斷性別、是否健康等;後者則是預測某一樣本所對應的實數輸出(連續的),比如預測某一地區人的平均身高。我們大部分學到的模型都是屬於監督學習,包括線性分類器、支援向量機等。

常見的監督學習演算法有:

k-近鄰演算法

(k-NearestNeighbors, kNN)、

決策樹

(Decision Trees)、

樸素貝葉斯

(Naive Bayesian)等。監督學習的基本流程如下圖所示:

史上最全機器學習經典演算法詳解(附實現程式碼)

史上最全機器學習經典演算法詳解(附實現程式碼)

無監督學習(Unsupervised Learning,UL)

跟監督學習相反,無監督學習中資料集是完全沒有標籤的,依據相似樣本在資料空間中一般距離較近這一假設, 將樣本分類。

常見的無監督學習演算法包括:稀疏自編碼(sparse auto-encoder)、 主成分分析(Principal Component Analysis, PCA)、 K-Means 演算法(K 均值演算法)、 DBSCAN演算法(Density-Based Spatial Clustering of Applications with Noise) 、最大期望算

法(Expectation-Maximization algorithm, EM)等。

利用無監督學習可以解決的問題可以分為

關聯分析、聚類問題和維度約減。

關聯分析是指發現不同事物之間同時出現的機率。

在購物籃分析中被廣泛地應用。如果發現買麵包的客戶有百分之八十的機率買雞蛋,那麼商家就會把雞蛋和麵包放在相鄰的貨架上。

聚類問題是指將相似的樣本劃分為一個簇(cluster)。

與分類問題不同,聚類問題預先並不知道類別,自然訓練資料也沒有類別的標籤。

維度約減:顧名思義,是指減少資料維度的同時保證不丟失有意義的資訊。

利用特徵提取方法和特徵選擇方法,可以達到維度約減的效果。特徵選擇是指選擇原始變數的子集。特徵提取是將資料從高維度轉換到低維度。廣為熟知的主成分分析演算法就是特徵提取的方法。非監督學習的基本處理流程如圖 2-4 所示:

史上最全機器學習經典演算法詳解(附實現程式碼)

可以很清楚的看到相對於監督學習, 非監督學習的過程中沒有監督者(Supervisor)的干預。下圖是一個典型的監督學習和非監督學習的對比,左圖是對一群有標籤資料的分類, 而右圖是對一群無標籤資料的聚類。

史上最全機器學習經典演算法詳解(附實現程式碼)

史上最全機器學習經典演算法詳解(附實現程式碼)

半監督學習(Semi-Supervised Learning)

半監督學習是監督學習與無監督學習相結合的一種學習方法。半監督學習一般針對的問題是資料量大, 但是有標籤資料少或者說標籤資料的獲取很難很貴的情況,訓練的時候有一部分是有標籤的, 而有一部分是沒有的。與使用所有標籤資料的模型相比,使用訓練集的訓練模型在訓練時可以更為準確,而且訓練成本更低。常見的兩種半監督的學習方式是直推學習(Transductive learning)和歸納學習(Inductive learning)。

直推學習(Transductive learning):

沒有標記的資料是測試資料,這個時候可以用測試的資料進行訓練。這裡需要注意,這裡只是用了測試資料中的特徵(feature)而沒有用標籤(label),所以並不是一種欺騙的方法。

歸納學習(Inductive learning):

沒有標籤的資料不是測試集。

半監督學習的基本流程如圖 2-6 所示:

史上最全機器學習經典演算法詳解(附實現程式碼)

監督學習、半監督學習和非監督學習之間的區別可以用圖 2-7 表示:

史上最全機器學習經典演算法詳解(附實現程式碼)

可以看到, 圖 2-7(a)中,紅色三角形資料和藍色圓點資料為標註資料;圖2-7(b)中,綠色的小圓點為非標註資料。圖 2-7(c) 顯示監督學習將有標籤的資料進行分類;而半監督學習如圖 2-7(d)中部分是有標籤的,部分是沒有標籤的,一般而言, 半監督學習側重於在有監督的分類演算法中加入無標記樣本來實現半監督分類。

史上最全機器學習經典演算法詳解(附實現程式碼)

強化學習(Reinforcement Learning,RL)

強化學習從動物學習、引數擾動自適應控制等理論發展而來, 基本原理是:

如果 Agent 的某個行為策略導致環境正的獎賞(強化訊號),那麼 Agent 以後產生這個行為策略的趨勢便會加強。Agent 的目標是在每個離散狀態發現最優策略以使期望的折扣獎賞和最大。

強化學習在機器人學科中被廣泛應用。在與障礙物碰撞後,機器人透過感測器收到負面的反饋從而學會去避免衝突。在影片遊戲中,可以透過反覆試驗採用一定的動作,獲得更高的分數。Agent 能利用回報去理解玩家最優的狀態和當前應該採取的動作。

下圖採用一隻老鼠來模擬強化學習中的 Agent,其任務是走出迷宮,每走一步都有一個方法來衡量其走的好與壞,基本學習過程是當其走得好的時候就給其一定的獎勵(如一塊蛋糕)。透過這種方式, Agent 在行動評價的環境中獲得知識,改進行動方案以適應環境。

史上最全機器學習經典演算法詳解(附實現程式碼)

下面內容對部分機器學習代表演算法進行介紹。

1線性迴歸

在機器學習中,我們有一組輸入變數(x)用於確定輸出變數(y)。輸入變數和輸出變數之間存在某種關係,機器學習的目標是量化這種關係。

史上最全機器學習經典演算法詳解(附實現程式碼)

線上性迴歸中,輸入變數(x)和輸出變數(y)之間的關係表示為 y = ax + b的方程。因此,線性迴歸的目標是找出係數 a 和 b 的值。這裡, a 是直線的斜率,b 是直線的截距。上圖顯示了資料集的 x 和 y 值,線性迴歸的目標是擬合最接近大部分點的線。

Python程式碼:

1。#Import Library

2。#Import other necessary libraries like pandas, numpy。。。

3。from sklearn import linear_model

4。#Load Train and Test datasets

5。#Identify feature and response variable(s) and values must be numeric and numpy arrays

6。x_train=input_variables_values_training_datasets

7。y_train=target_variables_values_training_datasets

8。x_test=input_variables_values_test_datasets

9。#Create linear regression object

10。linear = linear_model。LinearRegression()

11。#Train the model using the training sets and check score

12。linear。fit(x_train, y_train)

13。linear。score(x_train, y_train)

14。#Equation coefficient and Intercept

15。print(‘Coefficient: \n’, linear。coef_)

16。print(‘Intercept: \n’, linear。intercept_)

17。#Predict Output

18。predicted= linear。predict(x_test)

2分類與迴歸樹(CART)

CART是決策樹的一個實現方式,由 ID3,C4。5 演化而來,是許多基於樹的bagging、boosting模型的基礎。CART可用於分類與迴歸。

CART是在給定輸入隨機變數 x 條件下輸出隨機變數 y 的條件機率分佈,與ID和C4。5 的決策樹所不同的是,ID3 和C4。5 生成的決策樹可以是多叉的,每個節點下的叉數由該節點特徵的取值種類而定,比如特徵年齡分為(青年,中年,老年),那麼該節點下可分為 3 叉。而CART為假設決策樹為二叉樹,內部結點特徵取值為“是”和“否”。左分支取值為“是”,右分支取值為“否”。這樣的決策樹等價於遞迴地二分每一個特徵,將輸入空間劃分為有限個單元,並在這些單元上預測機率分佈,也就是在輸入給定的條件下輸出條件機率分佈。

Python程式碼:

1。#Import Library

2。#Import other necessary libraries like pandas, numpy。。。

3。from sklearn import tree

4。#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

5。# Create tree object

6。model = tree。DecisionTreeClassifier(criterion=‘gini’) # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini

7。# model = tree。DecisionTreeRegressor() for regression

8。# Train the model using the training sets and check score

9。model。fit(X, y)

0。model。score(X, y)

1。#Predict Output

2。predicted= model。predict(x_test)

3隨機森林(Random Forest)

隨機森林指的是利用多棵決策樹對樣本進行訓練並預測的一種分類器。它包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定。隨機森林是一種靈活且易於使用的機器學習演算法,即便沒有超引數調優,也可以在大多數情況下得到很好的結果。隨機森林也是最常用的演算法之一,因為它很簡易,既可用於分類也能用於迴歸。

其基本的構建演算法過程如下:

1。用 N 來表示訓練用例(樣本)的個數, M 表示特徵數目。

2。 輸入特徵數目 m,用於確定決策樹上一個節點的決策結果;其中 m 應遠小於 M。

3。 從 N 個訓練用例(樣本)中以有放回抽樣的方式,取樣 N 次,形成一個訓練集(即 bootstrap 取樣),並用未抽到的用例(樣本)作預測,評估其誤差。

4。 對於每一個節點,隨機選擇 m 個特徵,決策樹上每個節點的決定都是基於這些特徵確定的。根據這 m 個特徵,計算其最佳的分裂方式。

5。 每棵樹都會完整成長而不會剪枝,這有可能在建完一棵正常樹狀分類器後被採用)。

一個簡單的隨機森林演算法示意如下:

史上最全機器學習經典演算法詳解(附實現程式碼)

隨機森林集成了所有的分類投票結果,將投票次數最多的類別指定為最終的輸出,這就是一種最簡單的 Bagging 思想。

Python程式碼:

1。#Import Library

2。from sklearn。ensemble import RandomForestClassifier

3。#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

4。# Create Random Forest object

5。model= RandomForestClassifier()

6。# Train the model using the training sets and check score

7。model。fit(X, y)

8。#Predict Output

9。predicted= model。predict(x_test)

4邏輯迴歸

邏輯迴歸最適合二進位制分類(y=0 或 1 的資料集,其中 1 表示預設類)例如:在預測事件是否發生時,發生的事件被分類為1。在預測人會生病或不生病,生病的例項記為 1)。它是以其中使用的變換函式命名的,稱為邏輯函式 h(x) =1/(1+e-x),它是一個S形曲線。

在邏輯迴歸中,輸出是以預設類別的機率形式出現的。因為這是一個機率,所以輸出在0-1的範圍內。輸出(y值)透過對數轉換 x 值,使用對數函式 h(x)= 1/(1+e-x)來生成。然後應用一個閾值來強制這個機率進入二元分類。

史上最全機器學習經典演算法詳解(附實現程式碼)

圖2-11判斷了腫瘤是惡性還是良性。預設變數是y=1(腫瘤=惡性);x變數可以是腫瘤的資訊,例如腫瘤的尺寸。如圖所示,邏輯函式將資料集的各種例項的 x 值轉換成 0 到 1 的範圍。如果機率超過閾值 0。5(由水平線示出),則將腫瘤分類為惡性。

史上最全機器學習經典演算法詳解(附實現程式碼)

邏輯迴歸的目標是使用訓練資料來找到係數 b0 和 b1 的值,以使預測結果與實際結果之間的誤差最小化。這些係數是使用最大似然估計來計算的。

Python程式碼:

1。#Import Library

2。from sklearn。linear_model import LogisticRegression

3。#Assumed you have, X (predictor) and Y (target) for 4。training data set and x_test(predictor) of test_dataset

5。#Create logistic regression object

model = LogisticRegression()

6。# Train the model using the training sets and check score

7。model。fit(X, y)

8。model。score(X, y)

9。#Equation coefficient and Intercept

10。print(‘Coefficient: \n’, model。coef_)

11。print(‘Intercept: \n’, model。intercept_)

12。#Predict Output

13。predicted= model。predict(x_test)

5樸素貝葉斯(Naive Bayesian)

樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法。樸素貝葉斯分類器基於一個簡單的假定:

給定目標值時屬性之間相互條件獨立。

透過以上定理和“樸素”的假定,我們知道:

P(Category | Document) = P(Document | Category ) * P(Category) / P(Document)

樸素貝葉斯的基本方法:

在統計資料的基礎上,依據條件機率公式,計算當前特徵的樣本屬於某個分類的機率,選擇最大的機率分類。

對於給出的待分類項,求解在此項出現的條件下各個類別出現的機率,哪個最大,就認為此待分類項屬於哪個類別。其計算流程表述如下:

(1) x = {a1, a2,。。。, am}為待分類項,每個 ai為 x 的一個特徵屬性

(2) 有類別集合 C = {y1, y2, 。。。, yn}

(3) 計算 P(y1|x), P(y2|x), 。。。, P(yn|x)

(4) 如果 P(yk|x) = max{P(y1|x)

Python程式碼:

1。#Import Library

2。from sklearn。naive_bayes import GaussianNB

3。#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

4。#Create SVM classification object model = GaussianNB() #there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link

5。#Train the model using the training sets and check score

6。model。fit(X, y)

7。#Predict Output

8。predicted= model。predict(x_test)

6k最近鄰(kNN)

kNN(k-Nearest Neighbor)的核心思想是

如果一個樣本在特徵空間中的 k 個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。

該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。kNN 方法在做類別決策時,只與極少量的相鄰樣本有關。由於 kNN 方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,kNN 方法較其他方法更為適合。

kNN 演算法不僅可以用於分類,還可以用於迴歸。

透過找出一個樣本的 k 個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。如下圖是 kNN 演算法中, k 等於不同值時的演算法分類結果:

史上最全機器學習經典演算法詳解(附實現程式碼)

簡單來說, kNN 可以看成:

有那麼一堆你已經知道分類的資料,然後當一個新資料進入的時候,就開始跟訓練資料裡的每個點求距離,然後挑離這個訓練資料最近的 k 個點, 看看這幾個點屬於什麼型別,然後用少數服從多數的原則,給新資料歸類。

Python程式碼:

1。#Import Library

2。from sklearn。neighbors import KNeighborsClassifier

3。#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

4。#Create KNeighbors classifier object model

5。KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5

6。#Train the model using the training sets and check score

7。model。fit(X, y)

8。#Predict Output

9。predicted= model。predict(x_test)

7AdaBoost

Adaptive Boosting 或稱為 AdaBoost,是多種學習演算法的融合。它是一種迭代演算法,

其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個更強的最終分類器(強分類器)。

其演算法本身是透過改變資料分佈來實現的,它根據每次訓練集之中每個樣本的分類是否正確,以及上次的總體分類的準確率,來確定每個樣本的權值。將修改過權值的新資料集送給下層分類器進行訓練, 然後將每次訓練得到的分類器融合起來,作為最終的決策分類器。

史上最全機器學習經典演算法詳解(附實現程式碼)

AdaBoost 是最常用的演算法。它可用於迴歸或者分類演算法。

相比其他機器學習演算法,它克服了過擬合的問題,通常對異常值和噪聲資料敏感。為了建立一個強大的複合學習器, AdaBoost 使用了多次迭代。因此,它又被稱為“Adaptive Boosting” 。透過迭代新增弱學習器, AdaBoost 建立了一個強學習器。一個新的弱學習器加到實體上,並且調整加權向量,作為對前一輪中錯誤分類的樣例的迴應。得到的結果,是一個比弱分類器有更高準確性的分類器。

AdaBoost 有助於將弱閾值的分類器提升為強分類器。

上面的影象描述了AdaBoost 的執行,只用了簡單易於理解的程式碼在一個檔案中就實現了。這個函式包含一個弱分類器和 boosting 元件。弱分類器在一維的資料中嘗試去尋找最理想的閾值來將資料分離為兩類。boosting元件迭代呼叫分類器,經過每一步分類,它改變了錯誤分類示例的權重。因此,建立了一個級聯的弱分類器,它的行為就像一個強分類器。

目前,對 Adaboost 演算法的研究以及應用大多集中於分類問題,同時近年也出現了一些在迴歸問題上的應用。Adaboost 系列主要解決了:

兩類問題、多類單標籤問題、多類多標籤問題、大類單標籤問題和迴歸問題。

它用全部的訓練樣本進行學習。

Python程式碼:

1。#Import Library2。from sklearn。ensemble import GradientBoostingClassifier3。#Assumed you have,X(predictor)andY(target) for training data set and x_test(predictor) of test_dataset4。#Create Gradient Boosting Classifier object5。model=GradientBoostingClassifier(n_estimators=100,learning_rate=1。0,max_depth=1, random_state=0)6。#Train the model using the training sets and check score7。model。fit(X, y)8。#Predict Output9。predicted= model。predict(x_test)

8K-均值演算法(K-Means)

K-均值是著名聚類演算法,它找出代表聚類結構的 k 個質心。如果有一個點到某一質心的距離比到其他質心都近,這個點則指派到這個最近的質心所代表的簇。依次,利用當前已聚類的資料點找出一個新質心,再利用質心給新的資料指派一個簇。

史上最全機器學習經典演算法詳解(附實現程式碼)

K-均值演算法——在上圖中用“x” 表示聚類質心,用點表示訓練樣本:

a) 原始資料集

b) 隨機初始化聚類質心

c) (c-f)k-均值迭代 2 次的示意圖

在每次迭代中每個訓練樣例都被指派到一個最近的聚類質心, 每個聚類質心被移動到分配給它的點的平均值的位置。

Python程式碼:

1。#Import Library

2。from sklearn。cluster import KMeans

3。#Assumed you have, X(attributes) for training data set and x_test(attributes) of test_dataset

4。# Create KNeighbors classifier object model

k_means = KMeans(n_clusters=3, random_state=0)

5。# Train the model using the training sets and check score

6。model。fit(X)

7。#Predict Output

8。predicted= model。predict(x_test)

9支援向量機(SVM)

支援向量機(Support Vector Machine, SVM)是一類按監督學習(supervised learning)方式對資料進行二元分類(binary classification)的廣義線性分類器(generalized linear classifier)

,其決策邊界是對學習樣本求解的最大邊距超平面

(maximum-margin hyperplane)。基本思想是:

找到集合邊緣上的若干資料(稱為支援向量(Support Vector)),用這些點找出一個平面(稱為決策面),使得支援向量到該平面的距離最大。

由簡至繁的 SVM 模型包括:

當訓練樣本線性可分時,透過硬間隔最大化,學習一個線性可分支援向量機;

當訓練樣本近似線性可分時,透過軟間隔最大化,學習一個線性支援向量機;

當訓練樣本線性不可分時,透過核技巧和軟間隔最大化,學習一個非線性支援向量機;

在分類問題中,很多時候有多個解,如下圖左邊所示,在理想的線性可分的情況下其決策平面會有多個。而 SVM 的基本模型是在特徵空間上找到最佳的分離超平面使得訓練集上正負樣本間隔最大, SVM 演算法計算出來的分界會保留對類別最大的間距,即有足夠的餘量,如下圖右邊所示。

史上最全機器學習經典演算法詳解(附實現程式碼)

在解決線性不可分問題時,它可以透過引入核函式,巧妙地解決了在高維空間中的內積運算,從而很好地解決了非線性分類問題。如下圖所示,透過核函式的引入,將線性不可分的資料對映到一個高緯的特徵空間內,使得資料在特徵空間內是可分的。如下圖所示:

史上最全機器學習經典演算法詳解(附實現程式碼)

Python程式碼:

1。#Import Library

2。from sklearn import svm

3。#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

4。#Create SVM classification object

5。model = svm。svc() # there is various option associated with it, this is simple for classification。 You can refer link, for mo# re detail。

6。#Train the model using the training sets and check score

7。model。fit(X, y)

8。model。score(X, y)

9。#Predict Output

0。predicted= model。predict(x_test)

10人工神經網路ANN(Artificial Neural Network)

人工神經網路 ANN(Artificial Neural Network)是由大量處理單元互聯組成的非線性、自適應資訊處理系統。

它是一種模仿動物神經網路行為特徵,進行分散式並行資訊處理的演算法數學模型。其基本過程可以概述如下:外部刺激透過神經末梢,轉化為電訊號, 傳導到神經細胞(又叫神經元);無數神經元構成神經中樞;神經中樞綜合各種訊號,做出判斷;人體根據神經中樞的指令,對外部刺激做出反應。其過程表述如下圖所示:

史上最全機器學習經典演算法詳解(附實現程式碼)

人工神經網路經歷了漫長的發展階段。最早是上個世紀六十年代提出的“人造神經元”模型,叫做“感知器”(perceptron)。感知機模型是機器學習二分類問題中的一個非常簡單的模型。它的基本結構如下圖所示:

史上最全機器學習經典演算法詳解(附實現程式碼)

隨著反向傳播演算法、最大池化(max-pooling)等技術的發明,神經網路進入了飛速發展的階段。神經網路就是將許多個單一“神經元”聯結在一起,這樣,一個“神經元”的輸出就可以是另一個“神經元”的輸入。典型的人工神經網路具有以下三個部分:

結構(Architecture):

結構指定了網路中的變數和它們的拓撲關係。

激勵函式(Activity Rule):

大部分神經網路模型具有一個短時間尺度的動力學規則,來定義神經元如何根據其他神經元的活動來改變自己的激勵值。

學習規則(Learning Rule):

指定了網路中的權重如何隨著時間推進而調整。

一個典型的人工神經網路結構如下圖所示:

史上最全機器學習經典演算法詳解(附實現程式碼)

人工神經網路具有四個基本特徵:

非線性、 非侷限性、非常定性和非凸性。

人工神經網路的特點和優越性,主要表現在三個方面:具有

自學習功能

、具有

聯想儲存功能

和具有

高速尋找最優解

的能力。

最後

經過長時間的發展,人工智慧已經進入爆發階段,機器學習的相關演算法也逐漸得到完善並應用在各個AI領域。如果你已經熟悉Python,那麼不妨多練習以上的演算法,機器學習是深入學習人工智慧必須掌握的,希望以上內容能幫助更多的AI工程師或者即將成為AI工程師的IT人!最後,附一張機器學習思維導圖!

史上最全機器學習經典演算法詳解(附實現程式碼)

掃碼進入人工智慧學習交流群領取行業報告,隨時隨地瞭解人工智慧!

史上最全機器學習經典演算法詳解(附實現程式碼)