生成数据集
#生成数据集
from sklearn.datasets import make_circles
X,y=make_circles(noise=0.2, factor=0.5, random_state=1)
标准化
#标准化
from sklearn.preprocessing import StandardScaler
X = StandardScaler().fit_transform(X)
可视化
#可视化
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
cm = plt.cm.RdBu
cm_bright = ListedColormap(['#FFFFFF','#0000FF'])
ax = plt.subplot()
ax.set_title("Input data")
ax.scatter(X[:,0], X[:,1], c=y, cmap=cm_bright)
ax.set_xticks(())
ax.set_yticks(())
plt.tight_layout()
plt.show()
#产生网络节点
import numpy as np
x_min, x_max = X[:,0].min()-1, X[:,0].max()+1
y_min, y_max = X[:,1].min()-1, X[:,1].max()+1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))
使用默认的带rbf核的SVM模型训练
#使用默认的带rbf核的SVM模型训练
from sklearn.svm import SVC
C = 5
gamma = 0.1
clf = SVC(C=C, gamma=gamma)
clf.fit(X, y)
z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
可视化
#可视化
z = z.reshape(xx.shape)
plt.subplot()
plt.contourf(xx, yy, z, cmap=plt.cm.coolwarm, alpha=0.9)
plt.scatter(X[:,0], X[:,1], c=y, cmap=cm_bright)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks()
plt.yticks()
plt.xlabel("C=" + str(C) + "," + "gamma=" + str(gamma))
plt.show()
从输出结果可以看出,采用核函数的支持向量机模型可以较好地完成对样本点的非线性划分。
该部分参考网上各路大神的经验
(1)SVM模型具有较好的泛化能力,特别是在小样本训练集上能够得到比其他算法好很多的结果。这是因为其本身的优化目标是结构风险最小,而不是经验风险最小,因此通过margin的概念,可以得到对数据分布的结构化描述,从而降低了对数据规模和数据分布的要求。
(2)SVM模型具有较强的数学理论支撑,基本不涉及概率测度及大数定律等。
(3)引入核函数后可以解决非线性分类问题。
(1)不方便解决多分类问题: 经典的SVM模型只给出了二分类算法,对于多分类问题,只能采用一对多模式来间接完成。例如,结果标签为1、2、3三个类别,那么可以先将标签1看作一个类别,将标签2和3看作另一个类别,进行一次SVM模型二分类,可以识别出类别为1的样本;然后再将标签2看作一个类别,将标签1和3看作另一个类别,进行第二次二分类,就可以识别出类别为2的样本;所以对于有N个类别的样本,需要进行N−1次二分类。
(2)SVM 模型存在两个对结果影响较大的超参数,比如采用 rbf 核函数时,超参数惩罚项系数c和核函数参数gamma是无法通过概率的方法进行计算的,只能通过穷举遍历的方式或者根据以往经验推测获得,导致其复杂度比一般的非线性分类器要高。