1. 程式人生 > >【機器學習】支援向量機SVM及例項應用

【機器學習】支援向量機SVM及例項應用

【機器學習】支援向量機

1.分類超平面與最大間隔

2.對偶問題與拉格朗日乘子法

3.核函式

4.軟間隔與正則化

    準備:    

        資料集

        匯入SVM模組

    步驟:

1.讀取資料集

        2.劃分訓練樣本與測試樣本

        3.訓練SVM分類器

        4.計算分類準確率

        5.繪製圖像



       上圖是一個關於機器學習演算法的時間線來自於Eren Golge。可以看出SVM旺盛的生命力。實際上,即使是深度學習非常火熱的今天,SVM依然盛行。在一些小樣本分類問題上,SVM表現非常好,用深度學習模型可能反而會使問題變得更復雜。

    下面開始介紹SVM--支援向量機。

1.分類超平面與最大間隔

    給定訓練樣本集 D ={ (X1 ,Yl),(X2,Y2)..., (Xm,Ym)}, Yi ∈{-1,+1},分類學習最基本的想法就是基於訓練集D在樣本空間中找到一個劃分超平面、將不同類別的樣本分開

    但能將訓練樣本分開的劃分超平面可能有很多,如圖 6.1所示,我們應該努力去找到哪一個暱?

                

    原則上,是去找位於兩類訓練樣本"正中間"的劃分超平面,即圖 6.1中黑色最粗的那個,因為該劃分超平面對訓練樣本區域性擾動的"容忍性最好,魯棒性最強,泛化能力最強

    例如,由於訓練集的侷限性或噪聲的因素,訓練集外的樣本可能比圖6.1中的訓練樣本更接近兩個類的分隔界,這將使許多劃分超平面出現錯誤,而黑色最粗的那個超平面受影響最小。換言之,這個劃分超平面所產生的分類結果是最魯棒的,對未見示例的泛化能力最強。

    在樣本空間中,劃分超平面可通過如下線性方程來描述:

            

    其中:

    x=(x1,x2…xd)為輸入資料,維度為d。

    為法向量,決定了超平面的方向。

     b為位移項,決定了超平面與原點之間的距離。

    顯然,分類超平面可被法向量ω和位移b確定,下面我們將其記為(w,b)。樣本空間中任意點 x到超平面(w,b)的距離可寫為:

            

    點到超平面的距離,可參考點到直線的距離公式,見附錄【1】。

     假設超平面(w,b)能將訓練樣本正確分類,即對於

                

所以,令:

         

    如圖6.2所示,距離超平面最近的這幾個訓練樣本點使式(6.3)的等號成立,它們被稱為"支援向量

",兩個異類支援向量到超平面的距離之和為:

            

    其中,γ被稱為"間隔"。

    那如何找到具有“最大間隔”的分類超平面呢?

    欲找到具有"最大間隔" (maximum margin) 的劃分超平面,也就是要找到能滿足式(6.3)中約束的引數w和b,使得γ最大,即

    

    顯然,為了最大化間隔γ,僅需最小化||w||。於是,式(6.5)可重寫為:

    

    上述(6.6)是支援向量機的基本型

    支援向量機有何特點?

    支援向量滿足:

    最大化間隔真的僅與ω有關嗎?

    NO!事實上,最大化間隔不只與ω有關,偏置b通過約束隱性地影響著w的取值,進而對間隔產生影響。

    為什麼目標函式要寫成(6.6)中的凸函式形式呢?

    在表示最大化間隔的優化問題中,發現式(6.5)中的目標函式是非凸的,並沒有現成的可用的軟體來解決非凸函式的優化問題。所以改成了(6.6)中的凸函式形式。

    關於凸函式,可見附錄【2】。

