1 # coding: utf-8 2 3 # In[3]: 4 5 6 import numpy as np 7 import matplotlib.pyplot as plt 8 from matplotlib.colors import ListedColormap 9 from sklearn import svm 10 from sklearn.datasets import make_circles, make_moons, make_blobs,make_classification 11 12 13 # In[4]: 14 15 16 n_samples = 100 17 18 datasets = [ 19 make_moons(n_samples=n_samples, noise=0.2, random_state=0), 20 make_circles(n_samples=n_samples, noise=0.2, factor=0.5, random_state=1), 21 make_blobs(n_samples=n_samples, centers=2, random_state=5), make_classification(n_samples=n_samples,n_features = 22 2,n_informative=2,n_redundant=0, random_state=5) 23 ] 24 25 Kernel = ["linear","poly","rbf","sigmoid"] #四個數據集分別是什么樣子呢? 26 27 for X,Y in datasets: 28 plt.figure(figsize=(5,4)) 29 plt.scatter(X[:,0],X[:,1],c=Y,s=50,cmap="rainbow") 30 31 32 # In[14]: 33 34 35 nrows=len(datasets) 36 ncols=len(Kernel) + 1 37 38 fig, axes = plt.subplots(nrows, ncols,figsize=(20,16)) 39 40 for X,Y in datasets: 41 plt.figure(figsize=(5,4)) 42 plt.scatter(X[:,0],X[:,1],c=Y,s=50,cmap="rainbow") 43 44 #第一層循環:在不同的數據集中循環 45 for ds_cnt, (X,Y) in enumerate(datasets): 46 47 #在圖像中的第一列,放置原數據的分布 48 ax = axes[ds_cnt, 0] 49 if ds_cnt == 0: 50 ax.set_title("Input data") 51 ax.scatter(X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.cm.Paired,edgecolors='k') 52 ax.set_xticks(()) 53 ax.set_yticks(()) 54 55 #第二層循環:在不同的核函數中循環 56 #從圖像的第二列開始,一個個填充分類結果 57 for est_idx, kernel in enumerate(Kernel): 58 59 #定義子圖位置 60 ax = axes[ds_cnt, est_idx + 1] 61 62 #建模 63 clf = svm.SVC(kernel=kernel, gamma=2).fit(X, Y) 64 score = clf.score(X, Y) 65 66 #繪制圖像本身分布的散點圖 67 ax.scatter(X[:, 0], X[:, 1], c=Y 68 ,zorder=10 69 ,cmap=plt.cm.Paired,edgecolors='k') 70 #繪制支持向量 71 ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=50,
facecolors='none', zorder=10, edgecolors='k') 72 73 #繪制決策邊界 74 x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5 75 y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5 76 77 #np.mgrid,合並了我們之前使用的np.linspace和np.meshgrid的用法 #一次性使用最大值和最小值來生成網格 78 #表示為[起始值:結束值:步長] 79 #如果步長是復數,則其整數部分就是起始值和結束值之間創建的點的數量,並且結束值被包含在內 80 XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j] #np.c_,類似於np.vstack的功能 81 Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()]).reshape(XX.shape) #填充等高線不同區域的顏色 82 ax.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired) #繪制等高線 83 ax.contour(XX, YY, Z, colors=['k', 'k', 'k'], linestyles=['--', '-', '--'], levels=[-1, 0, 1]) 84 85 #設定坐標軸為不顯示ax.set_xticks(()) ax.set_yticks(()) 86 87 #將標題放在第一行的頂上if ds_cnt == 0: 88 ax.set_title(kernel) 89 90 #為每張圖添加分類的分數 91 ax.text(0.95, 0.06, ('%.2f' % score).lstrip('0') 92 , size=15 93 , bbox=dict(boxstyle='round', alpha=0.8, facecolor='white') #為分數添加一個白色的格子作為底色 94 , transform=ax.transAxes #確定文字所對應的坐標軸,就是ax子圖的坐標軸本身 95 , horizontalalignment='right' #位於坐標軸的什么方向 96 ) 97 98 plt.tight_layout() 99 plt.show()




