支持向量機+sklearn繪製超平面

2021-01-14 江大白玩AI


1.快速了解SVM

2.SVM定義與公式建立

3. 核函數

4.SVM 應用實例


1.快速了解SVM

支持向量機(support vector machines,SVM)是一種二類分類模型。它的基本模型是定義在特徵空間上的間隔最大的線性分類器,間隔最大使它有別於感知機;而且SVM還支持核技巧,能夠對非線形的數據進行分類,其實就是將非線形問題變換為線性問題,通過解變換後的線性問題來得到原來非線形問題的解。

舉個例子來說明支持向量機是來幹什麼的吧!

將實例的特徵向量(以二維為例)映射為空間中的一些點,就是如下圖的圓心點和『x』,它們屬於不同的兩類。那麼SVM的目的就是想要畫出一條線,以「最好地」區分這兩類點,以至如果以後有了新的點,這條線也能做出很好的分類。

image-20200911211014780

從圖中我們可以看出能夠畫出多條線對樣本點進行區分,區別就在於效果好不好。比如粉色線就不好,綠色還湊合,黑色的線看起來就比較好。我們希望找到這條效果最好的線叫作劃分超平面。

看官老爺們可能會問畫這條線的標準是什麼?

SVM將會尋找可以區分兩個類別並且能夠使間隔(margin)最大的超平面,即劃分超平面。

註:間隔就是某一條線距離它兩側最近的點的距離之和。

2.SVM定義與公式建立

在樣本空間中,劃分超平面可以定義為:

其中

將超平面記為(

   

假設超平面(

如下圖所示,距離超平面最近的幾個樣本點使得公式(2.3)的等號成立,這個個樣本點被稱為 「支持向量」(support vector),兩個異類支持向量到超平面的距離之和為

  

image-20200912101041163

第一小節我們講到 SVM 就是要找到區分兩個類別並使兩個異類支持向量到超平面的距離之和最大,也就是要找到滿足式(2.3)中約束的參數

s.t.  

為了使

s.t.  

這就是支持向量機(Support Vector Machine,SVM)的基本型.

3. 核函數

支持向量機通過某非線性變換 ∂( x ),將輸入空間映射到高維特徵空間。特徵空間的維數可能非常高。如果支持向量機的求解只用到內積運算,而在低維輸入空間又存在某個函數

3.1 常用的核函數(kernel functions)

線性核

多項式核

高斯核

 

拉普拉斯核

 

Sigmoid 核

 tanh為雙曲線正切函數,

核函數那麼多,那麼一般如何選擇?

嘗試不同的 kernel ,根據結果準確度而定,嘗試不同的 kernel。

根據先驗知識,比如圖像分類,通常用RBF(高斯核),文字不使用RBF。

舉個小例子來說明核函數吧!

假設兩個向量

可以定義方程(Grim矩陣):

設函數為 $K(x,y)=()^2$

假設

如果不使用核函數,直接求內積:

$=16+40+72+40+100+180+72+180+324=1024$

使用核函數:

兩種方法都可以得到同樣的結果,但是使用kernel方法計算容易很多,在樣本維度很高時這種方法會更加顯示其優勢。

4.SVM 應用實例

由於 SVM 算法本身的實現較為複雜,所以這裡就不給出如何實現SVM的代碼,採用 sklearn庫來幫助我們學習SVM 的應用例子。

這裡對sklearn畫出超平面步驟做個說明

1)首先獲取權重矩陣

weight = model.coef_[0]

列印結果如下

有兩個值,分別是

這樣的好處在於如果有多組特徵,方便擴展。在預測時,將待測的(x0,x1)帶入上式,根據大於或者小於0即可判斷類別。

2)bias的值可以使用model.intercept_即可獲取

為了方便畫圖,我們可以通過移項轉換為我們熟悉的斜截式:

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.svm import SVC

