机器学习——支持向量机(SVM)

一、支持向量机 (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的缺点:
如果特征数量⽐样本数量⼤得多,在选择核函数时要避免过拟合;
对缺失数据敏感;
对于核函数的⾼维映射解释
 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值