2.對偶問題與拉格朗日乘子法

    我們希望求解式(6.6)來得到最大間隔分類超平面所對應的模型f(x):

    

    其中ωb是模型引數。注意到式(6.6)本身是一個凸二次規劃問題,能直接用現成的優化計算包求解,但我們可以有更高效的辦法。
    對式(6.6)使用拉格朗日乘子法可得到其"對偶問題" 。具體來說,對式(6.6)的每條約束新增拉格朗日乘子,則該問題的拉格朗日函式可寫為:

    從對偶問題(6.11)解出的是式(6.8)中的拉格朗日乘子,它恰對應著訓練樣本。注意到式(6.6)中有不等式約束,因此上述過程需滿足KKT(Karush-Kuhn-Tucker)條件,即要求

        

    於是,對任意訓練樣本,總有

        若,則該樣本將不會在式(6.12) 的求和中出現,也就不會對f(x)有任何影響;

        若,則必有,所對應的樣本點位於最大間隔邊界上,是一個支援向量。
    這顯示出支援向量機的一個重要性質訓練完成後,大部分的訓練樣本都不需保留,最終模型僅與支援向量有關。

    那麼如何求解式(6.11) 呢?不難發現,這是一個二次規劃問題?可使用通用的二次規劃演算法來求解,二次規劃可見附錄【3】。這裡我還沒搞懂,先留著坑。

3.核函式

    在本章前面的討論中,我們假設訓練樣本是線性可分的即存在一個劃分超平將訓練樣本正確分。然而在現實任務中,原始樣本空間內,許並不存在個能正確劃分兩類樣本的超平面。例如圖 6.3 中的" 異或 " 問題就不是線性可分的。

                

    那如何解決非線性可分問題呢?

    對於原空間中的非線性可分問題,可將樣本從原始空間對映到一個更高維的特徵空間,使得樣本在這個特徵空間內線性可分。例如在圖6.3中,若將原始的二維空間對映到一個合適的三維空間 ,就能找到一個合適的劃分超平面。幸運的是,如果原始空間是有限維,即屬性數有限,那麼一定存在一個高維特徵空間使樣本可分。

            

                

    這裡的函式 κ(.,.)就是"核函式"。式(6.24)顯示出模型最優解可通過訓練樣本的核函式展開,這一展式亦稱"支援向量展式 "顯然,若己知合適對映Ф的具體形式,則可寫出核函式 κ(.,.)。但在現實任務中我們通常不知道Ф是什麼形式,那麼,合適的核函式是否一定存在呢?什麼樣的函式能做核函式呢?

    我們有下面的定理:

        

    那核函式的特點是什麼?

    核函式:一個對稱函式所對應的核矩陣半正定,它就可作為核函式使用。

    事實上,對於一個半正定核矩陣,總能找到一個與之對應的對映Ф。換言之,任何一個核函式都隱式地定義了一個稱為"再生核希爾伯特空間"的特徵空間。
    通過前面的討論可知,我們希望樣本在特徵空間內線性可分,因此特徵空間的好壞對支援向量機的效能至關重要。需注意的是,在不知道特徵對映的形式時,我們並不知道什麼樣的核函式是合適的,而核函式也僅是隱式地定義了這個特徵空間。於是,"核函式選擇"成為支援向量機的最大變數。若核函式選擇不合適,則意味著將樣本對映到了一個不合適的特徵空間,很可能導致效能不佳。

        

4.軟間隔與正則化

    在前面的討論中,我們一假定訓練樣本在樣本空間或特徵空間中是線性可分的,即存在一個超平面能將不同類的樣本完全劃分開。然而,在現實任務往往很難確定合適的核函式使得練樣本在特徵空中線性可分。

    退一步說,即使恰好找到了某個核函式使訓練集在特徵空間中線性可分,也很難斷定這個貌似線性可分的結果不是由於過擬合所造成的。

    那麼如何緩解該問題呢

    緩解該問題的一個辦法是:允許支援向量機在一些樣本上出錯。為此,引入"軟間隔"的概念,如圖 6.4所示:

        

    具體來前面介紹的支持向量機是要求所有樣本均滿足約束(6.3),所有樣本都必須劃分正確這稱為"硬間隔" ,而軟隔則是允許某些樣本不滿足約束:

    

        

5.例項應用:python使用支援向量機SVM

準備:    

    資料集

    匯入SVM模組

步驟:

1.讀取資料集

    2.劃分訓練樣本與測試樣本

    3.訓練SVM分類器

    4.計算分類準確率

    5.繪製圖像

     因為Python中的sklearn庫也集成了SVM演算法,所以Python中一樣可以使用支援向量機做分類。

    【注意】本文的執行環境是windows+Pycharm+python3.6。

    Scikit-Learn庫基本實現了所有的機器學習演算法,具體使用詳見官方文件說明:

    因為本文是基於sklearn包,所以需先在python中下載sklearn包,網上有很多教程,在此不再敘述。

    資料集

    Iris.data的資料格式如下:共5列,前4列為樣本特徵,第5列為類別,分別有三種類別Iris-setosa, Iris-versicolor, Iris-virginica

    注意:因為在分類中類別標籤必須為數字量,所以應將Iris.data中的第5列的類別(字串)轉換為num.

        

匯入SVM模組

    首先在使用SVM時,需先從sklearn包中匯入SVM模組。

  1. from sklearn import svm  

1.讀取資料集

  1. #1.讀取資料集
  2. path='F:/Python_Project/SVM/data/Iris.data'
  3. data=np.loadtxt(path, dtype=float, delimiter=',', converters={4:Iris_label} )  
  4. #converters={4:Iris_label}中“4”指的是第5列:將第5列的str轉化為label(number)

    定義的轉換函式為:可實現將類別Iris-setosa, Iris-versicolor, Iris-virginica對映成 0,1,2。

  1. #define converts(字典)
  2. def Iris_label(s):  
  3.     it={b'Iris-setosa':0, b'Iris-versicolor':1, b'Iris-virginica':2 }  
  4.     return it[s]  

    讀取檔案用的是loadtxt函式,其宣告如下:

  1. def  loadtxt(fname, dtype=float, comments='#', delimiter=None,converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)  

    常用的引數有:

        fname: 檔案路徑,例 path='F:/Python_Project/SVM/data/Iris.data'

    dtype:樣本的資料型別 例dtype=float

          delimiter:分隔符。例 delimiter=','

          converters:將資料列與轉換函式進行對映字典。例 converters={4:Iris_label}含義是將第5列的資料對應轉換函式進行轉換。

          usecols:選取資料的列。


2.劃分訓練樣本與測試樣本

  1. #2.劃分資料與標籤
  2. x,y=np.split(data,indices_or_sections=(4,),axis=1) #x為資料,y為標籤  
  3. x=x[:,0:2] #為便於後邊畫圖顯示,只選取前兩維度。若不用畫圖,可選取前四列x[:,0:4]  
  4. train_data,test_data,train_label,test_label =sklearn.model_selection.train_test_split(x,y, random_state=1, train_size=0.6,test_size=0.4)  
1. split(資料,分割位置,軸=1(水平分割) or 0(垂直分割))。

  2.  sklearn.model_selection.train_test_split隨機劃分訓練集與測試集。train_test_split(train_data,train_label,test_size=數字, random_state=0)

  引數解釋:

      train_data:所要劃分的樣本特徵集

      train_label:所要劃分的樣本類別

      test_size:樣本佔比,如果是整數的話就是樣本的數量.(注意:)

                   --  test_size:測試樣本佔比。 預設情況下,該值設定為0.25。 預設值將在版本0.21中更改。 只有train_size沒有指定時, 

                        它將保持0.25,否則它將補充指定的train_size,例如train_size=0.6,則test_size預設為0.4。

                   -- train_size:訓練樣本佔比。

      random_state:是隨機數的種子。

      隨機數種子:其實就是該組隨機數的編號,在需要重複試驗的時候,保證得到一組一樣的隨機數。比如你每次都填1其他引數一樣的情況下你得到的隨機陣列是一樣的。但填0或不填,每次都會不一樣。隨機數的產生取決於種子,隨機數和種子之間的關係遵從以下兩個規則:種子不同,產生不同的隨機數;種子相同,即使例項不同也產生相同的隨機數。

3.訓練SVM分類器

  1. #3.訓練svm分類器
  2. classifier=svm.SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovr') # ovr:一對多策略  
  3. classifier.fit(train_data,train_label.ravel()) #ravel函式在降維時預設是行序優先  

    kernel='linear'時,為線性核,C越大分類效果越好,但有可能會過擬合(defaul C=1)。

  kernel='rbf'時(default),為高斯核,gamma值越小,分類介面越連續;gamma值越大,分類介面越“散”,分類效果越好,但有可能會過擬合。

  decision_function_shape='ovr'時,為one v rest(一對多),即一個類別與其他類別進行劃分,

  decision_function_shape='ovo'時,為one v one(一對一),即將類別兩兩之間進行劃分,用二分類的方法模擬多分類的結果。