def create_data():
    iris = load_iris()
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['label'] = iris.target
    df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
    data = np.array(df.iloc[:100, [0, 1, -1]])
    # 將label==0的實例賦值為-1
    for i in range(len(data)):
        if data[i, -1] == 0:
            data[i, -1] = -1
    return data[:, :-1], data[:, -1]


def SVM():
    x, y = create_data()
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
    model = SVC(kernel="linear")
    model.fit(x_train, y_train)

    precise = model.score(x_test, y_test)
    print(precise)
    # 畫出散點圖
    plt.scatter(x[:50, 0], x[:50, 1], label='0')
    plt.scatter(x[50:100, 0], x[50:100, 1], label='1')
    # 查看權重矩陣
    weight = model.coef_[0]
    #print(model.coef_)
    # 取出截距
    bias = model.intercept_[0]
    k = -weight[0] / weight[1]
    b = -bias / weight[1]
    # 獲取支持向量
    support_vector = model.support_vectors_
    # 畫出支持向量
    for i in support_vector:
        plt.scatter(i[0], i[1], marker=',', c='b')

    # 畫出超平面
    xx = np.linspace(4, 7, 10)
    yy = k * xx + b
    plt.plot(xx, yy)
    plt.legend()
    plt.show()


if __name__ == '__main__':
    SVM()

sklearn.svm.SVC
(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)

參數:

C:C-SVC的懲罰參數C?默認值是1.0
C越大,相當於懲罰鬆弛變量,希望鬆弛變量接近0,即對誤分類的懲罰增大,趨向於對訓練集全分對的情況,這樣對訓練集測試時準確率很高,但泛化能力弱。C值小,對誤分類的懲罰減小,允許容錯,將他們當成噪聲點,泛化能力較強。

kernel :核函數,默認是rbf,可以是『linear』, 『poly』, 『rbf』, 『sigmoid』, 『precomputed』

– 線性:u'v

