1.支持向量机的原理和基本构造
1.定义:
在SVM算法中,训练模型的过程实际上是对每个数据点对于数据分类决定边界的重要性进行判断。也就是说在训练数据集中,只有一部分数据对于边界的确定是有帮助的,我们把那一部分有帮助的点的向量,称为“支持向量”,这也是“支持向量机”名字的由来。
SVM的原理就是使用分隔超平面来划分数据集,并使得支持向量(数据集中离分隔超平面最近的点)到该分隔超平面的距离最大。其最大特点是能构造出最大间距的决策边界,从而提高分类算法的鲁棒性。
2.SVM算法的核函数:
将二维数据变成三维的过程,称为将数据投射至高维空间,也就是SVM算法的核函数功能。
3.SVM算法最普遍的核函数有两种:
1.多项式内核(Polynomial kernel):通过把样本原始特征进行乘方来把数据投射到高维空间,比如特征1乘2次方、特征2乘3次方,特征3乘5次方等。
2.径向基内核(Radial basis function kernel,RBF):RBF内核也被称为高斯内核(Gaussian kernel),接下来详细介绍RBF内核。
2.支持向量机的核函数
1.构造kernel=linear的线性内核的svm模型
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
# 先创建50个数据点,让它们分为两类
X, y = make_blobs(n_samples=50, centers=2, random_state=6)
# 创建一个线性内核的支持向量机模型
clf = svm.SVC(kernel=linear, C=1000)
clf.fit(X, y)
# 把数据点画出来
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
#建立图像坐标
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
# 把分类的决定边界画出来
ax.contour(XX, YY, Z, colors=k, levels=[-1, 0, 1], alpha=0.5,
linestyles=[--, -, --])
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100,
linewidth=1, facecolors= one)
plt.show()
运行代码,如图所示:
image.png
结果分析:
可以看到,在分类器两侧分别有两条虚线,那些正好压在虚线上的数据点,就是我们所说的支持向量。本例使用的方法称为“最大边界间隔超平面”。指的是说中间这条实线(在高维数据中是一个超平面),和所有支持向量之间的距离,都是最大的。
2.构造kernel=RBF的线性内核的svm模型
# 创建一个RBF内核的支持向量机模型
clf_rbf = svm.SVC(kernel= bf, C=1000)
clf_rbf.fit(X, y)
# 把数据点画出来
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
#建立图像坐标
ax = plt.gca()
xl