机器学习Python实战-第三章-分类问题-4.支持向量机算法

目录

[3.4.1 原理简介](#3.4.1 原理简介)

[3.4.2 算法步骤](#3.4.2 算法步骤)

[3.4.3 实战](#3.4.3 实战)

[3.4.4 实验](#3.4.4 实验)


前半部分是理论介绍,后半部分是代码实践,可以选择性阅读。

GitHub源码地址: HeShen-1/python-MachineLearning: 机器学习python实战(西唯兵版本)。代码仅供参考。

3.4.1 原理简介

支持向量机(support vector machine,SVM)是一种++二分类模型++ ,它的**++基本模型++** 是**++定义在特征空间上的间隔最大的线性分类器++** ,间隔最大使它有别于感知机;SVM还包括++核技巧++ ,这使它成为实质上的**++非线性分类器++。SVM的学习策略就是间隔最大化**,可形式化为一个求解凸二次规划的问题,也等价于++正则化的合页损失函数的最小化问题++。SVM的学习算法就是求解凸二次规划的最优化算法。

1.线性SVM算法原理

SVM的基本思想 是++求解能够正确划分训练数据集并且使几何间隔最大的分离超平面++ 。如图所示,其中,实心圆和空心圆代表两类样本;虚线为分类线,它们之间的距离叫做分类间隔(margin);虚线上的点称为支持向量;即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。

假设给定一个在特征空间上线性可分的训练数据集为

其中,为第个特征向量;为类标记,表示正例,表示负例。
对于给定的数据集和超平面,则超平面关于样本点的几何间隔为
超平面关于所有样本点的几何间隔的最小值为

实际上,这个最小的几何间隔就是支持向量到超平面的距离。
根据以上定义,SVM模型求解最大分割超平面的问题就可以表示为以下约束最优化问题:

将约束条件两边同时除以,得到

因为都是标量,上式可以简化为:

得到


因为最大化等价于最大化 ,也等价于最小化是为了使后面的求导形式简单,不影响结果,二阶导与抵消),故SVM模型求解最大分割超平面的问题又可以表示为分割超平面的问题,所以可以进一步表示为以下约束最优化问题:

约束条件为

这是一个含有不等式约束凸二次规划问题,可以对其使用拉格朗日乘子法 得到对偶问题(dual problem),此处不做推导。
至此都是基于训练集数据线性可分的假设下进行的,但是实际情况下几乎不存在完全线性可分的数据,为了解决这个问题,引入了**"软间隔"**的概念,即允许某些点不满足约束条件:

采用损失函数,将原优化问题改写为

约束条件为

其中,松弛变量,即一个损失函数 。每个样本都一个对应的松弛变量,++表示该样本不满足约束的程度++称为惩罚参数,C值越大,对分类的惩罚越大。与线性完全可分求解思路一样,这里需要先用拉格朗日乘子法得到拉格朗日函数,再求其对偶问题。

2.非线性SVM算法原理

在非线性的情况下,对于参数无法精准的估计,会对结果造成较大的影响及误差,在这里可以引入松弛因子,则二次凸优化问题可以变形为:

而相应的约束条件也发生变化:

根据实际情况可知,为正数,则需满足不敏感损失函数,其表达式为:

运用拉格朗日函数及对偶变量,则有:

其中,均大于0.

再通过**KKT(Karush-Kuhn-Tucker)**条件的运算得出:

并且有


对于输入空间中的非线性分类问题,可以通过非线性变换 将其++转换为不同维特征空间++ 中的++线性分类问题++,在高维特征空间中去学习一个线性支持向量机。由于在线性SVM学习的对偶问题里,目标函数和分类决策函数都只涉及实例和实例之间的内积,不需要显式的指定非线性变换,所以在非线性SVM学习的对偶问题里,可用核函数++替换当中的内积++ ,其中,核函数表示++通过一个非线性转换后的两个实例间的内积++ 。具体的,是一个函数,意味着存在一个从输入空间到特征空间的映射,对任意输入空间中的,有


在实际应用中,有以下常用的核函数:

  • 线性函数:
  • 多项式核函数:
  • 径向基核函数:
  • 拉普拉斯核函数:
  • Sigmoid核函数:
    综上所述,用核函数替代线性SVM学习的对偶问题中的内积,求解得到非线性SVM:

3.4.2 算法步骤

1.SVM的选用

  • 当++训练数据集线性可分++ 时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机
  • 当++训练数据集++ 近似线性可分时,通过软间隔最大化,学习一个线性分类器,即线性支持向量机。
  • 当训练数据集线性不可分时,通过使用核函数,将低维度的非线性问题转换为高维度下的线性问题,学习得到非线性支持向量机。

2.线性SVM算法

  1. 输入:训练数据集,其中,
  2. 输出:分离超平面和分类决策函数。
  3. 算法步骤。

3.非线性SVM算法

4.自编SMO(序列最小优化)算法的步骤

  1. 启发式方法选择
  2. 计算上界和下界
  3. 计算误差项
  4. 更新
  5. 更新
  6. 更新

3.4.3 实战(源码请见Github)

GitHub: HeShen-1/python-MachineLearning: 机器学习python实战(西唯兵版本)。代码仅供参考。

1.数据集

鸢尾花数据集。

2.sklearn实现

1.线性SVM 结果

2.非线性SVM 结果

3.自编代码实现

3.4.4 实验(源码请见Github)

GitHub: HeShen-1/python-MachineLearning: 机器学习python实战(西唯兵版本)。代码仅供参考。

1.实验目的

  1. 掌握SVM引入核函数的动机和核函数思想,会选用合适的核函数,对数据集进行分类。
  2. 理解软间隔和硬间隔,尤其是 KKT 条件的不同,并针对正则化系数 C 会进行参数调整和模型选择。
  3. 熟练使用 Python 以及 NumPy、Sklearn、Matplotlib 等第三方库。

2.实验数据

定义五个函数,分别为 linear()、nolinear()、gauss_linear()、gauss_nolinear()、circle(),并按要求生成不同分布的数据:

  1. 生成两组线性均匀分布的数据(完全线性可分)。
  2. 生成两组线性均匀分布的数据(线性不可分)。
  3. 生成两组高斯分布的数据(完全线性可分)。
  4. 生成两组高斯分布的数据(线性不可分)。
  5. 生成环状数据。

3.实验要求

使用线性 SVM 对实验数据(1)中生成的数据进行分类,并画出分类界面。

使用线性 SVM 对实验数据(2)中生成的数据进行分类,并画出分类界面。

分别使用 Linear 核、rbf 核、degree=2 的 poly 核和 degree=3 的poly核的 SVM对实验数据(3)中生成的数据进行分类,并画出分类界面。

分别使用 Linear 核、rbf 核、degree=2 的 poly 核和 degree=3 的poly核的 SVM 对实验数据(4)中生成的数据进行分类,并画出分类界面。

分别使用 rbf 核、degree=2,3,4 的 poly 核的 SVM 对实验数据(5)中生成的数据进行分类,并画出分类界面。

代码结果(部分):

实验1:

实验2:

实验3(部分):

实验4(部分):

实验5(部分):

相关推荐
亚力山大抵1 分钟前
实验四 增强型可靠文件传输系统
python
music score4 分钟前
Keysight万用表使用指南及基于Python采集数据生成Excel文件
开发语言·网络·python
lkx0978821 分钟前
今天python练习题
python
AI视觉网奇26 分钟前
TensorFlow 多卡训练 tf多卡训练
人工智能·python·tensorflow
Data 实验室29 分钟前
爬虫管理平台-最新版本发布
开发语言·爬虫·python·fastapi
那雨倾城1 小时前
PiscTrace针对YOLO深度适配:从v8到v12
图像处理·人工智能·python·opencv·yolo·计算机视觉·目标跟踪
hacker_lpy1 小时前
python全自动爬取m3u8网页视频(各类网站都通用)
开发语言·python·m3u8视频·视频爬虫
北上ing1 小时前
机器学习和深度学习的对比
人工智能·深度学习·机器学习
水煮蛋不加蛋1 小时前
从 Pretrain 到 Fine-tuning:大模型迁移学习的核心原理剖析
人工智能·机器学习·ai·大模型·llm·微调·迁移学习
love530love1 小时前
cuDNN 9.9.0 便捷安装-Windows
运维·windows·python