支持向量机(SVM)算法除了能对线性问题进行分类外,还可以对非线性可分的问题进行分类,可以很容易地使用“核技巧”来解决非线性可分问题。
在非线性问题中,最经典的非线性问题莫过于对于异或问题的分类,下面通过一个例子来演示。
【例3-3】 通过Python生成一个异或数据集。
import matplotlib.pyplot as plt import numpy as np np.random.seed(1) X_xor = np.random.randn(200,2) y_xor = np.logical_xor(X_xor[:,0]>0, X_xor[:,1]>0) y_xor = np.where(y_xor,1,-1) plt.scatter(X_xor[y_xor == 1,0], X_xor[y_xor == 1,1], c='b',marker='x', label='1') plt.scatter(X_xor[y_xor == -1,0], X_xor[y_xor == -1,1], c='r', marker='s', label='-1') plt.xlim([-3,3]) plt.ylim([-3,3]) plt.legend(loc='best') plt.tight_layout() plt.show()
运行程序,得到如图3-10所示的随机噪声的异或数据集。
图3-10 异或数据集
从图3-10可看出,不能用前面讨论过的线性逻辑回归或线性SVM模型所产生的线性超平面作为决策边界来分隔样本的正类和负类。然而,核方法的逻辑是针对线性不可分数据,通过映射函数 Φ 把原始特征投影到一个高维空间,特征在该空间变得线性可分,如图3-11所示。
为了使用SVM解决非线性问题,需要调用映射函数 Φ 将训练数据变成在高维空间上表示的特征,然后训练SVM模型对新特征空间的数据进行分类。可以用相同的映射函数 Φ 对新的、未见过的数据进行变换,用线性SVM模型进行分类。
图3-11 原始特征投影到一个高维空间效果
定义核函数如下:
通过下面代码看能否训练核SVM来画出非线性决策边界,以区分异或数据。
svm = SVC(kernel='rbf',random_state=1,gamma=0.10,C=10.0) svm.fit(X_xor,y_xor) plot_decision_regions(X_xor,y_xor, classifier=svm) plt.legend(loc='upper left') plt.tight_layout() plt.show()
运行程序,效果如图3-12所示。
图3-12 划分非线性决策边界效果
γ 值的不同,可能导致决策边界紧缩和波动,此处将 γ 值改为0.5,则决策边界效果如图3-13所示。
图3-13 决策边界效果