1. 程式人生 > >《Machine Learning in Action》—— 剖析支援向量機,單手狂撕線性SVM

《Machine Learning in Action》—— 剖析支援向量機,單手狂撕線性SVM

《Machine Learning in Action》—— 剖析支援向量機,單手狂撕線性SVM

前面在寫NumPy文章的結尾處也有提到,本來是打算按照《機器學習實戰 / Machine Learning in Action》這本書來手撕其中程式碼的,但由於實際原因,可能需要先手撕SVM了,這個演算法感覺還是挺讓人頭疼,其中內部太複雜了,涉及到的數學公式太多了,也涉及到了許多陌聲的名詞,如:非線性約束條件下的最優化、KKT條件、拉格朗日對偶、最大間隔、最優下界、核函式等等,天書或許、可能、大概就是這樣的吧。

記得與SVM初次邂逅是在17年,那個時候的自己年少輕狂,檢視想著站在巨人的肩膀上,把所有自己感興趣的內容都搞懂,深入骨髓的那種。但後來殘酷的現實讓我明白一個道理:你知道的越多,你不知道的也越多。而且那個時候自己也沒有能力、資源和機會去深入SVM內部,完全無法理解SVM的內部原理。所以,當時自己對SVM的收穫只有一個:SVM主要是用來做分類任務的,僅此而已。

第二次接觸SVM是在準備考研複試吧,當時複試並沒有給出具體內容和範圍,而且自己也還是個初出茅廬的小子,對這種所謂的複試有種莫名的恐懼感。也只有從上屆學長學姐的口中,得知複試的時候老師會考究學生是否有科研的潛力,所以最好把機器學習熟知一下。那個時候也是處於新冠疫情的緊張時期嘛,就瘋狂補習機器學習的內容,其中就包括支援向量機——SVM,主要的學習渠道是吳恩達老師的機器學習課程,感覺講的的確不錯,非常適合我這種菜鳥級選手學習。當時也算是對SVM有了一定的認識吧,也大致瞭解了SVM的工作原理,當然了,也只是對SVM有了個的淺顯的認識,沒有手撕SVM的過程,也沒有完全把它整明白。儘管如此,複試的過程依然被面試導師錘的體無完膚,除了問了機器學習相關內容之外,編譯原理等一些專業知識對於我這個貿易專業的學生來講可太痛苦了,之前也沒有接觸過,全程阿巴阿巴。想到這,眼角又又。。。

第三次面對SVM也就是現在了,想著無論如何也要打通我的任督二脈,一定要搞清楚SVM的來龍去脈,也要像面試老師捶我那樣,把SVM往死裡錘。於是有了下文學習SVM之後的總結,一方面算是重新梳理一遍SVM,另一方面也希望來訪的讀者能夠有所收穫。

對於剛剛接觸SVM的讀者,Taoye主要有以下幾條建議,也是我學習SVM過程中的一個小總結吧:

  • SVM內部的數學公式很多,但請不要未戰先怯,犯下兵家大忌。無論是閱讀該篇文章也好,學習其他相關SVM資源也罷,還請諸君耐心、認真且完整的看完。
  • SVM的原理過程會涉及到很多的符號或記號,一定要梳理清楚他們所代表的含義。另外,推導過程中會存在很多的向量或矩陣,一定要明白其中shape,這一點可能在不同的資料中會有不一樣的處理方式。
  • 在閱讀的同時,一定要拿出稿紙手動推演SVM的過程,儘可能明白整個過程的來龍去脈,有不明白的地方可以留言或查詢其他相關資料來輔助自己的理解。
  • 閱讀一遍或許有不少知識不理解,但多閱讀幾遍相信一定會有不少收穫

本文參考了不少書籍資料以及許多大佬的技術文章,行文風格儘可能做到通俗易懂,但其中涉及到的數學公式在所難免,還請諸讀者靜下心來慢慢品嚐。由於個人水平有限,才疏學淺,對於SVM也只是略知皮毛,可能文中有不少表述稍有欠妥、有不少錯誤或不當之處,還請諸君批評指正。

我是Taoye,愛專研,愛分享,熱衷於各種技術,學習之餘喜歡下象棋、聽音樂、聊動漫,希望藉此一畝三分地記錄自己的成長過程以及生活點滴,也希望能結實更多志同道合的圈內朋友,更多內容歡迎來訪微信公主號:玩世不恭的Coder

符號說明

符號 說明
表示單個樣本,其中包含多個屬性,顯示為一個行向量
表示單個樣本中的某個屬性特徵
表示單個樣本所對應的標籤(具體分類),為整數,非1即-1
表示的是權值行向量,其中 ,也是所需要訓練的引數
表示的是決策面中的 ,也是所需要訓練的引數
表示函式間隔,具體解釋見下文
表示幾何間隔,具體解釋見下文
表示拉格朗日乘子
在這篇文章中表示線性核函式

