關注公衆號「執鳶者」,回覆「資料」獲取500G資料(各「兵種」均有),還有專業交流羣等你一塊兒來瀟灑。(哈哈)上一篇文章講述了機器學習的基本知識點,這一篇就開啓一些算法的摸索之路。既然咱們是前端研發工程師,那就選擇ml.js這個庫進行編碼。本次涉及到的算法包含:KNN、決策樹、隨機森林、樸素貝葉斯、支持向量機、線性迴歸、K-均值聚類算法,這七個算法橫跨監督學習算法(分類算法、迴歸算法)、非監督學習算法,能夠做爲前端入門機器學習的必修課程,也可做爲既將到來的端智能時代的必讀刊物。javascript
1、定義前端
若是一個樣本在特徵空間中的k個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。(一般k是不大於20的整數)
2、優缺點java
優勢算法
缺點dom
3、計算距離機器學習
對於KNN算法,最核心的內容是計算距離,兩個樣本之間的距離能夠經過歐氏距離計算。其計算公式爲:
4、應用場景函數
小數據場景(幾千~幾萬樣本),可用於字符識別、文本分類、圖像識別等領域
5、代碼post
const KNN = require('ml-knn'); // 訓練集特徵 const dataset = [ [1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1] ]; // 訓練集目標 const labels = ['A', 'A', 'B', 'B']; // 實例化KNN算法(進行訓練) const knn = new KNN(dataset, labels, { k: 3}); // 須要進行預測的點 const predictDataSet = [[0, 0], [3, 1]]; // 進行預測 predictLabels = knn.predict(predictDataSet); console.log(predictLabels);// [ 'B', 'A' ]
1、定義性能
決策樹(Decision Tree)是在已知各類狀況發生機率的基礎上,經過構成決策樹來求取淨現值的指望值大於等於零的機率,評價項目風險,判斷其可行性的決策分析方法,是直觀運用機率分析的一種圖解法。決策樹是一種樹形結構,其中每一個內部節點表示一個屬性上的測試,每一個分支表明一個測試輸出,每一個葉節點表明一種類別。
2、優缺點學習
優勢
缺點
3、應用場景
經常使用於解決分類和迴歸問題,用該算法的前提條件是:
1. 具備決策者指望達到的明確目標 2. 存在決策者能夠選擇的兩個以上的可行的備選方案 3. 存在決策者沒法控制的兩個以上不肯定因素 4. 不一樣方案在不一樣因素下的收益或損失能夠計算出來 5. 決策者能夠估計不肯定因素髮生的機率
4、重點知識點
信息是很抽象的概念,很難進行量化對量,爲了解決對信息的量化度量問題,香農提出了「信息熵」的概念。信息熵是在信息的基礎上,將有可能產生的信息定義爲一個隨機變量,變量的指望就是信息熵。信息熵的計算公式爲(單位爲比特):
注:熵是用來度量不肯定性,熵越大則其不肯定性越大,反之越小
信息增益在決策樹算法中是用來選擇特徵的指標,信息增益越大,則這個特徵的選擇性越好,在機率論中定義爲:待分類的集合的熵和選定某個特徵的條件熵之差。其計算公式爲:
注:
(1)ID3算法
ID3算法是採用信息增益做爲特徵選擇的標準,信息增益越大,說明按此特徵分類後越能消除信息的不肯定性。
(2)C4.5算法
ID3算法具備兩大缺點:一個是類別越多的特徵計算出的信息增益越大,易致使生成的決策樹廣而淺;另外一個是隻能處理離散變量,不能處理連續變量。C4.5是在ID3的算法基礎上採用信息增益率做爲特徵選擇,經過增長類別的懲罰因子,規避了類別越多信息增益越大的問題,同時也能夠對連續變量經過均值離散化的方式解決沒法處理連續變量的問題。
(3)CART算法
C4.5存在不能處理迴歸問題的缺點,該缺點由CART解決。CART不在經過信息熵的方式選取最優劃分特徵,而是採用基尼係數(基尼不純度),二者衡量信息量的做用至關,但基尼係數因爲沒有對數運算,可大大減小計算開銷。
5、代碼
const irisDataset = require('ml-dataset-iris'); const { DecisionTreeClassifier } = require('ml-cart'); // 獲取訓練集中的特徵值 const dataSet = irisDataset.getNumbers(); // 獲取訓練集中的目標值,並轉換爲標量 const labels = irisDataset .getClasses() .map(elem => irisDataset.getDistinctClasses().indexOf(elem)); // 實例化決策樹的分類器 const dTClassifier = new DecisionTreeClassifier({ gainFunction: 'gini', maxDepth: 10, minNumSamples: 3 }); // 進行訓練 dTClassifier.train(dataSet, labels); const predictDataset = [[5.1,3.5,1.4,0.2]]; // 進行預測 const result = dTClassifier.predict(predictDataset); // 結果轉換爲對應的文本形式 console.log(result.map(value => irisDataset.getDistinctClasses()[value]));
1、定義
在機器學習中,隨機森林是一個包含多個決策樹的分類器,其輸出的類別是由個別樹輸出的類別的衆數而定(隨機森林就是經過集成學習的思想將多棵樹集成的一種算法,其基本單元是決策樹)。
2、優缺點
優勢
缺點
3、重要知識點
(1)對於每棵樹隨機有放回的從訓練集中抽取N個訓練樣本,做爲該樹的訓練集
(2)指定一個常數m<<M,隨機地從M個特徵中選取m個特徵子集,每次樹進行分裂時,從這m個特徵中選擇最優的
(3)每棵樹都盡最大程度的生長,而且沒有剪枝過程。
隨機抽樣是爲了保證每棵樹的訓練集都不同,若不隨機抽樣會致使最終訓練出的分類結果徹底同樣。
有放回的抽樣才能保證每次抽取時的機率是同樣的,達到獨立同分布,可保證每一棵決策樹都是相互獨立的。
(1)森林中任意兩棵樹的相關性:相關性越大,錯誤率越大
(2)森林中每棵樹的分類能力:每棵樹的分類能力越強,整個森林的錯誤率越低
(注:減少特徵選擇個數m,樹的相關性和分類能力會相應下降,反之會隨之增大)
4、代碼
const irisDataset = require('ml-dataset-iris'); const { RandomForestClassifier } = require('ml-random-forest'); // 獲取訓練集中的特徵值 const dataSet = irisDataset.getNumbers(); // 獲取訓練集中的目標值,並轉換爲標量 const labels = irisDataset .getClasses() .map(elem => irisDataset.getDistinctClasses().indexOf(elem)); // 實例化分類器 const rFClassifier = new RandomForestClassifier({ seed: 3, maxFeatures: 0.8, replacement: true, nEstimators: 25 }); // 進行訓練 rFClassifier.train(dataSet, labels); const predictDataset = [[5.1,3.5,1.4,0.2]]; // 進行預測 const result = rFClassifier.predict(predictDataset); // 結果轉換爲對應的文本形式 console.log(result.map(value => irisDataset.getDistinctClasses()[value]));
1、定義
樸素貝葉斯法(NBC)是基於貝葉斯定理與特徵條件獨立假設的分類方法。先經過已給定的訓練集,以特徵詞之間獨立做爲前提假設,學習從輸入到輸出的聯合機率分佈,再基於學習到的模型,輸入X求出使得後驗機率最大的輸出Y。
2、優缺點
優勢
缺點
3、應用場景
4、重要知識點
注:貝葉斯公式是打通P(W|C)和P(C|W)的橋樑
爲了防止計算出的分類機率爲0,因此引入拉普拉斯平滑係數,即讓P(W1|C)不爲0,其計算公式爲:
注:其中α爲指定係數,通常爲1;m爲訓練文檔中統計出的特徵詞個數
(1)高斯分佈樸素貝葉斯——用於通常分類問題
(2)多項式分佈樸素貝葉斯——適用於文本數據(特徵表示的是次數)
(3)伯努利分佈樸素貝葉斯——適用於伯努利分佈、文本數據(特徵表示的是是否出現)
5、代碼
const irisDataset = require('ml-dataset-iris'); const { GaussianNB } = require('ml-naivebayes'); // 獲取訓練集中的特徵值 const dataSet = irisDataset.getNumbers(); // 獲取訓練集中的目標值 const labels = irisDataset .getClasses() .map(elem => irisDataset.getDistinctClasses().indexOf(elem)); //實例化分類器 const gaussianNB = new GaussianNB(); // 進行訓練 gaussianNB.train(dataSet, labels); const predictDataset = [[5.1,3.5,1.4,0.2]]; // 進行預測 const result = gaussianNB.predict(predictDataset); // 結果轉換爲對應的文本形式 console.log(result.map(value => irisDataset.getDistinctClasses()[value]));
1、定義
支持向量機(SVM)是一類按監督學習方式對數據進行二元分類的廣義線性分類器,其決策邊界是對學習樣本求解的最大邊距超平面。
2、優缺點
優勢
缺點
3、應用場景
SVM在各領域的模式識別問題中有應用,包括人像識別、文本分類、手寫字符識別、生物信息學等。
4、重要知識點
(1) 線性可分:在二維空間上,兩類點被一條直線徹底分開叫作線性可分
(2)最大間隔超平面:從二維擴展到多維空間中,將兩個點集徹底正確地劃分開就造成一個超平面,爲了使這個超平面更具魯棒性,則會找最佳超平面(即爲最大間隔超平面,該平面是以最大間隔把兩類樣本分開的超平面)。(兩類樣本分別分割在該超平面的兩側、兩側距離超平面最近的樣本點到超平面的距離被最大化了)
(3)支持向量:樣本中距離超平面最近的一些點叫支持向量
(4)軟間隔:對於不可以徹底線性可分的樣本可引入軟間隔,相比於硬間隔的苛刻條件,軟間隔容許個別樣本出如今間隔帶裏面。(注:硬間隔和軟間隔均是在說樣本的徹底線性可分或者大部分樣本點的線性可分)
將線性不可分樣本映射到高維空間中,使樣本在高維空間線性可分,此時因爲維度提升會致使計算量增大,因此須要使用核函數幫助處理,引入核函數後就不須要計算高維甚至無窮維空間的內積了。
(1)減小了計算量
(2)減小了存儲數據的內存使用量
(1)線性核函數
(2)多項式核函數
(3)高斯核函數
5、代碼
const SVM = require('libsvm-js/asm'); const svm = new SVM({ kernel: SVM.KERNEL_TYPES.RBF, type: SVM.SVM_TYPES.C_SVC, gamma: 1, cost: 1 }); const dataSet = [[0, 0], [1, 1], [1, 0], [0, 1]]; const labels = [0, 0, 1, 1]; // 進行訓練 svm.train(dataSet, labels); // 進行預測 const predictedLabel = svm.pred
1、定義
線性迴歸是利用迴歸方程(函數)對一個或多個自變量(特徵值)和因變量(目標值)之間關係進行建模的一種分析方式。只有一個自變量的狀況稱爲單變量回歸,大於一個自變量的狀況叫作多元迴歸。
2、優缺點
優勢
缺點
3、應用場景
4、重要知識點
(1)定義:一個建設在訓練數據上可以得到比其它假設更好的擬合,可是在測試數據集上卻不能很好地擬合數據,此時認爲這個假設出現了過擬合現象。(模型過於複雜)
(2)緣由:原始特徵過多,存在一些嘈雜特徵
(3)解決辦法:正則化
4.欠擬合
(1)定義:一個假設在訓練數據集上不能得到很好的擬合,而且在測試數據集上也不能很好地擬合數據,此時認爲這個假設出現了欠擬合的現象。(模型過於簡單)
(2)緣由:學習到數據的特徵過少
(3)解決辦法:增長數據的特徵數量
(1)L2正則化
L2正則化可使得其中一些W都很小(接近於0),削弱某個特徵影響。Ridge迴歸就是用的L2正則化。
(2)L1正則化
L1正則化可使得其中一些W的值直接爲0,刪除整個特徵的影響。LASSO迴歸用的就是L1正則化。
5、代碼
const SimpleLinearRegression = require('ml-regression-simple-linear'); const x = [0.5, 1, 1.5, 2, 2.5]; const y = [0, 1, 2, 3, 4]; const regression = new SimpleLinearRegression(x, y); const result = regression.predict(3); console.log(result);
1、定義
K均值聚類算法是一種迭代求解的聚類分析算法,其步驟爲:
2、優缺點
優勢
缺點
3、代碼
const kmeans = require('ml-kmeans'); // 須要進行聚類的所有數據 const data = [[1, 1, 1], [-1, -1, -1], [-1, -1, -1.5], [1, 2, 1]]; // 質心 const centers = [[1, 2, 1], [-1, -1, -1]]; const ans = kmeans(data, 2, { initialization: centers }); console.log(ans);
1.若是以爲這篇文章還不錯,來個分享、點贊吧,讓更多的人也看到
2.關注公衆號執鳶者,領取學習資料(前端「多兵種」資料),按期爲你推送原創深度好文