小彩筆的學習筆記,偷懶只做了訓練集
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])
#返回每個類中支持向量的個數