sklearn之SVM支持向量機

支持向量機需要注意的地方:

1. 三個理解步驟:

    (1) 理解svm的損失函數,min ||w||^2/2並且y(wx+b)>=k的限制條件的推導

    (2) 拉格朗日定理求最小值,以及推導過程

2. 關於核函數的作用:

   可以通過升維度的方式將無法線性可分的數據可分,但升維的代價太大,所以通過核函數可以達到類似的效果並且計算量也不是那麼大,核函數相當於增加了一維,在空間中形成更核函數類似的超平面( 理解決策邊界 / 超平面 )

   通常【線性核函數】對於線性可分的數據集效果比較好,但非線性數據集就不是很好;【多項式核函數】的效果在不調節d參數時,跟線性核函數的效果差不多,,但是如果調節參數,多項式效果會比較好;【高斯核函數】在這幾個核函數中是效果最好的;【sigmod核函數】的效果不是特別理想。

   根據幾個核函數的公式,【線性核函數】幾乎沒有什麼參數可調,【多項式核函數】可通過調d參數,但d越大,次方越大,付出的計算代價越大;【高斯核函數】高斯核函數可以調節兩個參數;

3. svm最後的評估效果可以通過準確率和泛化誤差來判定:

    準確率高,但測試集的泛化能力可能差(即超平面C參數很小),準確率      低,但可能的泛化能力會高一點(即超平面C參數間隔大)

 

 

from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 使用make_blogs函數創建數據集合
X,y = make_blobs(n_samples=50,centers=2,random_state=0,cluster_std=0.6)
X.shape
pd.DataFrame(y)

plt.figure()
# 查看數據的分佈情況
plt.scatter(X[:,0], X[:,1], c=y, s=50,cmap = "rainbow")
plt.xticks([])
plt.yticks()

def plot_svc_decision_function(model,ax=None):
    # 2.獲取網格座標xy
    if ax is None:
        ax=plt.gca()
    # 獲取當前座標軸的兩端極值
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    # 將x/y軸的兩極值切分成30等分
    axisx = np.linspace(xlim[0],xlim[1],30)
    axisy = np.linspace(ylim[0],ylim[1],30)

    axisx, axisy= np.meshgrid(axisx, axisy)

    xy = np.vstack([axisx.ravel(), axisy.ravel()]).T


    # 4.獲取到決策樹的決策邊界座標,decision_function接口主要獲取每個樣本到座標決策邊界轉化後的座標
    P = model.decision_function(xy).reshape(axisx.shape)

    #print(P.shape)
    # (30,30)

    ax.contour(axisx,axisy,P,colors=["r","b","r"],levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
    
# 1.描點,建立座標系,爲網格座標分割數組做準備
plt.scatter(X[:,0], X[:,1], c=y, s=50,cmap = "rainbow")
# 2.SVC訓練數據
model = SVC(kernel="linear").fit(X,y)
# 3.畫圖
plot_svc_decision_function(model)
#plt.show()

# 通過環形數據來演示關於線性SVC的分類方式
from sklearn.datasets import make_circles
# X爲生成數據座標,y爲標籤,對應描點scatter的顏色
X,y = make_circles(100,factor=0.1,noise=.1)
# pd.DataFrame(y)

# clf = SVC(kernel="linear").fit(X,y)
clf = SVC(kernel="rbf").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,cmap = "rainbow")
plot_svc_decision_function(clf)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章