關於上述的符號說明,僅僅只是本篇文章的一部分,其他符號可通過正文了解。上述符號可能部分暫時不懂,但沒關係,讀者可在閱讀的過程中,隨時返回來檢視,即可理解每個符號所代表的意義。

一、SVM是什麼

關於SVM是什麼,之前在Byte Size Biology上看到有篇文章很好的解釋了SVM,在知乎上也有一位名叫“簡之”的使用者通過故事的形式來將其進行轉述,通俗易懂,很好的向首次接觸SVM的讀者介紹了SVM能幹嘛。

  • Support Vector Machines explained well(可能需要FQ):http://bytesizebio.net/2014/02/05/support-vector-machines-explained-well/
  • 支援向量機(SVM)是什麼意思?:https://www.zhihu.com/question/21094489/answer/86273196

油管上也有更為直觀認識SVM的短視訊(FQ):https://www.youtube.com/watch?v=3liCbRZPrZA

總結一哈:

對於一個二分類問題,樣本資料是線性可分的,我們則需要通過一根直線(也就是上述例子當中枝條)將兩個不同種類的樣本進行分離。按道理來講,我們已經實現了需求,但是,這根枝條的具體擺放位置可能有無數多個,而我們的最終目的是將枝條擺放到一個最好的位置,從而當我們引入了一些新樣本的時候,依然能最好很好將兩類的資料分離開來,也就是說我們需要將模型的“泛化效能”最大化。之前也看到過一個例子(來源忘了),這裡分享下,大概就是講:我們在通過懸崖吊橋的時候,會不自覺的儘可能往中間走,因為這樣的話,當左右起風的時候,雖然我們的位置會左右稍微移動,但還不至於跌落懸崖。而越靠近邊緣,風險就越大,就是這麼個道理。而尋找最大“泛化效能”的過程,就是將枝條擺放在距離小球最遠的位置,而小球相對於枝條的位置就是“間隔”,而我們要做的就是將這間隔最大化。

上述僅僅是對於線性可分資料分類的一種處理方式,但有的時候,理想是美好的,現實卻是殘酷的。在實際樣本資料中,大多都是線性不可分的,也就是說我們無法找到合適位置的枝條將不同分類的資料分離開來,更別提“間隔最大化”了。這個時候,我們就需要將桌上的小球排起,然後用一個平面(紙)將不同分類小球分離開來。也就是說,我們將低維度對映到了高緯度,這樣對於小球的分類就更加容易了。

再之後,無聊的大人們,把這些球叫做 「data」,把棍子 叫做 「classifier」, 最大間隙trick 叫做「optimization」, 拍桌子叫做「kernelling」, 那張紙叫做「hyperplane」。

二、線性可分SVM與間隔最大化

我們先來看具體看看線性可分的二分類問題。

假如說,我們這裡有一堆樣本,也就是我們常說的訓練集 ,且 表示的是樣本 的屬性特徵向量,其內部有多個不同屬性,這裡我們不妨指定每個樣本含有兩個屬性特徵,也就是說 (之所以用列向量表示,主要是方便後面超平面的構建)。而 表示的是每個樣本中所有屬性特徵所對應的標籤,由於這裡的問題屬性二分類,所以 的值只存在兩種。為此,我們可以通過Matplotlib在平面直角座標系中繪製其影象,初步觀察其分佈規律,具體程式碼如下:

import numpy as np
import pylab as pl
from sklearn import svm

%matplotlib inline
print(np.__version__)

"""
    Author: Taoye
    微信公眾號:玩世不恭的Coder
"""
if __name__ == "__main__":
    # np.random.seed(100)        # 可自行設定隨機種子每次隨機產生相同的資料
    X_data = np.concatenate((np.add(np.random.randn(20, 2), [3, 3]),       
                             np.subtract(np.random.randn(20, 2), [3, 3])),
                             axis = 0)      # random隨機生成資料,+ -3達到不同類別資料分隔的目的 

    Y_label = np.concatenate((np.zeros([20]), np.ones([20])), axis = 0)

    svc = svm.SVC(kernel = "linear")
    svc.fit(X_data, Y_label)

    w = svc.coef_[0]      
    ww = -w[0] / w[1]                # 獲取權重w
    xx = np.linspace(-6, 6)
    yy = ww * xx - (svc.intercept_[0]) / w[1]   # intercept_獲取結截距

    b_down = svc.support_vectors_[0]         # 得到對應的支援向量
    yy_down = ww * xx + (b_down[1] - ww * b_down[0])
    b_up = svc.support_vectors_[-1]
    yy_up = ww * xx + (b_up[1] - ww * b_up[0])

    pl.plot(xx, yy, "k-"); pl.plot(xx, yy_down, "k--"); pl.plot(xx, yy_up, "k--")
    pl.scatter(X_data[:, 0], X_data[:, 1], c = Y_label, cmap = pl.cm.Paired)

    pl.show()

