一)支持向量机历史
1995年Cortes和Vapnik首先提出了支持向量机(Support Vector Machine )。 因为它可以应对小样本的分类。 具有分类速度快等特点,性能不比人工神经网络差,此后SVM被应用于各个领域。
2 )支持向量机原理
SVM是一种有监督的机器学习算法,解决二元分类问题,即分为两类的问题,多元分类问题可以通过构造多个SVM分类器的方法解决。
SVM有两个主要特征。 稍后详细说明。
求出最佳分类边界
正确:可以对大多数样本正确划分类别。
泛化:最大化支持向量的间隔。
公平:类别与支持向量等距。
简单:直线、直线或平面。 支持基于核函数的升维转换
通过核函数的特征变换,增加新的特征,使得低维空间的线性不可分问题成为高维空间的线性可分问题。 三) ) )。
现在,让我们用具体的例子来说明SVM的工作原理
图1
如上图所示,有c、p两种点。 我需要找条直线,把这些点分成他们。 分成方法有很多。 在上图中,红、绿、蓝三条线,可以把他们分开。 哪个是最佳的分类边界呢? 我们根据最优分类边界的四个特征一次分析。
第一,是正确的。 对于大多数样本,可以正确划分类别。 很明显,在上图中,红、绿、蓝三条线重合。
第二,泛化:最大化支持向量间距。
在SVM中,选择支持向量时,选择间隔最宽的向量作为支持向量。 通过观察,L1、L2这2条线上的向量由于它们的间隔最大,所以将它们选择为支承向量。
第三,公平:范畴与支持向量等距。
也就是说,分类边界必须位于两个支撑向量L1、L2的正中间。
第四,简单:直线、直线或平面。 分类边界必须是直线或平面。
根据以上分析,只有红线是我们要找的线。
四) ) ) )。
如果线遇到不能分离的样品,怎么分?
图2
如上图所示,找不到完全分离样品的直线。
此时,SVM的第二个特征用于支持基于内核函数的向上维度转换。
如果在低维空间中不可分离的样本通过适当的映射被投影到更高维的空间中,则在高维空间中很可能是可分离的。 将上面的采样点从二维提升到三维,如下图所示。
图3
映射到三维空间的样本点可以分离,可以找到无数个平面(三维空间中的线性函数),将两种训练样本完美地分离。 但是,基于求出最佳分类边界的四个原则,我们最终求出最佳的分类超平面。
以上是非线性SVM算法的工作原理。
五)使用非线性SVM算法时,我个人认为最重要的是核函数的选择。
常用的内核函数如下:
1 .多项式核函数:通过poly、多项式函数增加原样本特征高阶方程的幂,作为新的特征。
2 .径向基底核函数:用rbf、pgddxb分布函数增加原始样本特征的分布概率作为新特征。
3 .线性核函数: linear .该参数不通过核函数提升维数,只在原始维数空间中求线性分类边界。
6 ) SVM算法的sklearn实现,以及参数说明
imports klearn.svmassvmmodel=SVM.SVC (c=1.0,kernel='rbf ',degree=3,gamma='auto ',coef0=0.0,shrink id
C越大,对错误分类的惩罚越大,期望松弛变量接近0,倾向于训练集为总分对,测试训练集精度高,但泛化能力弱。 C值小,对错误分类惩罚小,允许容错,将他们视为噪声点,泛化能力强。
关于缓和变量,在这里说明:
在许多情况下,数据不是完全线性可分离的数据,而是在分类超平面的另一侧可能存在很小的点。 希望尽可能准确地对这些点进行分类,同时确保分类面与两种样本点之间有足够的几何间隔。 在这种情况下,为每个采样点添加松弛变量,以允许存在小误差。 添加松弛变量后,我们在目标函数中添加相应的惩罚参数c,对该松弛变量起到一种监督抑制作用。 两者的关系,类似于道家阴阳制衡的关系,但这消除了他的长短。
C:核函数,默认值为rbf :“linear”、“‘poly”、“RBF”、“‘sigmoid”和“precomputed”3358 www.Sina . 默认值为“自动”。 在伽马为’auto’的情况下,实际系数为1/n_features。kernel
:核函数中的独立项。 它只在’poly’和’sigmoid’中很重要。probability :是否启用概率估计。 必须在调用fit之前启用它,并且会减慢该方法的速度。默认为Falseshrinking :是否采用shrinking heuristic方法(收缩启发式),默认为true
tol :停止训练的误差值大小,默认为1e-3
cache_size :核函数cache缓存大小,默认为200
class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)
verbose :允许冗余输出
max_iter :最大迭代次数。-1为无限制。
decision_function_shape :‘ovo’, ‘ovr’ or None, default=ovr
关于‘ovo’, ‘ovr’的解释:
一对多法(one-versus-rest,简称OVR SVMs)
训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
一对一法(one-versus-one,简称OVO SVMs或者pairwise)
其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。
当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。
详细讲解,可以参考这篇博客:
https://blog.csdn.net/xfchen2/article/details/79621396
random_state :数据洗牌时的种子值,int值,default=None
在随机数据混洗时使用的伪随机数生成器的种子。 如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是np.random使用的RandomState实例。
个人认为最重要的参数有:C、kernel、degree、gamma、coef0。
七) 项目实践
原理讲完了,现在,我就用sklearn自带的鸢尾花数据集进行SVM演示。
[out]:
[[5.1 3.5] [4.9 3. ] [4.7 3.2] [4.6 3.1] [5. 3.6]][0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] # 基于svm 实现分类model = svm.SVC(C=1,kernel='rbf',gamma=0.1)model.fit(x,y) # 绘制散点图# 绘制类别背景 pcolormesh# 把整个空间进行网格化拆分,通过拆分出来的# 每个点根据分类模型预测每个点类别名,填充相应的颜色值。 l, r = x[:,0].min()-1, x[:,0].max()+1b, t = x[:,1].min()-1, x[:,1].max()+1n = 500grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))# 整理结构变为 25万行2列的二维数组grid_xy = np.column_stack((grid_x.ravel(), grid_y.ravel()))grid_z = model.predict(grid_xy)# 整列输出,变维:500*500grid_z = grid_z.reshape(grid_x.shape)# 绘图mp.figure('SVM RBF', facecolor='lightgray')mp.title('SVM RBF', fontsize=14)mp.xlabel('x', fontsize=12)mp.ylabel('y', fontsize=12)mp.tick_params(labelsize=10)mp.grid(linestyle=':')mp.pcolormesh(grid_x, grid_y, grid_z,cmap='gray')mp.scatter(x[:, 0], x[:, 1], s=60, marker='o', alpha=0.7, label='Sample Points', c=y, cmap='brg')mp.legend()mp.show()
图上,黑,白,灰三个区域,是根据分类模型,把整个网格点分成了三个区域。
图中的三种颜色的圆点,是实际样本点。我们可以看到,蓝色的样本点分类还比较准确,但红色和绿色的较为混乱。之所以,会出现这种情况,是因为,鸢尾花原数据有四个特征,但我为了用散点图进行演示,只选取了其中的两项特征进行分类,所以才出现了这种情况。
在实际项目,模型参数的选择该如何选择,也是一项很重要的工作,下一篇,我将用网格搜索来寻求模型的最优参数。