4.計算分類準確率

  1. #4.計算svc分類器的準確率
  2. print("訓練集:",classifier.score(train_data,train_label))  
  3. print("測試集:",classifier.score(test_data,test_label))  

    結果:

        

    還有另一種計算準確率的方法:

  1. #也可直接呼叫accuracy_score方法計算準確率
  2. from sklearn.metrics import accuracy_score  
  3. tra_label=classifier.predict(train_data) #訓練集的預測標籤  
  4. tes_label=classifier.predict(test_data) #測試集的預測標籤  
  5. print("訓練集:", accuracy_score(train_label,tra_label) )  
  6. print("測試集:", accuracy_score(test_label,tes_label) )  

    實際上,classifier.score()內部也是先predict得到tes_label , 然後呼叫了accuracy_score(test_label,tes_label)方法來計算準確率的。

    可以檢視一下內部決策函式,返回的是樣本到分類超平面的距離
  1. #檢視決策函式
  2. print('train_decision_function:',classifier.decision_function(train_data)) # (90,3)  
  3. print('predict_result:',classifier.predict(train_data))  

   (1)若選用“ovr”(一對多),則每個樣本會產生3個距離值(3為類別種類數)。如下

        

           

    (2)若選用“ovo”(一對一),則每個樣本會產生3*(3-1)/2=3 個距離值,即 :距離值個數=類別數*(類別數-1)/2。結果如下:

        

        

