关于使用SVM进行回归分析的介绍很少,在这里,我们讨论一下SVR的理论知识,并对该方法有一个简明的理解。
1. SVC简单介绍
SVR全称是support vector regression,是SVM(支持向量机support vector machine)对回归问题的一种运用。所以在介绍SVR之前,我们先简单的来了解一下什么是SVM。
SVM
SVM与logistic分类器类似,也是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
对于下面一个数据集,有两类分别使用×和○来表示。那么我们想要找到一条曲线来区分这两类。可想而知,这样的曲线存在无数条,如何找到那一条最优的曲线呢?那就是要找到间隔(Gap)最大的那一条曲线,然后我们就可以根据这条曲线来分类了。而这条曲线,我们称为超平面。图中加粗的×与○,我们则称这些向量为支持向量。
而实际上,我们很少会遇到上面的情况,能直接使用一条直线将数据分类,更多的时候,数据无法通过直线来分类。比如下面这种情况:
当然了,这都不是事,既然在二维上该数据无法使用线性分类,那我们就将数据映射到更高维上,在高维上构造超平面,从而完成分类。
这就是为什么将上面的直线称为超平面。
所以对于非线性的模型,我们需要:
- 使用非线性映射将数据投影至特征空间;
- 在特征空间使用线性分类器;看似很简单,但是我们在映射时,就会发现当变量增多时,映射到高维空间的维度是呈指数增长的,计算起来十分困难,这时候就需要核函数(kernel function)了。核函数也是将特征从低维到高维进行转换,但是它是先在低维上进行计算,实际的分类效果表现在高维上。这样,我们就避免了在高维上复杂的计算,仍得到相同的结果。一些常用的核函数:
- 多项式核
- 高斯核
- 线性核
好了,SVM就简单介绍到这里。更多理论的推导或者其他更深的理论,请自行查阅!
1.1 SVC示例
下面是一个使用Scikit-Learn库的 SVM 回归示例:
在https://blog.csdn.net/weixin_48293076/article/details/127935585网站上学习到的
'''
https://scikit-learn.org/stable/modules/svm.html
'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
def make_meshgrid(x, y, h=.02):
#创建要在其中打印的点网格
x_min, x_max = x.min() - 1, x.max() + 1
y_min, y_max = y.min() - 1, y.max() + 1
#np.arange(start,end,step)
#X, Y = np.meshgrid(x, y) 代表的是将x中每一个数据和y中每一个数据组合生成很多点,
#然后将这些点的x坐标放入到X中,y坐标放入Y中,并且相应位置是对应的
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
return xx, yy
#**params,传递dictionary
#params、*params分别传递单参数、tuple
#相当于只是绘制了分区的背景板
def plot_contours(ax, clf, xx, yy, **params):
#模型预测,np.c_按行连接两个矩阵,要求行数相等
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
#contourf绘制二维颜色填充图
#contour画的是等高线中的线,而contourf画的是登高线之间的区域
out = ax.contourf(xx, yy, Z, **params) #Z和xx,yy维度相同
return out
#导入数据
iris = datasets.load_iris()
#只获取前两个特征,绘制二维图像
X = iris.data[:, :2]
y = iris.target
#设置惩罚参数
C = 1.0
#定义多种模型
models = (svm.SVC(kernel='linear', C=C),
svm.LinearSVC(C=C),
svm.SVC(kernel='rbf', gamma=0.7, C=C),
svm.SVC(kernel='poly', degree=3, C=C))
#循环拟合模型
models = (clf.fit(X, y) for clf in models)
titles = ('SVC with linear kernel',
'LinearSVC (linear kernel)',
'SVC with RBF kernel',
'SVC with polynomial (degree 3) kernel')
plt.figure(1)
#设置3*2画布
fig, sub = plt.subplots(2, 2)
#设置子图之间的空间保留的宽度和高度
plt.subplots_adjust(wspace=0.4, hspace=0.4)
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0