「机器学习算法的数学解析与Python实现」支持向量机分类算法
2021/12/25 11:08:30
本文主要是介绍「机器学习算法的数学解析与Python实现」支持向量机分类算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
SVM:线性分类器的“王者”
支持向量机兼具形式优美和高效好用,受到学术界和工业界的一致好评。
支持向量机中的三个重要概念:
- 最大间隔
- 高维映射
- 核方法
距离是不同类别的天然间隔
在分类的时候,为了提高鲁棒性,我们需要给正负类两边都多留点空间,使得分割线距离两边都达到最大间隔。
何为“支持向量”
支持向量机(Support Vector Machine)中一个重要的概念叫“支持向量”,这也是该算法名字的由来。
“间隔”实际是通过两侧的样本点划分而成,这些样本点就是“支持向量”。
支持向量机的目标就是让间隔最大化。
间隔分为两种:
- 硬间隔:间隔的一边只有一类样本;
- 软间隔:间隔的一边允许存在少数的其他类别的样本;
从更高维度看“线性不可分”
在很多情况下,不同类别的数据是混杂在一起的,无法用线性加以区分,术语上称为“线性不可分”。对于线性不可分的情况,怎么用线性方法分割呢?SVM通过引入高维映射来解决这个问题。
数学上有一种解决新难题的思路:
- 将新问题转化为已经解决的旧问题;
- 通过老方法加以解决。
按照这个思路,我们要解决的问题就是,怎样将线性不可分变得线性可分,然后再按照老办法寻找最大间隔。
线性不可分只是在当前的维度下线性不可分,但如果增加了维度,原本不可分也就可分了。
经过高维映射后,二维分布的样本点变成了三维分布
SVM分类的算法原理
基本思路
1.最大间隔
SVM以“间隔”作为损失的度量,通过不断调整超平面,使得间隔最大化。实际是就是一种换了损失函数的线性方法。
“支持向量”,就是所有数据点中直接参与计算使得间隔最大化的几个数据点。
2.高维映射
通过增加维度,使得非线性分布出现了线性可分的差异,从而达到分离正负类的目的。
3.核函数
能够在SVM中完成高维映射功能的函数都称为核函数。不论哪种核函数,其最根本的目的就是完成高维映射,具体两项工作:
- 增加空间的维度;
- 完成对现有数据从原空间到高维空间的映射。
在一次SVM的学习过程中,需要首先设置好选择哪种数学函数作为核函数。
4.SVM的真正运行机制
真正的SVM由间隔最大化和高维映射两大部分组成,间隔最大化是目标,间隔作为度量分类效果的损失函数,高维映射用于解决线性不可分问题。
使用SVM进行分类经过三个步骤:
- 选取核函数;
- 使用核函数进行高维映射,数据点由原本的线性不可分变成线性可分;
- 间隔最大化,用间隔作为度量分类效果的损失函数,最终找到使得间隔最大化的超平面,分类也就完成了。
5.核技巧
SVM中涉及“核”的术语有三个,分别是核函数、核方法(Kernel Method)和核技巧(Kernel Trick)。
核技巧主要是提高核方法的计算效率。
数学解析
1.点到超平面的距离
SVM间隔的定义,就是作为支持向量的点到超平面的距离的和。
点到三维平面的距离为:
\[d = \frac{|Ax_0 + By_0 + Cz_0 + D|}{\sqrt{A^2+B^2+C^2}} \]点到N维超平面(\(wx^{(i)}+b\))的距离为:
\[\gamma^{(i)} = \frac{w^Tx^{(i)} + b}{\|w\|} \]2.间隔最大化
间隔距离表示为 \(\frac{2}{\|w\|}\) :
我们的目标是间隔最大化,2只是一个常数,所以间隔最大化可以表示如下:
\[\max \frac{1}{\|w\|} \quad s.t., y_i(w^Tx_i +b) \ge 1, \quad i=1,\cdots,n \]\(s.t.\) 表示subject to,意思是收到约束,即“在......的条件下”。
后面那些式子都看不懂,先不管
具体步骤
SVM分类算法信息表
使用SVM的三个步骤:
- 选择核函数。
- 核函数完成高维映射并计算间隔。
- 使用SMO等优化算法使得间隔最大化。
在Python中使用SVM分类算法
支持向量机算法族都在sklearn.svm
包中,其中不同的类只是在核函数上不同,以及用于解决不同的问题,包括分类问题、回归问题和无监督学习中的异常检测,具体为:
- LinearSVC类:基于线性核函数的支持向量机分类算法。
- LinearSVR类:基于线性核函数的支持向量机回归算法。
- SVC类:可选择多种核函数的支持向量机分类算法,通过“kernel”参数可以传入“linear”选择线性函数、传入“polynomial”选择多项式函数、传入“rbf”选择径向基函数、传入“sigmoid”选择Logistics函数作为核函数,以及设置“precomputed”使用预设核值矩阵。默认以径向基函数作为核函数。
- SVR类:可选择多种核函数的支持向量机回归算法。
- NuSVC类:与SVC类非常相似,但可通过参数“nu”设置支持向量的数量。
- NuSVR类:与SVR类非常相似,但可通过参数“nu”设置支持向量的数量。
- OneClassSVM类:用支持向量机算法解决无监督学习的异常点检测问题。
本章介绍的SVM分类算法可通过SVC
类实现,使用如下:
from sklearn.datasets import load_iris # 导入SVM算法 from sklearn.svm import SVC # 鸢尾花数据集 X, y = load_iris(return_X_y=True) # 训练模型 clf = SVC().fit(X, y) # 预测结果 clf.predict(X)
预测结果如下:
array([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, 2, 1, 1, 1, 1, 1, 2, 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])
性能得分如下:
0.9866666666666667
查看使用的核函数:
# 查看核函数 clf.kernel
默认为径向基rbf:
'rbf'
SVM分类算法的使用场景
分类采用“支持向量”,训练不需要使用全部数据,在小样本分类问题上有较好表现。原始的SVM使用间隔进行分类,因此只适合于二分类问题。
SVM分类算法特点
这篇关于「机器学习算法的数学解析与Python实现」支持向量机分类算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门