问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

支持向量机(SVM)算法详解:从基础概念到核技巧

创作时间:
作者:
@小白创作中心

支持向量机(SVM)算法详解:从基础概念到核技巧

引用
CSDN
1.
https://blog.csdn.net/miyajatelin/article/details/144129821

支持向量机(SVM)是一种广泛应用于分类和回归分析的监督学习模型。本文将详细介绍SVM算法的基本原理,包括硬间隔与软间隔、KKT条件、对偶性以及核技巧等内容。通过本文的学习,读者将能够全面了解SVM算法的核心概念及其在实际应用中的关键技巧。

一. 认识SVM算法

SVM是一个用于分类的算法,我们假设在一个坐标轴上有若干的数据,如下图:

我们用直线在坐标轴上划分,以此划分区域,将数据点分类,我们可以在图上看出,满足它的有三条直线来划分数据。那么,在此图中我们要做的就是确定一根最优直线来确定划分数据集的标准。在SVM里,目的是找到一根直线或者是一个平面,使得数据距离该边界最近的点之间能够距离最远。

二. 硬间隔与软间隔

1. 硬间隔

在SVM算法里有两种间隔,分别是硬间隔与软间隔。我们先来说说硬间隔,它仅适用于线性可分的数据集,数据可以被一条直线完全分开。硬间隔通过寻找唯一的最大间隔超平面来实现。这个最大间隔超平面通常是最优的,即它会最大化两个类别之间的距离。如图:

除此之外,最大间隔的上下平面被叫做正超平面与负超平面。

即函数:w1x1+w2x2+b=c(正超平面) 或者 w1x1+w2x2+b=-c(负超平面)

硬间隔的优化目标函数为:

其中:

  • w 是权重向量。
  • b是偏置项。
  • xi 是第 i个训练样本。
  • yi∈{−1,+1}yi ∈{−1,+1} 是第 i个训练样本的标签。
  • n 是训练样本的数量。

2. 软间隔

但是,基于实际情况来说,线性可分的数据集是非常有限的,这里我们引入软间隔的概念。软间隔允许一些点被错误分类,但是要尽可能地减少错误分类的数量。软间隔可以通过引入松弛变量来实现。松弛变量允许一些点被分错,并允许SVM算法忽略一些噪声和异常值。SVM算法试图最小化所有松弛变量的总和,以便找到一个最优的软间隔超平面。软间隔可以应用于更广泛的数据集,提高了SVM算法的鲁棒性。

原本硬间隔的需要满足的条件是:

在软间隔里,引入了松弛变量,它允许一些点被错误的分类,但是相应的会得到一些惩罚,这里的松弛变量表示为ξi,它需要满足的条件也变成了

其中 ξi≥0 是第i个样本的松弛变量。这意味着如果某个样本点违反了间隔条件,那么 ξi 会大于0,表示该点被允许在间隔边界内或错误的一侧。它的损失函数为:

软间隔SVM的优化目标函数为:

而这个目标函数的约束条件为:

st:

其中 C 是一个正则化参数,用于平衡间隔大小和分类错误的数量。较大的 C 值意味着对误分类的惩罚更大,较小的 C值意味着允许更多的误分类。

这里就有一个问题了,如何选择合适的C值?

  1. 交叉验证:其中的k折交叉验证,将数据集分成 K 个子集,每次使用 K-1 个子集作为训练集,剩下的一个子集作为验证集。重复这个过程 K 次,每次选取不同的验证集。对于每个 C值,计算 K 次验证结果的平均性能指标(如准确率、F1分数等),并选择性能最佳的 C 值。

  2. 网格搜索:定义一个 CC 的候选值范围,然后通过交叉验证的方式遍历所有可能的 CC 值组合,找到性能最好的那个。这通常与交叉验证结合使用,以确保所选参数的鲁棒性。

from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import accuracy_score

X, y = datasets.load_iris(return_X_y=True) # 加载数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 划分训练集和测试集

