支持向量機
此範例是展示如何使用 RBF Kernel 之非線性 SVC 去做二元分類,去預測出 XOR 的輸入分佈並用 Color Map 去繪製出分類的決策邊界及區域。

(一)引入函式庫

引入函式如下:
    1.
    numpy : 產生陣列數值
    2.
    matplotlib.pyplot : 用來繪製影像
    3.
    sklearn.svm : SVM 支持向量機之演算法物件
1
import numpy as np
2
import matplotlib.pyplot as plt
3
from sklearn import svm
Copied!
1
xx, yy = np.meshgrid(np.linspace(-3, 3, 500),
2
np.linspace(-3, 3, 500))
3
np.random.seed(0)
4
X = np.random.randn(300, 2)
5
Y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0)
Copied!
利用np.meshgrid生成網格採樣點,再利用np.random.randn()產生隨機的資料點X,接著利用np.logical_xor對隨機生成之資料點做 xor 的分類產生Y。

(二)SVM Model

1
# fit the model
2
clf = svm.NuSVC()
3
clf.fit(X, Y)
Copied!
svm.NuSVC: 與 svm.SVC 類似,但是多了可以控制支持向量(Support Vector)個數之參數
1
# plot the decision function for each datapoint on the grid
2
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
3
Z = Z.reshape(xx.shape)
4
5
plt.imshow(Z, interpolation='nearest',
6
extent=(xx.min(), xx.max(), yy.min(), yy.max()), aspect='auto',
7
origin='lower', cmap=plt.cm.PuOr_r)
8
contours = plt.contour(xx, yy, Z, levels=[0], linewidths=2,
9
linetypes='--')
10
plt.scatter(X[:, 0], X[:, 1], s=30, c=Y, cmap=plt.cm.Paired,
11
edgecolors='k')
12
plt.xticks(())
13
plt.yticks(())
14
plt.axis([-3, 3, -3, 3])
15
plt.show()
Copied!
最後繪製出非線性之決策邊界及資料點分布位置,繪圖方式可參考 EX7: SVM-Kernels 之解說。
下方為非線性分割之結果圖 :
Non-linear

(三)完整程式碼

Python source code: plot_svm_nonlinear.py
iPython source code: plot_svm_nonlinear.ipynb
1
"""
2
==============
3
Non-linear SVM
4
==============
5
6
Perform binary classification using non-linear SVC
7
with RBF kernel. The target to predict is a XOR of the
8
inputs.
9
10
The color map illustrates the decision function learned by the SVC.
11
"""
12
print(__doc__)
13
14
import numpy as np
15
import matplotlib.pyplot as plt
16
from sklearn import svm
17
18
xx, yy = np.meshgrid(np.linspace(-3, 3, 500),
19
np.linspace(-3, 3, 500))
20
np.random.seed(0)
21
X = np.random.randn(300, 2)
22
Y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0)
23
24
# fit the model
25
clf = svm.NuSVC()
26
clf.fit(X, Y)
27
28
# plot the decision function for each datapoint on the grid
29
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
30
Z = Z.reshape(xx.shape)
31
32
plt.imshow(Z, interpolation='nearest',
33
extent=(xx.min(), xx.max(), yy.min(), yy.max()), aspect='auto',
34
origin='lower', cmap=plt.cm.PuOr_r)
35
contours = plt.contour(xx, yy, Z, levels=[0], linewidths=2,
36
linetypes='--')
37
plt.scatter(X[:, 0], X[:, 1], s=30, c=Y, cmap=plt.cm.Paired,
38
edgecolors='k')
39
plt.xticks(())
40
plt.yticks(())
41
plt.axis([-3, 3, -3, 3])
42
plt.show()
Copied!