執行程式碼,可以繪製如下所示圖片,注意:以上程式碼每次執行都會隨機產生不同的二分類資料集,如想每次隨機產生相同的資料集,可自行配置np.random.seed隨機種子;另外,還有一點需要需要說明的是,上述程式碼使用到了NumPy,關於NumPy的使用,可自行參考之前寫的一篇文章:print( "Hello,NumPy!" )

如上圖所示,我們可以發現,棕色代表一類資料集,此時標籤 ,藍色代表另一類資料集,標籤 ,而要想將上圖兩類資料集分離開來,顯然不止一條直線,與上圖兩條虛線平行且居其之間的任意一條直線都能達到此目的。在這無數條直線中,要數上圖中的三條最為特殊,中間實線居於兩條虛線中間,我們一般稱其為“決策面”或“超平面”,而其所表示的方程,我們一般稱作“決策方程”或“超平面方程”,在這裡可以表示為 。(下面會推導)

從上圖我們還可以觀察得到,在所有樣本資料集中,虛線上的樣本距離決策面最近,我們把這種比較特殊的樣本資料一般稱之為“支援向量”,而支援向量到決策面之間的距離稱為“間隔”。我們不難發現,決策面的位置主要取決於支援向量,而與支援向量除外的資料樣本沒有關係。(因為支援向量的確定就已經確定了最大間隔)

關於上述提到的一些關於SVM的名詞概念,在正式推演之前,還是有必要理解清楚的。

前面我們也有提到,關於能將兩類不同資料集相互分隔開來的直線有無數種,而我們要想在這無數種直線找到一條最合適的,也就是達到一個間隔最大化的目的,這就是一個“最優化”問題。而最優化問題,我們需要了解兩個因素,分別是目標函式和優化物件。既然我們是想要達到間隔最大化的目標,那麼目標函式自然就是間隔,而優化物件就是我們的決策面方程。所以,我們首先需要用數學來明確間隔和決策面方程:

我們知道,在平面直角座標系中,一條直線可以用其一般式方程來來表示:

而根據上述影象,我們可以知道,橫縱座標代表的意義是一個樣本的不同屬性特徵,而標籤則是通過顏色(棕色和藍色)來進行表示。所以上述的直線的一般式方程中的 表示的就是一個樣本的兩種屬性特徵,為了方便理解,我們不妨將其修改為 ,並將

相關推薦

Machine Learning in Action》—— 剖析支援向量線性SVM

《Machine Learning in Action》—— 剖析支援向量機,單手狂撕線性SVM 前面在寫NumPy文章的結尾處也有提到,本來是打算按照《機器學習實戰 / Machine Learning in Action》這本書來手撕其中程式碼的,但由於實際原因,可能需要先手撕SVM了,這個演算法感覺還是

Machine Learning in Action》—— 剖析支援向量優化SMO

# 《Machine Learning in Action》—— 剖析支援向量機,優化SMO **薄霧濃雲愁永晝,瑞腦銷金獸。** 愁的很,上次不是更新了一篇關於支援向量機的文章嘛,[《Machine Learning in Action》—— 剖析支援向量機,單手狂撕線性SVM](https://mp.

Python3《機器學習實戰》學習筆記(九):支援向量實戰篇之再非線性SVM

一 前言 上篇文章講解的是線性SVM的推導過程以及簡化版SMO演算法的程式碼實現。本篇文章將講解SMO演算法的優化方法以及非線性SVM。 二 SMO演算法優化 在幾百個點組成的小規模資料集上,簡化版SMO演算法的執行是沒有什麼問題

Machine Learning in Action-chapter2-k近鄰算法

turn fma 全部 pytho label -c log eps 數組 一.numpy()函數 1.shape[]讀取矩陣的長度 例: import numpy as np x = np.array([[1,2],[2,3],[3,4]]) print x

<Machine Learning in Action >之二 樸素貝葉斯 C#實現文章分類