# 定义参数范围
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]}

# 创建SVM模型
svc = SVC(kernel='linear')

# 使用GridSearchCV寻找最佳参数
grid_search = GridSearchCV(svc, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("Best parameters: ", grid_search.best_params_)
print("Best cross-validation score: {:.2f}".format(grid_search.best_score_))

# 使用最佳参数训练模型
best_svc = grid_search.best_estimator_
y_pred = best_svc.predict(X_test)
print("Test set accuracy: {:.2f}".format(accuracy_score(y_test, y_pred)))

三. KKT(Karush-Kuhn-Tucker)与对偶性

1. KKT

KKT的条件包括:

  1. 原始可行性:所有约束必须被满足。
  2. 对偶可行性:拉格朗日乘子ai与bj必须非负。
  3. 互补松弛性:如果某个约束gi()<0,则对应的拉格朗日乘子ai=0;
    如果ai>0,则gi()= 0。
  4. 梯度条件:目标函数和约束函数的梯度的线性组合等于零。

只有当一个解满足这四个条件时,才能被认为是最优解。这些条件提供了在非线性规划问题中判断解优劣的准则,并提供了构造优化算法的理论基础。KKT条件在很多优化算法中被使用:

由于我们要最大化间隔L,

由此我们得到kkt条件,基于kkt条件我们就可以求解决策超平面。

2. SVM对偶性

我们的原问题是:

最优解:

,

.

四. 核技巧(Kernel Trick)

有些数据在低维层面无法可分,我们可以将数据映射到高维空间,在高维空间里,数据变得线性可分。那么如何做到,就要说到维度转换函数与核函数。

在这里举一个例子如图:

上图在二维空间里决策超平面无解,此时通过手段将原维度进行升维的操作,如下图:

该图表现了,在升维空间下,求解得到了决策超平面。而做到这样的方法有两种,1是使用维度转换函数,再将其点积。2是使用核函数Kernel Function。

接下来我们比较两种方法:

方法1:

(,)通过T变为,T()=(1,,,,,)

得T()T()=1+2+ + + +

我们再来看方法2:

K(,)=()的平方=1+2+ + + +

发现它们得到的结果一样。这里的核函数是多项式核函数。

1. 核函数

核函数可以看作是一个函数K(x, y),它接受两个输入x和y,并计算它们在高维空间中的内积。通过核函数,我们可以在不直接执行高维映射的情况下计算出高维特征空间中的点积。这极大的简洁了流程。

首先我们谈到多项式核函数:它的c非常的重要。

多项式核函数的一般形式是:

它是一个偏执项,调整核函数的灵敏度,它通常设置为非负值。通过引入c,即使两个输入向量x和y正交(即xTy=0),它们之间也能产生一定的相似性。

除了多项式核函数,还有高斯核函数(RBF)。高斯核函数的一般形式如下:

  • x 和 y 是输入样本点,通常表示为向量。
  • ∥x−y∥ 表示两个向量之间的欧几里得距离。
  • γ>0是一个参数,控制着核函数的影响范围或宽度。γ 的值越大,对应的核函数越“窄”,即对局部信息更加敏感;反之,γ 的值越小,则核函数越“宽”,更倾向于考虑全局的信息。

对于它的参数γ的选择,可以通过交叉验证来确定它。较大的 γ 值会导致模型更加复杂,因为它会使得每个训练样本对于决策边界的贡献区域变小,从而需要更多的支持向量来构建决策边界。这可能导致过拟合,特别是当训练数据中有噪声时。而较小的 γ 则会导致较简单的模型,因为单个样本的影响范围较大,可能会导致欠拟合,即模型过于简单而无法捕捉到数据中的细微模式。

2. 维度转换函数

在使用核技巧时,我们一般不会直接写出具体的维度转换公式。因为核函数允许我们在不实际进行高维映射的情况下计算出高维空间中的点积。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号