算法系列——有监督学习——5.支持向量机(核方法)

一、概述

在深度学习出现之前,使用了核方法的支持向量机非常受欢迎。

通过在支持向量机中引入核方法(kernel methods)这个技巧,那些无法人力标注特征值的复杂数据也能被处理。当然,这个算法现在也用于解决各种分类和回归问题。

本文介绍通过在支持向量机中引入核方法,使模型可以学习复杂的决策边界的做法。这里以分类为例进行介绍,但是对于回归问题,同样可以使用核方法。线性支持向量机通过最大化间隔,可以得到尽可能远离数据的"好的"决策边界。但是由于决策边界必定为直线,所以它很难对如图所示的"每个标签的边界为曲线的数据"进行分类。

以某个点为中心分布的数据:

为了分隔如图所示的数据,模型需要学习曲线的线性决策边界。**支持向量机可以使用核方法学习复杂的决策边界。**例如,对这次的数据使用核方法,模型可以学到如图所示的圆形的决策边界。

二、算法说明

核方法的一个常见解释是"将数据移动到另一个特征空间,然后进行线性回归"。

对于这个解释,我们再详细地看一下。首先,思考一下如何使线性不可分数据成为线性可分数据。假设有一个比训练数据更高维的空间,训练数据中的每一个点都对应着这个高维空间中的一个点。在这个高维空间中,训练数据对应的点是可以线性分离的,实际的训练数据是来自于该高维空间的投影。 一旦有了这样的空间,模型就可以在高维空间中使用支持向量机来学习决策边界。最后,将高维空间的决策边界投影到由原始特征形成的向量空间上,得到决策边界。

如图所示为在高维空间中对数据进行线性分离的情形,该数据原本是线性不可分的。

虽然构建线性分离的高维空间非常困难,但通过一个叫作核函数的函数,核方法就可以使用在高维空间中学习到的决策边界,而无须构建具体的线性分离的高维空间。

三、示例代码

下面通过示例代码来看一下使用核方法的支持向量机如何学习呈圆形分布的数据的决策边界。

先生成呈圆形分布的数据,将其拆分为训练数据和验证数据,使用训练数据训练模型,使用验证

数据评估正确率。代码中没有明确指定使用哪个核方法,这是因为代码默认使用RBF(Radial Basis Function,径向基函数)核方法。

复制代码
from sklearn.svm import SVC
from sklearn.datasets import make_gaussian_quantiles  # 生成非线性可分的高斯分布数据。
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 生成300个样本,分为两类。数据通过分位数划分,形成非线性可分结构(如同心圆或交叉分布)
X, y = make_gaussian_quantiles(n_features=2, n_classes=2, n_samples=300)
# 划分数据 30%数据作为测试集(90个样本)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = SVC()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(accuracy_score(y_pred, y_test))

四、详细说明

学习结果因核函数而异核方法中可以使用的核函数多种多样。使用不同的核函数,得到的决策边界的形状也不同。如图所示为使用具有代表性的核函数在相同的数据上训练支持向量机的结果,这些核函数分别是线性核函数、Sigmoid核函数、多项式核函数和RBF核函数。

图a中的线性核函数等价于线性支持向量机。图b中使用Sigmoid函数作为核函数。从图中可以看出,通过改变核函数,模型学习到了曲线的决策边界。另外,图c中的多项式核函数(二次)学习到了圆形的决策边界。从图d中可以看到RBF核函数是如何学习更复杂的决策边界的。

五、注意点

使用核方法后,我们就无法清楚地知道支持向量机使用的是什么特征了。在将RBF作为核函数,并将RBF核函数的超参数γ设置为3.0时,模型学习的结果如图所示。通过增加这个超参数的值,模型会从数据中学习更复杂的决策边界。

图中的模型学习的是一个复杂的决策边界,但我们已经不知道模型使用的是什么特征了。核方法适合用于"相比特征的可解释性更看重精度"的场景。 还需要注意的是,得到的决策边界不一定是通过示例代码学习到的那种一目了然的决策边界。由于这些特点,在使用支持向量机时,不宜立即使用非线性核函数,在此之前,应先使用线性核函数进行分析,以了解数据。

相关推荐
哦豁灬40 分钟前
CUDA 学习(2)——CUDA 介绍
学习·cuda
却道天凉_好个秋1 小时前
音视频学习(三十):fmp4
学习·音视频·fmp4
做一个码农都是奢望1 小时前
MATLAB+Arduino控制小车直行+转向
学习·计算机控制系统
小楠小楠小楠1 小时前
Leetcode-动态规划
算法·leetcode·动态规划
Aurora_wmroy1 小时前
算法竞赛备赛——【数据结构】栈&单调栈
数据结构·c++·算法·蓝桥杯
CodeJourney.1 小时前
文献检索与下指南
数据库·人工智能·python·算法
娇娇yyyyyy2 小时前
2953. 统计完全子字符串(将题目中给的信息进行分组循环)
算法
背水2 小时前
Enhancing Zero-shot Text-to-Speech Synthesis with Human Feedback论文学习
人工智能·学习·多模态·tts
空雲.2 小时前
ABC 369
数据结构·c++·算法
maomi_95262 小时前
C语言操作符
c语言·学习