【数模百科】支持向量机中的线性SVM讲解以及实现办法

2024-01-07 23:15:20

本篇文章来源于?线性SVM - 数模百科,里面有完整的关于支持向量机SVM模型的讲解,还有数据处理、应用、优缺点等重要知识点。

首先,强烈建议大家把我之前的文章读一遍。

一篇文章讲清楚凸优化问题-CSDN博客

快速理解对偶问题-CSDN博客

支持向量机SVM模型里的二元线性分类是什么-CSDN博客

支持向量机SVM中的核技巧(核函数)应该怎么理解-CSDN博客

读完之后,我们开始今天的内容。

你在一个屋子里举行了一个聚会,里面既有男孩也有女孩。现在你想把他们按性别分开,男孩站到屋子的一边,女孩站到另一边。你肯定会想,要是能在中间划条线把他们分开多好啊!这就像是支持向量机(SVM)的工作方式,它就像一个神奇的画家,能在人群中间画出一条界限。

但是,你不想让大家挨得太紧,每个人都需要有点私人空间对不对?所以,你不单单画一条细细的线,而是想画一条足够宽的间隔,就像是两条平行的线之间的空白区域。这样,男孩和女孩都能在这条宽宽的间隔两边自在地活动,而且不会互相干扰。

现在,如果有新的朋友加入聚会,他们可能会疑惑自己该站在哪一边。这时候,我们的神奇画家,也就是支持向量机,就会利用它之前画的宽间隔来帮助判断。如果新朋友站在间隔的这一侧,那他很可能是男孩;如果站在那一侧,她很可能是女孩。

所以,支持向量机就好比是个非常聪明的画家,它不仅帮我们把人群按照性别分组,而且当有新人加入时,也能利用已经划定的宽间隔来判断新来的是男孩还是女孩。这就是支持向量机的魅力所在,它能帮我们清晰地将事物分类,并为每个类别留下足够的空间,以便未来的分类也同样准确。

定义与详解

定义

线性支持向量机(Linear Support Vector Machine)是一种用于分类和回归分析的监督学习模型。在二分类中,线性支持向量机的主要目标是找出一个线性超平面,将不同类别的数据分隔开,而且要使得这个超平面到最近的数据点之间的距离(也被称为间隔)尽可能大。

最大化间隔

支持向量机(Support Vector Machine, SVM)的基本想法是寻找一个超平面(决策边界)来分类数据,而这个超平面的选择不仅需要正确地分类数据,还需要最大化其与最近样本点的距离,这就是所谓的最大化间隔(Margin)。

硬间隔

假设我们的数据集是线性可分的,也就是说,存在至少一个超平面可以完全正确地将两类数据分开。在这种情况下,我们可以找到不只一个,而是很多这样的超平面。那么哪一个超平面是最好的呢?直观上,我们会认为最好的超平面是那个与最近的数据点(不管是正类还是负类)保持最大间隔的那个。这个间隔就好比是一条没有数据点的“安全带”。

为了找到这个最大间隔超平面,我们首先定义两个平行的辅助超平面,它们分别穿过最靠近决策边界的正类和负类样本点,这些点叫做支持向量。这两个辅助超平面可以用以下的数学公式表示:

\vec{w} \cdot \vec{x} - b = 1 \quad \text{and} \quad \vec{w} \cdot \vec{x} - b = -1.

这里的 \vec{w} 是一个向量,它垂直于我们的超平面,而 b 是一个标量,它影响超平面的偏置。通过简单的几何推导,我们可以得出这两个超平面之间的距离是\frac{2}{\|\vec{w}\|},其中\|\vec{w}\| 表示向量 \vec{w} 的长度(或者说是范数)。为了最大化超平面之间的距离,我们需要最小化 \|\vec{w}\|

然而,我们还得确保所有的样本点都被正确分类,也就是说,正类样本点应该在 \vec{w} \cdot \vec{x} - b = 1 这个超平面的一侧,而负类样本点在另一侧。用数学语言来表达,如果样本点 \vec{x}_i 属于正类(y_i = 1),我们需要:

\vec{w} \cdot \vec{x}_i - b \geq 1,

如果样本点属于负类(y_i = -1),我们需要:

\vec{w} \cdot \vec{x}_i - b \leq -1.

这两种情况可以合并成一个不等式:

y_i (\vec{w} \cdot \vec{x}_i - b) \geq 1 \quad , \quad i = 1, 2, ..., n.

现在,我们的目标就变成了在保证上述不等式成立的情况下,最小化 \|\vec{w}\|。这个优化问题的解决方案将给我们最大间隔超平面的具体参数 \vec{w} 和 b。

