前端也要懂機器學習(下)

關注公衆號「執鳶者」,回覆「資料」獲取500G資料(各「兵種」均有),還有專業交流羣等你一塊兒來瀟灑。(哈哈)

上一篇文章講述了機器學習的基本知識點,這一篇就開啓一些算法的摸索之路。既然咱們是前端研發工程師,那就選擇ml.js這個庫進行編碼。本次涉及到的算法包含:KNN、決策樹、隨機森林、樸素貝葉斯、支持向量機、線性迴歸、K-均值聚類算法,這七個算法橫跨監督學習算法(分類算法、迴歸算法)、非監督學習算法,能夠做爲前端入門機器學習的必修課程,也可做爲既將到來的端智能時代的必讀刊物。javascript

1、監督學習算法

1.1 分類算法

1.1.1 K-近鄰分類算法(KNN)

1、定義前端

若是一個樣本在特徵空間中的k個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。(一般k是不大於20的整數)

2、優缺點java

  1. 優勢算法

    • 簡單有效
    • 精度高
    • 對異常值不敏感
    • 無須訓練
  2. 缺點dom

    • 計算複雜度高、空間複雜度高(計算量大,內存開銷大)
    • 必須指定K值,K值選擇不當則分類精度不能保證。(K值取很小,容易受到異常點的影響,容易出現過擬合;K值取很大,受到樣本均衡問題)

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.1.2 決策樹

1、定義性能

決策樹(Decision Tree)是在已知各類狀況發生機率的基礎上,經過構成決策樹來求取淨現值的指望值大於等於零的機率,評價項目風險,判斷其可行性的決策分析方法,是直觀運用機率分析的一種圖解法。決策樹是一種樹形結構,其中每一個內部節點表示一個屬性上的測試,每一個分支表明一個測試輸出,每一個葉節點表明一種類別。

2、優缺點學習

  1. 優勢

    • 計算複雜度不高
    • 輸出結果易於理解
    • 對中間值的缺失不敏感
    • 能夠處理連續和種類字段
    • 能夠處理不相關特徵數據
  2. 缺點

    • 可能出現過擬合現象,須要進行剪枝操做
    • 對於各種別樣本數量不一致的數據,信息增益偏向於那些更多數值的特徵

3、應用場景

經常使用於解決分類和迴歸問題,用該算法的前提條件是:
1. 具備決策者指望達到的明確目標
2. 存在決策者能夠選擇的兩個以上的可行的備選方案
3. 存在決策者沒法控制的兩個以上不肯定因素
4. 不一樣方案在不一樣因素下的收益或損失能夠計算出來
5. 決策者能夠估計不肯定因素髮生的機率

4、重點知識點

  1. 信息熵
信息是很抽象的概念,很難進行量化對量,爲了解決對信息的量化度量問題,香農提出了「信息熵」的概念。信息熵是在信息的基礎上,將有可能產生的信息定義爲一個隨機變量,變量的指望就是信息熵。信息熵的計算公式爲(單位爲比特):

注:熵是用來度量不肯定性,熵越大則其不肯定性越大,反之越小

  1. 信息增益
信息增益在決策樹算法中是用來選擇特徵的指標,信息增益越大,則這個特徵的選擇性越好,在機率論中定義爲:待分類的集合的熵和選定某個特徵的條件熵之差。其計算公式爲:

注:

  • g(D, A)表示特徵A對訓練數據集D的信息增益
  • H(D)表示集合D的信息熵
  • H(D|A)表示條件熵
  1. 經常使用算法

