SVM線性實例

小彩筆的學習筆記,偷懶只做了訓練集

from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
X,y = make_blobs(n_samples=50, centers=2, random_state=0,cluster_std=0.6)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")#rainbow彩虹色
plt.xticks([])
plt.yticks([])
plt.show()

在這裏插入圖片描述

#首先要有散點圖
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
ax = plt.gca() #獲取當前的子圖,如果不存在,則創建新的子圖

在這裏插入圖片描述

#獲取平面上兩條座標軸的最大值和最小值
xlim = ax.get_xlim()
ylim = ax.get_ylim()
 
#在最大值和最小值之間形成30個規律的數據
axisx = np.linspace(xlim[0],xlim[1],30)
axisy = np.linspace(ylim[0],ylim[1],30)
 
axisy,axisx = np.meshgrid(axisy,axisx)
#我們將使用這裏形成的二維數組作爲我們contour函數中的X和Y
#使用meshgrid函數將兩個一維向量轉換爲特徵矩陣
#核心是將兩個特徵向量廣播,以便獲取y.shape * x.shape這麼多個座標點的橫座標和縱座標
 
xy = np.vstack([axisx.ravel(), axisy.ravel()]).T
#其中ravel()是降維函數,vstack能夠將多個結構一致的一維數組按行堆疊起來
#xy就是已經形成的網格,它是遍佈在整個畫布上的密集的點
 
plt.scatter(xy[:,0],xy[:,1],s=1,cmap="rainbow")
 
#理解函數meshgrid和vstack的作用
a = np.array([1,2,3])
b = np.array([7,8])
#兩兩組合,會得到多少個座標?
#答案是6個,分別是 (1,7),(2,7),(3,7),(1,8),(2,8),(3,8)
 
v1,v2 = np.meshgrid(a,b)
 
v1
 
v2
 
v = np.vstack([v1.ravel(), v2.ravel()]).T

在這裏插入圖片描述

#建模,通過fit計算出對應的決策邊界
clf = SVC(kernel = "linear").fit(X,y)#計算出對應的決策邊界
Z = clf.decision_function(xy).reshape(axisx.shape)
#重要接口decision_function,返回每個輸入的樣本所對應的到決策邊界的距離
#然後再將這個距離轉換爲axisx的結構,這是由於畫圖的函數contour要求Z的結構必須與X和Y保持一致

#首先要有散點圖
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
ax = plt.gca() #獲取當前的子圖,如果不存在,則創建新的子圖
#畫決策邊界和平行於決策邊界的超平面
ax.contour(axisx,axisy,Z
           ,colors="k"
           ,levels=[-1,0,1] #畫三條等高線,分別是Z爲-1,Z爲0和Z爲1的三條線
           ,alpha=0.5#透明度
           ,linestyles=["--","-","--"])
 
ax.set_xlim(xlim)#設置x軸取值
ax.set_ylim(ylim)

在這裏插入圖片描述

#記得Z的本質麼?是輸入的樣本到決策邊界的距離,而contour函數中的level其實是輸入了這個距離
#讓我們用一個點來試試看
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plt.scatter(X[10,0],X[10,1],c="black",s=50,cmap="rainbow")

在這裏插入圖片描述

clf.decision_function(X[10].reshape(1,2))
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
ax = plt.gca()
ax.contour(axisx,axisy,Z
            ,colors="k"
            ,levels=[-3.33917354]
            ,alpha=0.5
            ,linestyles=["--"])

在這裏插入圖片描述

#將上述過程包裝成函數:
def plot_svc_decision_function(model,ax=None):
    if ax is None:
        ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    
    x = np.linspace(xlim[0],xlim[1],30)
    y = np.linspace(ylim[0],ylim[1],30)
    Y,X = np.meshgrid(y,x) 
    xy = np.vstack([X.ravel(), Y.ravel()]).T
    P = model.decision_function(xy).reshape(X.shape)
    
    ax.contour(X, Y, P,colors="k",levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"]) 
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
 
#則整個繪圖過程可以寫作:
clf = SVC(kernel = "linear").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plot_svc_decision_function(clf)

在這裏插入圖片描述

clf.predict(X)
#根據決策邊界,對X中的樣本進行分類,返回的結構爲n_samples
 
clf.score(X,y)
#返回給定測試數據和標籤的平均準確度
 
clf.support_vectors_
#返回支持向量座標
 
clf.n_support_#array([2, 1])
#返回每個類中支持向量的個數

在這裏插入圖片描述

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