最终,我们的分类器函数可以用以下公式定义:

f(\vec{x}) = \text{sgn}(\vec{w} \cdot \vec{x} - b),

其中 \text{sgn}是符号函数,它根据输入的符号返回 1 或者 -1。简而言之,根据超平面的方程,我们可以预测任何新的样本点 \vec{x} 的类别。

值得一提的是,最大间隔超平面完全由支持向量决定,这些是最靠近决策边界的样本点。我们的超平面会尽可能地远离这些点,以确保有最大的间隔,这就是为什么它被称为“硬间隔”。在实际应用中,如果数据不是完全线性可分的,我们可能需要使用所谓的“软间隔”方法来允许一些分类错误,但这已经超出了硬间隔的范畴。

软间隔

硬间隔SVM适用于那些数据完全线性可分的情况,它严格要求所有的样本点都要正确分类,没有一个是被分类错误的。但现实世界中的数据往往不是那么完美,可能会有噪声,或者数据本身就不是完全线性可分的。这时候,硬间隔SVM就力不从心了,因为它不能处理分类错误的情况。为了解决这个问题,我们引入了软间隔SVM。

软间隔SVM的核心思想是容忍一些样本点被分类错误,以便在大多数样本点上得到一个较好的分类效果。为了实现这个目标,我们引入了一种称为合页损失函数的损失函数,用来量化分类错误的程度。

合页损失函数的数学表达式如下:

\max(0, 1 - y_{i}(\vec{w} \cdot \vec{x_{i}} - b)).

这里,\vec{w} 是我们要找的决策边界的权重向量, b 是偏置项, y_{i} 是第 i 个样本点的真实标签(+1 或 -1), \vec{x_{i}} 是第 i 个样本点的特征向量。

如果一个样本点 \vec{x_{i}} 正确分类了,也就是说,它位于决策边界的正确一侧,那么它的合页损失函数值将为零。如果它被错误分类,那么损失函数值将随着它距离边界的距离增加而增加。

我们的目标是找到一个权重向量 \vec{w} 和偏置项 b ,使得下面的目标函数最小化:

\left[\frac{1}{n}\sum_{i=1}^{n}\max(0, 1 - y_{i}(\vec{w} \cdot \vec{x_{i}} - b))\right] + \lambda \lVert \vec{w} \rVert^{2},

其中,第一项是平均合页损失,也就是平均错误程度的量化;第二项是权重向量的平方范数,用于控制模型的复杂度,避免过拟合。参数 \lambda 是一个正则化参数,它用于平衡间隔大小和分类错误之间的权衡。

通过调整 \lambda ,我们可以在保证大部分样本正确分类的同时,允许一些样本分类错误。当 \lambda 足够小,如果数据是线性可分的,软间隔SVM和硬间隔SVM的表现是相似的。但如果数据不是线性可分的,软间隔SVM仍然能够通过容忍一些错误来找到一个有效的分类规则。这就是软间隔SVM的主要优势所在。

代码

from sklearn import svm
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np

# 创建 40个分隔的数据点
X, y = make_blobs(n_samples=40, centers=2, random_state=20)

# 拟合模型,不要规整化参数C设置为较高的值
clf = svm.SVC(kernel='linear', C=1000)
clf.fit(X, y)

# 绘制图像
# 详见数模百科

plt.show()

输出结果:

线性SVM的优缺点

优点:

  • 可以解决小样本下机器学习问题,对于二分类问题适合应用。

  • 可以解决高维问题,处理非线性特征的相互作用,无需依赖整个数据

  • 无局部极小值问题(相对于神经网络等算法)

  • 可以提高泛化能力

缺点:

  • 对大规模训练样本难以实施。

  • 对缺失数据敏感,噪声太多的数据会影响性能。

  • 多分类问题需要更加复杂的构造及训练方式。

本篇文章来自于 数模百科 ——?线性SVM - 数模百科

数模百科是一个由一群数模爱好者搭建的数学建模知识平台。我们想让大家只通过一个网站,就能解决自己在数学建模上的难题,把搜索和筛选的时间节省下来,投入到真正的学习当中。

我们团队目前正在努力为大家创建最好的信息集合,从用最简单易懂的话语和生动形象的例子帮助大家理解模型,到用科学严谨的语言讲解模型原理,再到提供参考代码。我们努力为数学建模的学习者和参赛者提供一站式学习平台,目前网站已上线,期待大家的反馈。

如果你想和我们的团队成员进行更深入的学习和交流,你可以通过公众号数模百科找到我们,我们会在这里发布更多资讯,也欢迎你来找我们唠嗑。

文章来源:https://blog.csdn.net/weixin_62457573/article/details/135423640
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。