SVM Kernel学习笔记

SVM中的核函数是使其能处理非线性分类的关键,通过将数据从低维映射到高维以实现线性可分。虽然简单的理解是通过映射解决线性不可分问题,但更准确的描述是核函数以较低计算复杂度实现向量内积。常见的核函数包括多项式核和高斯核(RBF)。选择合适的核函数通常需要实验对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SVM是机器学习里应用最广泛的模型之一,而说起SVM大家一般都会提kernel,有叫kernel function也有叫kernel trick的。这是因为实际的应用中,没有kernel的SVM也就是一个线性分类器,与LR(logistic regression)没有本质的差别,就连目标函数都很相似。

线性分类器是指它的decision boundary是线性的,但训练数据并不一定能被线性区分开(linearly speratable),这种情况经常被描述为“线性模型的表达或拟合能力不够”。

注意:这里的线性是相对于特征空间本身的维度而言,比如2维空间对应1维直线,3维空间对应2维平面,n维对应(n-1)维的超平面。人的直观理解一般无法超过3维,所以一般的文章教材都用2维空间来讨论问题。

比如左下图的2维空间,两类数据点无法被线性(2维下就是直线)区分,这时候就需要kernel来救场了。kernel所带的解药是什么?最naive的理解是,把数据点从2维空间映射到3维或更高维的空间,这样就能线性区分开了,就如右下图所展示的。

这里写图片描述

顺便提一下:LR也有类似的trick,使得自身的线性模型能拟合非线性关系,那就是特征组合。因此,实际应用中,LR的特征维度会非常大,BAT这种级别的互联网公司,维度动不动搞到十亿甚至百亿维度,各种特征组合占到了主要部分。另外,其实kernel并不是SVM的专属,其也可以应用到LR上面的,这里就不作讨论了。

前文中提到kernel最naive理解是把特征空间从低维映射到高维从而线性可分。之所以说naive,是因为这种描述并不太全面,知乎上有很多大牛反驳了这样的说法。但是,作为初学者,我个人感觉这样的intuition最容易被人记住,抛开复杂的数学推导,用一句话来解释SVM kernel,从传播的角度看没毛病。

那么,为啥大牛们认为“低维到高维论”不全面呢,究竟怎么理解kernel?说实话,完整的数学推导现在我也没太搞明白,这里只是根据从其他大神那里吸收的一些皮毛简单解释下,也不一定对:

先给一个更可能被大牛们接受的SVM kernel描述:一种隐含特征空间映射、以更低计算复杂度实现向量内积运算的特殊函数。有点抽象对不对,隐含怎么理解,更低计算复杂度内积运算怎么理解?下面通过例子来解释:

考虑上文提到的2维空间图,要把每个数据点映射到3维空间,才有可能线性可分。而映射到了3维空间后,计算寻找最优SVM decision boundary的过程里需要计算任意两个向量的内积(注:为什么需要求向量内积属于SVM数学推导过程,这里省略)。

对于一个2维空间数据点v = (x, y),要把它映射到3维空间,其中一种映射关系是: p(x,y)=(x2,2xy,y2) p ( x , y ) = ( x 2 , 2 x y , y 2 ) 。假如有任意两个数据点: v1=(x1,y1),v2=(x2,y2) v 1 = ( x 1 , y 1 ) , v 2 = ( x 2 , y 2 ) ,我们可以直接计算它们对应向量的内积为:


<p(v1),p(v2)>=<(x21,2x1y1,y21),(x22,2x2y2,y22)> < p ( v 1 ) , p ( v 2 ) >=< ( x 1 2 , 2 x 1 y 1 , y 1 2 ) , ( x 2 2 , 2 x 2 y 2 , y 2 2 ) >

很明显,这是一个3维运算。假如3维还是无法线性区分,要映射到N维去,那这里就是N维运算,N越大计算量越大。有没有办法能够降低这个计算量呢?我们来展开推导一下:


<(x21,2x1y1,y21),(x22,2x2y2,y22)=x21x22+2x1x2y1y2+y21y22 < ( x 1 2 , 2 x 1 y 1 , y 1 2 ) , ( x 2 2 , 2 x 2 y 2 , y 2 2 ) = x 1 2 x 2 2 + 2 x 1 x 2 y 1 y 2 + y 1 2 y 2 2

=(x1x2+y1y2)2=(<v1,v2>)2 = ( x 1 x 2 + y 1 y 2 ) 2 = ( < v 1 , v 2 > ) 2

经过推导可以看到,两个数据点在映射后的向量内积等于映射前向量内积的平方。如果我们引入核函数: K(v1,v2)=(<v1,v2>)2 K ( v 1 , v 2 ) = ( < v 1 , v 2 > ) 2 ,那么就可以通过核函数的计算来等价于映射后的向量内积,实现了高维向量运算转换为低维向量计算(本例中是2维向量运算代替了3维向量运算)。

由此看出,即使没有kernel,只要找到映射关系,我们仍然可以实现低维空间映射到高维空间,进而通过高维向量内积运算来寻找最佳分割超平面。但是,kernel的引入,降低了向量内积运算的计算复杂度。无论我们映射到几维空间,我们只要把原有维度代入核函数,就能等价于高维上的内积运算。极端的情况下,特征空间映射到了无穷维度空间,如果没有核函数,根本无法计算出映射后的向量内积。