(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.1.3 隨機森林

1、定義

在機器學習中,隨機森林是一個包含多個決策樹的分類器,其輸出的類別是由個別樹輸出的類別的衆數而定(隨機森林就是經過集成學習的思想將多棵樹集成的一種算法,其基本單元是決策樹)。

2、優缺點

  1. 優勢

    • 具備極好的準確率(由集成算法的特色引入)
    • 抗過擬合能力:經過平均決策樹,下降過擬合的風險性(由隨機這個特色引入)
    • 可以有效地運行在大數據集上,處理具備高維特徵的輸入樣本,並且不須要降維
    • 可以評估各個特徵在分類問題上的重要性
  2. 缺點

    • 在某些噪音較大的分類或迴歸問題上會過擬合
    • 比決策樹算法更復雜,計算成本更高

3、重要知識點

  1. 隨機森林的每棵樹的生成規則(A表示訓練集總樣本個數、N表示訓練樣本個數、M表示特徵個數)

(1)對於每棵樹隨機有放回的從訓練集中抽取N個訓練樣本,做爲該樹的訓練集
(2)指定一個常數m<<M,隨機地從M個特徵中選取m個特徵子集,每次樹進行分裂時,從這m個特徵中選擇最優的
(3)每棵樹都盡最大程度的生長,而且沒有剪枝過程。

  1. 爲何要隨機抽樣訓練集?

隨機抽樣是爲了保證每棵樹的訓練集都不同,若不隨機抽樣會致使最終訓練出的分類結果徹底同樣。

  1. 爲何要有放回的抽樣?

有放回的抽樣才能保證每次抽取時的機率是同樣的,達到獨立同分布,可保證每一棵決策樹都是相互獨立的。

  1. 隨機森林分類效果(錯誤率)相關因素?

(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.1.4 樸素貝葉斯

1、定義

樸素貝葉斯法(NBC)是基於貝葉斯定理與特徵條件獨立假設的分類方法。先經過已給定的訓練集,以特徵詞之間獨立做爲前提假設,學習從輸入到輸出的聯合機率分佈,再基於學習到的模型,輸入X求出使得後驗機率最大的輸出Y。

2、優缺點

  1. 優勢

    • 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率
    • 對缺失數據不敏感,算法簡單,經常使用於文本分類
    • 分類準確度高,速度快
  2. 缺點

    • 使用了樣本獨立性的假設,若是特徵屬性由關聯性其效果較差

3、應用場景

  1. 文本分類
  2. 文字識別
  3. 圖像識別

4、重要知識點

  1. 貝葉斯公式

注:貝葉斯公式是打通P(W|C)和P(C|W)的橋樑

  1. 爲何引入拉普拉斯平滑係數

爲了防止計算出的分類機率爲0,因此引入拉普拉斯平滑係數,即讓P(W1|C)不爲0,其計算公式爲:

注:其中α爲指定係數,通常爲1;m爲訓練文檔中統計出的特徵詞個數

  1. 三種貝葉斯模型

(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.1.5 支持向量機

1、定義

支持向量機(SVM)是一類按監督學習方式對數據進行二元分類的廣義線性分類器,其決策邊界是對學習樣本求解的最大邊距超平面。

2、優缺點

  1. 優勢

    • 有嚴格的數學理論支持,可解釋性強,不依靠統計方法,簡化了一般的分類和迴歸問題。
    • 上述支持向量決定了最終結果,對異常值不敏感,能夠幫助抓住關鍵樣本,剔除大量冗餘樣本
    • 該算法簡單且具備較好的「魯棒性」
    • 計算的複雜度取決於支持向量的數目,而不是樣本空間的維數,某種意義上避免了「維數災難」
    • 泛化能力較強
  2. 缺點

    • 對大規模訓練樣本難以實施:SVM的空間消耗主要是存儲訓練樣本和核矩陣,因爲SVM是藉助二次規劃來求解支持向量,而求解二次規劃將涉及m階矩陣的運算,當m數目很大時該矩陣的存儲和計算將耗費大量的機器內存和運算時間。
    • 解決多分類問題困難:經典的支持向量機算法只給出了二類分類算法,解決多分類問題須要經過多個二類支持向量機的組合來解決(一對多組合模式、一對一組合模式和SVM決策樹)。
    • 對參數和核函數選擇敏感:支持向量機性能的優劣主要取決於核函數的選取。

3、應用場景

SVM在各領域的模式識別問題中有應用,包括人像識別、文本分類、手寫字符識別、生物信息學等。

4、重要知識點

  1. 重要概念

(1) 線性可分:在二維空間上,兩類點被一條直線徹底分開叫作線性可分

(2)最大間隔超平面:從二維擴展到多維空間中,將兩個點集徹底正確地劃分開就造成一個超平面,爲了使這個超平面更具魯棒性,則會找最佳超平面(即爲最大間隔超平面,該平面是以最大間隔把兩類樣本分開的超平面)。(兩類樣本分別分割在該超平面的兩側、兩側距離超平面最近的樣本點到超平面的距離被最大化了)

(3)支持向量:樣本中距離超平面最近的一些點叫支持向量

(4)軟間隔:對於不可以徹底線性可分的樣本可引入軟間隔,相比於硬間隔的苛刻條件,軟間隔容許個別樣本出如今間隔帶裏面。(注:硬間隔和軟間隔均是在說樣本的徹底線性可分或者大部分樣本點的線性可分)

  1. 對於線性不可分處理方式

將線性不可分樣本映射到高維空間中,使樣本在高維空間線性可分,此時因爲維度提升會致使計算量增大,因此須要使用核函數幫助處理,引入核函數後就不須要計算高維甚至無窮維空間的內積了。

  1. 引入核函數的好處

(1)減小了計算量

(2)減小了存儲數據的內存使用量

  1. 常見核函數分類

(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 迴歸算法

1.2.1 線性迴歸

1、定義

線性迴歸是利用迴歸方程(函數)對一個或多個自變量(特徵值)和因變量(目標值)之間關係進行建模的一種分析方式。只有一個自變量的狀況稱爲單變量回歸,大於一個自變量的狀況叫作多元迴歸。

2、優缺點

  1. 優勢

    • 思想簡單、容易實現、建模迅速,對於小數據量、簡單關係情形的頗有效
    • 是須要強大的非線性模型的基礎
    • 理解容易,其結果具備很好的可解釋型,有利於決策分析。
    • 能解決迴歸問題
  2. 缺點

    • 對於非線性數據或者數據特徵間具備相關性多項式迴歸難以建模
    • 難以很好地表達高度複雜的數據

3、應用場景

  1. 趨勢線(時間序列數據的長期走勢)
  2. 流行病學
  3. 金融(分析和計算投資的系統風險)
  4. 經濟學(預測消費支出、固定投資支出等)

4、重要知識點

  1. 迴歸目的——預測數值型的目標值
  2. 迴歸性能評價指標——均方偏差(MSE)
  3. 過擬合

(1)定義:一個建設在訓練數據上可以得到比其它假設更好的擬合,可是在測試數據集上卻不能很好地擬合數據,此時認爲這個假設出現了過擬合現象。(模型過於複雜)

(2)緣由:原始特徵過多,存在一些嘈雜特徵

(3)解決辦法:正則化

4.欠擬合

(1)定義:一個假設在訓練數據集上不能得到很好的擬合,而且在測試數據集上也不能很好地擬合數據,此時認爲這個假設出現了欠擬合的現象。(模型過於簡單)

(2)緣由:學習到數據的特徵過少

(3)解決辦法:增長數據的特徵數量

  1. 正則化

(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);

2、非監督學習算法

2.1 K-均值聚類算法

1、定義

K均值聚類算法是一種迭代求解的聚類分析算法,其步驟爲:
  1. 隨機設置K個特徵空間內的點做爲初始的聚類中心
  2. 對於其它每一個點計算到K箇中心的距離,位置的點選擇最近的一個聚類中心點做爲標記類別
  3. 接着從新計算出每一個聚類的新中心點(平均值)
  4. 若是計算得出的新中心點與原中心點同樣,則結束,不然從新進行第二步過程

2、優缺點

  1. 優勢

    • 原理簡單,容易實現,算法複雜度低
    • 可解釋度較強
    • 處理大數據集的時候,該算法能夠保證較好的伸縮性
    • 當簇近似高斯分佈的時候效果很好
  2. 缺點

    • K值須要人爲設定,不一樣K值獲得的結果不同
    • 對初始的簇中心敏感,不一樣選取方式會獲得不一樣結果
    • 對異常值敏感
    • 需樣本存在均值(限定數據種類)
    • 不適合太離散的分類、樣本類別不均衡的分類、非凸形狀的分類
    • 可能收斂到局部最小值

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);

相關文章

前端也要懂機器學習(上)

參考文獻

支持向量機 SVM(很是詳細)

1.若是以爲這篇文章還不錯,來個分享、點贊吧,讓更多的人也看到

2.關注公衆號執鳶者,領取學習資料(前端「多兵種」資料),按期爲你推送原創深度好文

相關文章
相關標籤/搜索