一、支持向量机 (SVM)算法的原理
1.支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析。它是将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。
1.1 支持向量机包含三种:
线性可分支持向量机:当训练数据线性可分时,可通过硬间隔最大化,学习一个线性的分类器,叫线性可分支持向量机,也称硬间隔支持向量机
线性支持向量机:当训练数据近似线性可分时,可通过软间隔最大化,也学习一个线性的分类器,叫线性支持向量机,也称为软间隔支持向量机
非线性支持向量机:当训练数据线性不可分时,通过使用核函数技巧及软间隔最大化,学习一个非线性的支持向量机
线性可分的数据就是代表这些数据能够用一条直线分开(二分类),如下图所示:
近似线性可分的数据如下图所示,即绝大多数的样本都能被准确分类,只有少数样本出现错误:
所以对软间隔和硬间隔的理解:当训练数据是线性可分的,能够找到一个平面百分百的将数据分类正确,此时训练数据到超平面的距离就叫做硬间隔(粗俗的讲就是实打实的距离);如果训练数据近似线性可分,同样可以找到一个超平面能够将绝大部分的数据分类正确,只有少数的样本分类错误,如果能容忍这种错误的存在,此时训练数据到超平面的距离就是软间隔(粗俗理解就是不在意这些细节)。简言之,硬间隔就是不能容忍错误分类点的存在,软间隔就是允许错误分类点的存在。
2. SVM的原理
SVM的原理基于以下几个关键概念:
-
支持向量:SVM构建决策边界时仅依赖于一部分样本,即支持向量。这些样本位于类别之间的边界上,对于决策边界的构建起着重要的作用。
-
最大化间隔:SVM通过找到具有最大间隔的决策边界来实现分类。间隔是指决策边界与最近的支持向量之间的距离,最大化间隔有助于提高模型的鲁棒性和泛化能力。
-
核函数:SVM可以通过核函数将低维空间中的样本映射到高维特征空间,从而在非线性问题上构建有效的决策边界。
3.SVM根据数据的不同可以分为以下三种形式:
1.线性可分支持向量机,也叫做硬间隔支持向量机,处理的数据是线性可分的,通过硬间隔最大化来学习一个线性可分的模型。
2.线性支持向量机,也叫做软间隔支持向量机,当数据近似线性可分时,通过引入松弛因子,软间隔最大化学习一个线性可分的模型。
3.非线性支持向量机,当数据线性不可分时,通过引入核函数将数据映射到高维空间后,学习得到一个非线性支持向量机。
支持向量机的基本思想
1.对于线性可分的任务,找到一个具有最大间隔超平面,如图所示,
(1)支持向量机的基本型
(2)软间隔的优化目标:
其中,0-1函数为错分样本的个数。
(3)核方法:
其中为特征映射函数。
2、实验一般步骤:
(1)导入数据;
(2)数据归一化;
(3)执行svm寻找最优的超平面;
(4)绘制分类超平面核支持向量;
(5)利用多项式特征在高维空间中执行线性svm
(6)选择合适的核函数,执行非线性svm;
3、算法优缺点:
算法优点:
(1)使用核函数可以向高维空间进行映射
(2)使用核函数可以解决非线性的分类
(3)分类思想很简单,就是将样本与决策面的间隔最大化
(4)分类效果较好
算法缺点:
(1)SVM算法对大规模训练样本难以实施
(2)用SVM解决多分类问题存在困难
(3)对缺失数据敏感,对参数和核函数的选择敏感
当一个分类问题, 数据是线性可分的, 也就是用一根棍就可以将两种小球分开的时候, 我们只要将棍的位置放在让小球距离棍的距离最大化的位置即可, 寻找这个最大间隔的过程, 就叫最优化. 但是, 一般的数据是线性不可分的, 也就是找不到一个棍将两种小球很好的分类. 这个时候, 我们就需要像大侠一样, 将小球拍起, 用一张纸代替小棍将小球进行分类. 想要让数据飞起, 我们需要的东西就是核函数 (kernel) , 用于切分小球的纸, 就是超平面 (hyperplane) . 如果数据是N维的, 那么超平面就是N-1维. (补: 未使用核函数情况下)
把一个数据集正确分开的超平面可能有多个, 而那个具有“最大间隔”的超平面就是SVM要寻找的最优解. 而这个真正的最优解对应的两侧虚线所穿过的样本点, 就是SVM中的支持样本点, 称为支持向量(support vector). 支持向量到超平面的距离被称为间隔 (margin)。
二代码实现
#make_moons:生成半环形数据
import matplotlib.pyplot as plt
#datasets里面有很多数据,自己找着用
from sklearn.datasets import make_moons
X,y=make_moons(n_samples=100,noise=0.15,random_state=42)
'''
make_moons:生成半环形数据
X:产尺寸为[n_sample,2]的样本
'''
def plot_dataset(X,y,axes):
plt.plot(X[:,0][y==0],X[:,1][y==0],'bs')
plt.plot(X[:,0][y==1],X[:,1][y==1],'g^')
plt.axis(axes)
plt.grid(True,which='both')
plt.xlabel(r'$x_1$',fontsize=20)
plt.ylabel(r'$x_2$',fontsize=20,rotation=0)
plot_dataset(X,y,[-1.5,2.5,-1,1.5])
plt.show()
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
'''
pipeline:把n多步放到管道里,按顺序去做这件事,帮忙梳理逻辑
PolynomialFeatures:数据升维工具,数据必须可以还原
'''
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
ploynomial_svm_clf=Pipeline((('poly_features',PolynomialFeatures(degree=3)),
('scaler',StandardScaler()),
('svm_clf',LinearSVC(C=10,loss='hinge'))
#C:容忍犯错
#loss:损失函数
))
print(ploynomial_svm_clf.fit(X,y))
import numpy as np
def plot_predictions(clf,axes):
x0s=np.linspace(axes[0],axes[1],100)
x1s=np.linspace(axes[2],axes[3],100)
x0,x1=np.meshgrid(x0s,x1s)
X=np.c_[x0.ravel(),x1.ravel()]
y_pred=clf.predict(X).reshape(x0.shape)
plt.contourf(x0,x1,y_pred,cmap=plt.cm.brg,alpha=0.2)
plot_predictions(ploynomial_svm_clf,[-1.5,2.5,-1,1.5])
plot_dataset(X,y,[-1.5,2.5,-1,1.5])
plt.show()
reg=PolynomialFeatures(degree=3)#degree可以看做是指数
print(reg)
#生成一个三行两列的数组
x=np.arange(6).reshape(3,2)
print(x)
print(reg.fit_transform(x))#训练完直接使用,做了升维
'''
SVM多分类问题
SVM实现多分类:
1.直接法
2.间接法
2.1一对多
'''
三.总结
SVM的优点:
在⾼维空间中⾮常⾼效;
即使在数据维度⽐样本数量⼤的情况下仍然有效;
在决策函数(称为⽀持向量)中使⽤训练集的⼦集,因此它也是⾼效利⽤内存的;
通⽤性:不同的核函数与特定的决策函数⼀⼀对应;
SVM的缺点:
如果特征数量⽐样本数量⼤得多,在选择核函数时要避免过拟合;
对缺失数据敏感;
对于核函数的⾼维映射解释