有没有kernel,低维都可以映射到高维,引入kernel只是计算量的差别而已,这就解释了为啥大牛们不同意kernel的“低维到高维论”了。

然而,到这里讨论并没有结束。想象一下,要把上文示例的SVM模型训练跑通,需要走两步:第一步,找低维到高维空间的映射关系;第二步,找到这种映射关系对应的kernel函数。仔细思考下,是不是发现哪不太对——低维在第一步映射到了高维,但在第二步又被转换为了原维度的运算。这意味着:

最终的模型训练计算过程,其实根本不需要显式地考虑高维是啥样子,只要kernel函数找好了,低维到高维的映射关系实际上被隐式的带出来了。你甚至不需要知道这个映射长啥样子,或者其干脆根本无法被描述出来。

现在,问题关键变成了,怎么去找合适的核函数,并不是任意的函数都能隐含低维到高维的映射关系吧?答案很简单,过往的巨人们已经帮你找好了,站在他们的肩膀上膜拜吧。

核函数有不少,最常用的是以下几个:
这里写图片描述

最后,为了让你相信这些核函数可以隐含低维到高维的映射关系,这里还是举例证明下:

  • 先来看多项式核,假设有 a = 1, c = 0, d = 2,那么多项式核可表示为: k(x,y)=(xTy)2=(<x,y>)2 k ( x , y ) = ( x T y ) 2 = ( < x , y > ) 2 ,这不就是上文最开始推导出的核函数吗,它对应的映射关系之前已经给出了。实际上,多项式核一定对应一个低维到高维的映射,高维的维度取决于参数d。

  • 再来看高斯核或RBF,根据泰特展开公式: ex= e x = ni=0xnn! ∑ i = 0 n x n n ! K(x,y) K ( x , y ) 可以近似展开为n维的多项式,n越大越近似,直至无穷大。而多项式核一定对应低维到高维的映射,只是这个映射已经无法描述了。

由此也看到,基于高斯核的情况下,2维可以被映射到无穷维度,如果没有核函数,已经不可能计算出那个空间的向量内积了。

最后,总结下理解SVM kernel的几个要点:

  • kernel使SVM模型具备了非线性的拟合能力,没有kernel的线性SVM与LR无本质差别

  • kernel简单描述成“把特征空间从低维映射到高维从而线性可分”是不全面的。kernel只是其充分条件,不是必要条件,没有kernel一样可以做到(无穷高维度除外),kernel只是降低了模型训练的计算量,具体点说是降低了向量内积运算的复杂度

  • 实际应用中,没有人去显式地寻找低维到高维的映射关系,而是先找kernel,由kernel隐式地带来映射,而且该映射有时甚至无法描述,也没必要关心

  • 在众多核函数中如何选择,有赖于选择不同函数、不同参数的不断实验对比,而高斯核貌似是很多人的默认选择

参考资料
https://www.zhihu.com/question/35602879/answer/63963315
https://www.zhihu.com/question/24627666/answer/310362701
http://mp.weixin.qq.com/s?__biz=MzIxNDIwMTk2OQ==&mid=2649077019&idx=1&sn=e0c4a6c502e3668e1dc410f21e531cfd&scene=0#wechat_redirect
http://blog.youkuaiyun.com/qq_27231343/article/details/51817866

### 关于支持向量机(SVM)在深度学习中的笔记和教程 #### 支持向量机简介 支持向量机(Support Vector Machine, SVM)是一种有监督的学习方法,在模式识别、分类以及回归分析方面有着广泛应用。作为一种强大的工具,SVM通过寻找最优超平面来实现数据集的有效划分[^1]。 #### 超平面的选择原则 对于给定的数据集,存在多种可能用于区分不同类别的超平面;然而,SVM特别之处在于它会选择那个能够使得最近的数据点到该平面的距离最大化的方案——即所谓的“最大间隔”。这种策略不仅有助于提高模型泛化能力,还能够在一定程度上防止过拟合现象的发生[^2]。 #### 核技巧的应用 当面对非线性可分的情况时,传统的线性SVM显然无法满足需求。此时引入了核函数的概念,允许我们将原始特征空间映射至更高维度的空间内,在那里原本复杂的边界条件可能会变得简单得多。常见的核函数包括多项式核、RBF径向基函数等,它们各自适用于不同类型的问题场景[^3]。 #### 实践案例展示 为了更好地理解如何利用Python库Scikit-Learn构建并训练一个简单的SVM分类器,请参阅如下代码片段: ```python from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC import matplotlib.pyplot as plt # 加载鸢尾花数据集 iris = datasets.load_iris() X = iris.data[:, [0, 2]] y = iris.target # 划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) scaler = StandardScaler().fit(X_train) X_train_std = scaler.transform(X_train) X_test_std = scaler.transform(X_test) svm_model = SVC(kernel='rbf', C=1.0, random_state=1) svm_model.fit(X_train_std, y_train) print('Test accuracy: %.3f' % svm_model.score(X_test_std, y_test)) ``` 此段程序展示了如何加载经典Iris数据集,并应用标准缩放处理后建立基于高斯核的支持向量机模型来进行多类别分类任务。最终输出的是模型在验证集上的预测精度得分[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值