– 多項式:(gammau'v + coef0)^degree

– RBF函數:exp(-gamma|u-v|^2)

– sigmoid:tanh(gammau'v + coef0)

degree :多項式poly函數的維度,默認是3,選擇其他核函數時會被忽略。
gamma : 『rbf』,『poly』 和『sigmoid』的核函數參數。默認是』auto』,則會選擇1/n_features
coef0 :核函數的常數項。對於『poly』和 『sigmoid』有用。
probability :是否採用概率估計?.默認為False
shrinking :是否採用shrinking heuristic方法,默認為true
tol :停止訓練的誤差值大小,默認為1e-3
cache_size :核函數cache緩存大小,默認為200
class_weight :類別的權重,字典形式傳遞。設置第幾類的參數C為weight*C(C-SVC中的C)
verbose :允許冗餘輸出?
max_iter :最大迭代次數。-1為無限制。
decision_function_shape :『ovo』, 『ovr』 or None, default=None3
random_state :數據洗牌時的種子值,int值
主要調節的參數有:C、kernel、degree、gamma、coef0。

有收穫給我點個讚吧!歡迎關注我的公眾號《江大白玩AI》!

相關焦點

  • 支持向量機其實沒那麼玄乎
    在機器學習中,支持向量機也是一種常見的算法。支持向量機的原理是,在兩類的樣本中,尋找到能最好劃分類別的超平面。如果在平面中找不到,那就進入更多維度的空間,直至某個維度的空間能夠劃分出最合適的支持向量。兩條支持向量中間的那個超平面就是機器能夠利用的判斷邏輯。
  • 一個簡單的案例帶你了解支持向量機算法(Python代碼)
    相反,「支持向量機」就像一把鋒利的刀—它適用於較小的數據集,但它可以再這些小的數據集上面構建更加強大的模型。現在,我希望你現在已經掌握了隨機森林,樸素貝葉斯算法和模型融合的算法基礎。如果沒有,我希望你先抽出一部分時間來了解一下他們,因為在本文中,我將指導你了解認識機器學習算法中關鍵的高級算法,也就是支持向量機的基礎知識。
  • 從零推導支持向量機 (SVM) | 雷鋒網
    線性二分類模型的目標是找到一組合適的參數 (w, b),使得即,線性二分類模型希望在特徵空間找到一個劃分超平面,將屬於不同標記的樣本分開。證明.2.線性支持向量機線性支持向量機 (SVM) [4]也是一種線性二分類模型,也需要找到滿足定理 1 約束的劃分超平面,即 (w, b)。由於能將樣本分開的超平面可能有很多,SVM 進一步希望找到離各樣本都比較遠的劃分超平面。
  • 形象講解支持向量機
    支持向量機(SVM)是由分離超平面的判別分類器。換句話說,給定標記的訓練數據(監督學習),算法輸出最佳超平面,其對新示例進行分類。在二維空間中,這個超平面是將平面分成兩部分的線,其中每一類都位於兩側。本文以一個外行的角度來學習假設在圖表上給出了兩個標籤類的圖,如圖(A)所示。你能決定一個分類線嗎?
  • 深度講解支持向量機背後的數學思想
    在支持向量機(support vector machine,SVM)算法中,有諸多數學思想。學習SVM是一個非常好的實踐數學思想的過程,為我們以後創新解決問題思路提供了啟發。在卷積神經網絡興起之前,在機器學習界一直是非常受追捧的算法,不光是因為其有良好的泛化能力、很高的準確度,更是因為其完備的數學理論依據以及諸多較難理解的數學知識。
  • 超詳細支持向量機知識點,面試官會問的都在這裡了
    它的基本思想是在特徵空間中尋找間隔最大的分離超平面使數據得到高效的二分類,具體來講,有三種情況(不加核函數的話就是個線性模型,加了之後才會升級為一個非線性模型):當訓練樣本線性可分時,通過硬間隔最大化,學習一個線性分類器,即線性可分支持向量機;當訓練數據近似線性可分時,引入鬆弛變量,通過軟間隔最大化,學習一個線性分類器,即線性支持向量機;當訓練數據線性不可分時,通過使用核技巧及軟間隔最大化
  • 25道題檢測你對支持向量機算法的掌握程度
    我相信你在不同的途徑中肯定也接觸過支持向量機,是不是覺得已經對這個東西有些頭痛,認為很多人都會,但是自己好像怎麼都不能明白過來它的原理,或者說你已經對自己有關支持向量機的知識已經很有自信了,那麼現在你來對地方了,這份技能測試就是專門測試你對於支持向量機的掌握程度已經是否可以應用。這份測試已經有超過550多人參加了,最後我會放出這些人的分數的分布情況,從而方便你對比一下自己的支持向量機的水平程度。
  • 智能財務風險預警方法—支持向量機
    ,此外,支持向量機還可以用在一些預測或者分析等領域,應用非常廣泛,工程科學等方面都能有所應用。當今世界上的支持向量機支持向量機的研究部分中,實際和理論方面的研究兩方在快速發展,如今支持向量機已經可以用於生物醫學識別,文本識別,人臉識別,手寫識別等非常多的領域。支持向量機將分類樣本映射為向量空間的特徵向量集合,並在向量空間中構造最優分類超平面,使得在保證分類正確的同時,不同類別的集合與最優分類超平面的間隔最大。
  • 機器學習之sklearn基礎教程!
    公眾號關注 「Python遇見機器學習」設為「星標」,第一時間知曉最新乾貨~本次分享是基於scikit-learn工具包的基本分類方法,包括常見的Logisitic Regression、支持向量機、決策樹、隨機森林以及K近鄰方法KNN。
  • 如何使用支持向量機學習非線性數據集
    支持向量機(SVM)什麼是支持向量機呢?支持向量機是監督機器學習模型,可對數據進行分類分析。實際上,支持向量機算法是尋找能將實例進行分離的最佳超平面的過程。如果數據像上面那樣是線性可分離的,那麼我們用一個線性分類器就能將兩個類分開。
  • 改進遺傳算法的支持向量機特徵選擇解決方案
    支持向量機是一種在統計學習理論的基礎上發展而來的機器學習方法[1],通過學習類別之間分界面附近的精確信息,可以自動尋找那些對分類有較好區分能力的支持向量,由此構造出的分類器可以使類與類之間的間隔最大化,因而有較好的泛化性能和較高的分類準確率。由於支持向量機具有小樣本、非線性、高維數、避免局部最小點以及過學習現象等優點,所以被廣泛運用於故障診斷、圖像識別、回歸預測等領域。
  • 「研究」支持向量機和其它類人工神經網絡的聯繫及區別
    支持向量機(Support Vector Machines,SVM)是20世紀90年代初,由Vapnik教授領導的研究小組提出的一種新的智能機器,它基於Vapnik等人在上世紀60年代末提出統計學習理論。
  • 改進遺傳算法的支持向量機特徵選擇解決方案介紹
    支持向量機是一種在統計學習理論的基礎上發展而來的機器學習方法[1],通過學習類別之間分界面附近的精確信息,可以自動尋找那些對分類有較好區分能力的支持
  • 將sklearn訓練速度提升100多倍,美國「返利網」開源sk-dist框架
    這是一個分配 scikit-learn 元估計器的 Spark 通用框架,它結合了 Spark 和 scikit-learn 中的元素,可以將 sklearn 的訓練速度提升 100 多倍。在 Ibotta,我們訓練了許多機器學習模型。這些模型為我們的推薦系統、搜尋引擎、定價優化引擎、數據質量等提供了支持,在與我們的移動 app 互動的同時為數百萬用戶做出預測。
  • 機器學習|劉老師專欄—從邏輯回歸到支持向量機(一)
    劉老師專欄,今天分享的是從邏輯回歸到支持向量機解決分類問題的思路,算法理論知識固然重要,但更值得學習的是解決問題的思考方式,仔細欣賞劉老師的分享吧~需要複習邏輯回歸?請戳:機器學習|劉老師專欄——機器的「是非觀」機器學習|劉老師專欄——機器學習與是非題(二)機器學習|劉老師專欄——關於邏輯回歸的更多思考支持向量機是解決分類問題的另一個重要方法,關於這個方法的具體內容,因為我覺得插入公式和圖片都很麻煩,所以不再贅述。而且,相比於教材來說,贅述也不過是一種重複。
  • 百聞不如一練:可視化調試模型超參數!
    該例子以手寫數據集為例,使用支持向量機的方法對數據進行建模,然後調用scikit-learn中validation_surve方法將模型交叉驗證的結果進行可視化。需要注意的是,在使用validation_curve方法時,只能驗證一個超參數與模型訓練集和驗證集得分的關係(即二維的可視化),而不能實現多參數與得分間關係的可視化。
  • 特徵選擇及基於Sklearn的實現
    sklearn.feature_selection模塊被廣泛應用於樣本數據集的特徵選擇和特徵降維,以減少特徵數量,增強對特徵和特徵值之間的理解,提高預測準確性或提高在高維數據集上的性能。本文將依據官方文檔對sklearn.feature_selection模塊進行介紹。
  • 如何用sklearn創建機器學習分類器?這裡有一份上手指南
    這篇文章中,作者簡要介紹了用Python中的機器學習工具scikit-learn(sklearn)創建機器學習分類器的步驟與注意事項。讀完這篇文章,你將學到:導入和轉換.csv文件,開啟sklearn之旅檢查數據集並選擇相關特徵用sklearn訓練不同的數據分類器分析結果,進一步改造模型第一步:導入數據找到合適的數據下載完成後,我們不難猜到,要做的第一件事肯定是加載並且檢查數據的結構。這裡我推薦大家使用Pandas。