5.繪製圖像

    確定座標軸範圍、字型、背景顏色

  1. #5.繪製圖形
  2. #確定座標軸範圍
  3. x1_min, x1_max=x[:,0].min(), x[:,0].max() #第0維特徵的範圍  
  4. x2_min, x2_max=x[:,1].min(), x[:,1].max() #第1維特徵的範圍  
  5. 相關推薦

    機器學習支援向量SVM例項應用

    【機器學習】支援向量機1.分類超平面與最大間隔2.對偶問題與拉格朗日乘子法3.核函式4.軟間隔與正則化    準備:            資料集        匯入SVM模組    步驟:1.讀取資料集        2.劃分訓練樣本與測試樣本        3.訓練SVM

    機器學習支援向量SVM原理推導

    參考:http://blog.csdn.net/ajianyingxiaoqinghan/article/details/72897399 部分圖片來自於上面部落格。 0 由來 在二分類問題中,我們可以計算資料代入模型後得到的結果,如果這個結果有明顯的區別,

    機器學習支援向量(4)——非線性支援向量(核函式)

    前言 當訓練資料集線性可分或者近似線性可分時,前面我們在文一以及文二已經介紹了線性可分支援向量機和線性支援向量機。但是有時訓練資料集是非線性的,這時就可以使用非線性支援向量機。 非線性支援向量機的主要特點就是利用了核技巧。 非線性分類問題 如

    機器學習支援向量SVM程式碼示例

    一、線性可分SVM SVM演算法最初是用來處理二分類問題的,是一種有監督學習的分類演算法。 對於線性可分的二分類問題,我們可以找到無窮多個超平面,將兩類樣本進行區分。(超平面:一維中是一個點;二維中是一條線;三維中是一個面……) 在上面的多個超平面中,

    [四]機器學習支援向量SVM

    4.1 實驗資料 本資料集來源於UCI的Adult資料集,並對其進行處理得到的。資料集下載地址:http://archive.ics.uci.edu/ml/datasets/Adult。本實驗使用LIBSVM包對該資料進行分類。 原始資料集每條資料有14個特徵,分別為age,workc

    機器學習演算法——支援向量svm,實現過程

     初學使用python語言來實現支援向量機演算法對資料進行處理的全過程。 from sklearn.datasets import load_iris #匯入資料集模組 from sklearn.model_selection import train_test_spli

    機器學習支援向量SVM和人工神經網路ANN的比較

    在統計學習理論中發展起來的支援向量機(Support Vector Machines, SVM)方法是一種新的通用學習方法,表現出理論和實踐上的優勢。SVM在非線性分類、函式逼近、模式識別等應用中有非常好的推廣能力,擺脫了長期以來形成的從生物仿生學的角度構建學習機器的束縛。

    機器學習支援向量(SVM)

    1. 理論 概述: 利用訓練集在特徵空間中求出一個分類超平面(w,b)把樣本切割開,依靠該超平面對新樣本進行分類。如果訓練集在當前的特徵空間中無法分割,則用核技術的對映函式把原特徵空間對映到高緯或

    機器學習支援向量SVM Support Vector Machine (五) scikit-learn演算法庫

    一、scikit-learn SVM演算法庫概述         scikit-learn中SVM的演算法庫分為兩類,一類是分類演算法庫,包括SVC、 NuSVC和LinearSVC三個類。另一類是迴歸演算法庫,包括SVR、NuSVR和LinearSVR三個類。相關的

    機器學習模型-支援向量(SVM)

    Machine Learning - SVC 一.基本原理 二.程式碼實現 import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_spli

    機器學習支援向量SVM Support Vector Machine (六) 高斯核調參

            在支援向量機(以下簡稱SVM)的核函式中,高斯核(以下簡稱RBF)是最常用的,理論上 RBF一定不比線性核函式差,但是在實際應用中,卻面臨幾個重要超引數的調優問題。如果調的不好,可能比線性核函式還要差。所以實際應用中,能用線性核函式得到較好效果的都會選擇

    深度學習基礎-06支援向量SVM(下)-線性不可分

     1 SVM的優點                                      

    深度學習基礎-05支援向量SVM(上)-線性可分

    Support Vector Machine 目錄 1背景 2 機器學習的一般框架 3 什麼是超平面 4 線性可區分(linear separatable)和線性不可區分(linear inseparatable) 5 如何計算超平面以及舉例 1背景 Vladim

    Machine Learning, Coursera機器學習Week7 支援向量應用

    SVMs in Practice 本節內容: SVM的引數選擇、SVM解決多分類問題、實踐中logistic迴歸和SVM的選擇 相關機器學習概念: 線性核函式(Linear kernel) 1. Using SVM Packages 有許多軟體庫可以實現S

    機器學習---演算法---支援向量---線性SVM--第一部分

    轉自:https://cuijiahua.com/blog/2017/11/ml_8_svm_1.html 什麼是SVM? SVM的英文全稱是Support Vector Machines,我們叫它支援向量機。支援向量機是我們用於分類的一種演算法。讓我們以一個小故事的形式,開啟我們的SVM之旅吧。 在很

    機器學習筆記——支援向量SVM

    支援向量機 除了之前講的機器學習的方法,還有一種常用的方法叫做支援向量機。我們將logistic迴歸的假設函式以及代價函式稍加更改就可以得到支援向量機的模型 另外還有不同的是SVM的輸出並不是一個概率值,而是0或1 大間隔 我們說SVM是一種大間隔演算法,意思是我們

    機器學習支援向量: Support Vector Machines (SVM)

    機器學習之支援向量機: Support Vector Machines (SVM) 歡迎訪問人工智慧研究網 課程中心 理解支援向量機(Understanding SVM) 使用支援向量機(Using SVM) 使用高斯核(Gaussian Kern

    機器學習(四):通俗理解支援向量SVM程式碼實踐

    [上一篇文章](https://mp.weixin.qq.com/s/cEbGM0_Lrt8elfubxSF9jg)我們介紹了使用邏輯迴歸來處理分類問題,本文我們講一個更強大的分類模型。本文依舊側重程式碼實踐,你會發現我們解決問題的手段越來越豐富,問題處理起來越來越簡單。 支援向量機(Support V

    機器學習支援向量(四)

    引言:   SVM是一種常見的分類器,在很長一段時間起到了統治地位。而目前來講SVM依然是一種非常好用的分類器,在處理少量資料的時候有非常出色的表現。SVM是一個非常常見的分類器,在真正瞭解他的原理之前我們多多少少都有接觸過他。本文將會詳細的介紹SVM的原理、目標以及計算過程和演算法步驟。我們針對線性可分資

    機器學習筆記——支援向量

    一,線性可分支援向量機與硬間隔最大化 1.1 間隔與支援向量 在樣本空間中,劃分超平面可通過如下線性方程來描述: 其中,w = (w1;w2;...;wd)為法向量,決定了超平面的方向;b為位移項,決定了超平面與原點之間的距離。 我們將超平面記為(w,b).樣本空間中任意點x到