options 直升機 water 飛機 math mes 視頻 write mod def trainNB0(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords =

機器學習實戰(Machine Learning in Action)學習筆記————02.k-鄰近演算法(KNN)

機器學習實戰(Machine Learning in Action)學習筆記————02.k-鄰近演算法(KNN)關鍵字:鄰近演算法(kNN: k Nearest Neighbors)、python、原始碼解析、測試作者:米倉山下時間:2018-10-21機器學習實戰(Machine Learning in

機器學習實戰(Machine Learning in Action)學習筆記————05.Logistic迴歸

機器學習實戰(Machine Learning in Action)學習筆記————05.Logistic迴歸關鍵字:Logistic迴歸、python、原始碼解析、測試作者:米倉山下時間:2018-10-26機器學習實戰(Machine Learning in Action,@author: Peter H

機器學習實戰(Machine Learning in Action)學習筆記————04.樸素貝葉斯分類(bayes)

機器學習實戰(Machine Learning in Action)學習筆記————04.樸素貝葉斯分類(bayes)關鍵字:樸素貝葉斯、python、原始碼解析作者:米倉山下時間:2018-10-25機器學習實戰(Machine Learning in Action,@author: Peter Harri

機器學習實戰(Machine Learning in Action)學習筆記————03.決策樹原理、原始碼解析及測試

機器學習實戰(Machine Learning in Action)學習筆記————03.決策樹原理、原始碼解析及測試關鍵字:決策樹、python、原始碼解析、測試作者:米倉山下時間:2018-10-24機器學習實戰(Machine Learning in Action,@author: Peter Harr

機器學習實戰(Machine Learning in Action)學習筆記————08.使用FPgrowth演算法來高效發現頻繁項集

機器學習實戰(Machine Learning in Action)學習筆記————08.使用FPgrowth演算法來高效發現頻繁項集關鍵字:FPgrowth、頻繁項集、條件FP樹、非監督學習作者:米倉山下時間:2018-11-3機器學習實戰(Machine Learning in Action,@autho

機器學習實戰(Machine Learning in Action)學習筆記————07.使用Apriori演算法進行關聯分析

機器學習實戰(Machine Learning in Action)學習筆記————07.使用Apriori演算法進行關聯分析關鍵字:Apriori、關聯規則挖掘、頻繁項集作者:米倉山下時間:2018-11-2機器學習實戰(Machine Learning in Action,@author: Peter H

機器學習實戰(Machine Learning in Action)學習筆記————06.k-均值聚類演算法(kMeans)學習筆記

機器學習實戰(Machine Learning in Action)學習筆記————06.k-均值聚類演算法(kMeans)學習筆記關鍵字:k-均值、kMeans、聚類、非監督學習作者:米倉山下時間:2018-11-3機器學習實戰(Machine Learning in Action,@author: Pet

Machine Learning in Action》| 第1章 k-近鄰演算法

準備:使用 Python 匯入資料 """ @函式說明: 建立資料集 """ def createDataSet(): # 四組二維特徵 group = np.array([[3,104],[2,100],[101,10],[99,5]])

Machine Learning in Action》| 第2章 決策樹

決策樹 調包 import numpy as np import matplotlib.pyplot as plt import operator from matplotlib.font_manager import FontProperties 3.1.決

機器學習實戰(Machine Learning in Action)學習筆記————10.奇異值分解(SVD)原理、基於協同過濾的推薦引擎、資料降維

關鍵字:SVD、奇異值分解、降維、基於協同過濾的推薦引擎作者:米倉山下時間:2018-11-3機器學習實戰(Machine Learning in Action,@author: Peter Harrington)原始碼下載地址:https://www.manning.com/books/machine-le

機器學習實戰(Machine Learning in Action)學習筆記————10.奇異值分解(SVD)原理、基於協同過濾的推薦引擎、數據降維

www 實現 由於 就是 計算 學習筆記 圖片 blob 標示 關鍵字:SVD、奇異值分解、降維、基於協同過濾的推薦引擎作者:米倉山下時間:2018-11-3機器學習實戰(Machine Learning in Action,@author: Peter Harringto

Machine Learning in Action 之 kNN

k臨近演算法(kNN)採用測量不同特徵值之間的距離方法進行分類,也是一種非常直觀的方法。本文主要記錄了使用kNN演算法改進約會網站的例子。 任務一:分類演算法classify0  就是使用距離公式計算特徵值之間的距離,選擇最鄰近的k

Machine Learning In Action》學習筆記(1)-KNN(k-近鄰演算法)

  knn演算法我在之前的部落格從零開始-Machine Learning學習筆記(20)-kNN(k-Nearset Neignbor)學習筆記中也已經提到了,大家如果感興趣可以回過頭去看看,knn原理非常簡單。不需要訓練,當有待分類樣本時,只需要從資料集中選取k個與這個樣本距離最近的

《 機器學習實戰》(Machine Learning in Action) 一書 中的錯誤之處(內容、程式碼)

最近在學 機器學習,發現此書有錯誤的地方,寫成部落格,方便以後查詢。(慢慢更新中……) 1.中文書第22頁(英文版第26頁)中 有一行程式碼: classLabelVector.append(

Machine Learning in Action》—— Taoye給你講講決策樹到底是支什麼“鬼”

# 《Machine Learning in Action》—— Taoye給你講講決策樹到底是支什麼“鬼” 前面我們已經詳細講解了線性SVM以及SMO的初步優化過程,具體可看: * [《Machine Learning in Action》—— 剖析支援向量機,優化SMO](https://mp.wei