支持向量机原理(三)线性不可分支持向量机与核函数

简介:

1. 回顾多项式回归

    在线性回归原理小结中,我们讲到了如何将多项式回归转化为线性回归。

    比如一个只有两个特征的p次方多项式回归的模型:

hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x21+θ4x22+θ5x1x2hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x12+θ4x22+θ5x1x2

    我们令x0=1,x1=x1,x2=x2,x3=x21,x4=x22,x5=x1x2x0=1,x1=x1,x2=x2,x3=x12,x4=x22,x5=x1x2 ,这样我们就得到了下式:

hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x3+θ4x4+θ5x5hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x3+θ4x4+θ5x5

    可以发现,我们又重新回到了线性回归,这是一个五元线性回归,可以用线性回归的方法来完成算法。对于每个二元样本特征(x1,x2)(x1,x2),我们得到一个五元样本特征(1,x1,x2,x21,x22,x1x2)(1,x1,x2,x12,x22,x1x2),通过这个改进的五元样本特征,我们重新把不是线性回归的函数变回线性回归。

    也就是说,对于二维的不是线性的数据,我们将其映射到了五维以后,就变成了线性的数据。

    这给了我们启发,也就是说对于在低维线性不可分的数据,在映射到了高维以后,就变成线性可分的了。这个思想我们同样可以运用到SVM的线性不可分数据上。也就是说,对于SVM线性不可分的低维特征数据,我们可以将其映射到高维,就能线性可分,此时就可以运用前两篇的线性可分SVM的算法思想了。

2. 核函数的引入

    上一节我们讲到线性不可分的低维特征数据,我们可以将其映射到高维,就能线性可分。现在我们将它运用到我们的SVM的算法上。回顾线性可分SVM的优化目标函数:

minα12i=1,j=1mαiαjyiyjxixji=1mαimin⏟α12∑i=1,j=1mαiαjyiyjxi∙xj−∑i=1mαi
s.t.i=1mαiyi=0s.t.∑i=1mαiyi=0
0αiC0≤αi≤C

    注意到上式低维特征仅仅以内积xixjxi∙xj的形式出现,如果我们定义一个低维特征空间到高维特征空间的映射ϕϕ(比如上一节2维到5维的映射),将所有特征映射到一个更高的维度,让数据线性可分,我们就可以继续按前两篇的方法来优化目标函数,求出分离超平面和分类决策函数了。也就是说现在的SVM的优化目标函数变成:

minα12i=1,j=1mαiαjyiyjϕ(xi)ϕ(xj)i=1mαimin⏟α12∑i=1,j=1mαiαjyiyjϕ(xi)∙ϕ(xj)−∑i=1mαi
s.t.i=1mαiyi=0s.t.∑i=1mαiyi=0
0αiC0≤αi≤C

    可以看到,和线性可分SVM的优化目标函数的区别仅仅是将内积xixjxi∙xj替换为ϕ(xi)ϕ(xj)ϕ(xi)∙ϕ(xj)

    看起来似乎这样我们就已经完美解决了线性不可分SVM的问题了,但是事实是不是这样呢?我们看看,假如是一个2维特征的数据,我们可以将其映射到5维来做特征的内积,如果原始空间是三维,可以映射到到19维空间,似乎还可以处理。但是如果我们的低维特征是100个维度,1000个维度呢?那么我们要将其映射到超级高的维度来计算特征的内积。这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无从计算了。

    怎么办?似乎我们刚提出了一种好的解决线性不可分的办法,接着就把自己否决了。

    好吧,核函数该隆重出场了!

    假设ϕϕ是一个从低维的输入空间χχ(欧式空间的子集或者离散集合)到高维的希尔伯特空间的HH映射。那么如果存在函数K(x,z)K(x,z),对于任意x,zχx,z∈χ,都有:

K(x,z)=ϕ(xi)ϕ(xj)K(x,z)=ϕ(xi)∙ϕ(xj)

    那么我们就称K(x,z)K(x,z)为核函数。

     从上面的式子乍一看还是不明白核函数怎么帮我们解决线性不可分的问题的。仔细观察上式可以发现,K(x,z)K(x,z)的计算是在低维特征空间来计算的,它避免了在刚才我们提到了在高维维度空间计算内积的恐怖计算量。也就是说,我们可以好好享受在高维特征空间线性可分的红利,却避免了高维特征空间恐怖的内积计算量。

    至此,我们总结下线性不可分时核函数的引入过程:

    我们遇到线性不可分的样例时,常用做法是把样例特征映射到高维空间中去(如上一节的多项式回归)但是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到令人恐怖的。此时,核函数就体现出它的价值了,核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数好在它在低维上进行计算,而将实质上的分类效果(利用了内积)表现在了高维上,这样避免了直接在高维空间中的复杂计算,真正解决了SVM线性不可分的问题。

3. 核函数的介绍

    事实上,核函数的研究非常的早,要比SVM出现早得多,当然,将它引入SVM中是最近二十多年的事情。对于从低维到高维的映射,核函数不止一个。那么什么样的函数才可以当做核函数呢?这是一个有些复杂的数学问题。这里不多介绍。由于一般我们说的核函数都是正定核函数,这里我们直说明正定核函数的充分必要条件。一个函数要想成为正定核函数,必须满足他里面任何点的集合形成的Gram矩阵是半正定的。也就是说,对于任意的xiχi=1,2,3...mxi∈χ,i=1,2,3...mK(xi,xj)K(xi,xj)对应的Gram矩阵K=[K(xi,xj)]K=[K(xi,xj)] 是半正定矩阵,则K(x,z)K(x,z)是正定核函数。 

    从上面的定理看,它要求任意的集合都满足Gram矩阵半正定,所以自己去找一个核函数还是很难的,怎么办呢?还好牛人们已经帮我们找到了很多的核函数,而常用的核函数也仅仅只有那么几个。下面我们来看看常见的核函数, 选择这几个核函数介绍是因为scikit-learn中默认可选的就是下面几个核函数。

3.1 线性核函数

    线性核函数(Linear Kernel)其实就是我们前两篇的线性可分SVM,表达式为:

K(x,z)=xzK(x,z)=x∙z

    也就是说,线性可分SVM我们可以和线性不可分SVM归为一类,区别仅仅在于线性可分SVM用的是线性核函数。

3.2 多项式核函数

    多项式核函数(Polynomial Kernel)是线性不可分SVM常用的核函数之一,表达式为:

K(x,z)=γxz+r)dK(x,z)=(γx∙z+r)d

    其中,γ,r,dγ,r,d都需要自己调参定义。

3.3 高斯核函数

    高斯核函数(Gaussian Kernel),在SVM中也称为径向基核函数(Radial Basis Function,RBF),它是非线性分类SVM最主流的核函数。libsvm默认的核函数就是它。表达式为:

K(x,z)=exp(γ||xz||2)K(x,z)=exp(−γ||x−z||2)

    其中,γγ大于0,需要自己调参定义。

3.4 Sigmoid核函数

    Sigmoid核函数(Sigmoid Kernel)也是线性不可分SVM常用的核函数之一,表达式为:

K(x,z)=tanhγxz+r)K(x,z)=tanh(γx∙z+r)

    其中,γ,rγ,r都需要自己调参定义。

4. 分类SVM的算法小结

    引入了核函数后,我们的SVM算法才算是比较完整了。现在我们对分类SVM的算法过程做一个总结。不再区别是否线性可分。

    输入是m个样本(x1,y1),(x2,y2),...,(xm,ym),(x1,y1),(x2,y2),...,(xm,ym),,其中x为n维特征向量。y为二元输出,值为1,或者-1.

    输出是分离超平面的参数wbw∗和b∗和分类决策函数。

    算法过程如下:

    1)选择适当的核函数K(x,z)K(x,z)和一个惩罚系数C>0C>0, 构造约束优化问题

minα12i=1,j=1mαiαjyiyjK(xi,xj)i=1mαimin⏟α12∑i=1,j=1mαiαjyiyjK(xi,xj)−∑i=1mαi
s.t.i=1mαiyi=0s.t.∑i=1mαiyi=0
0αiC0≤αi≤C

    2)用SMO算法求出上式最小时对应的αα向量的值αα∗向量.

    3) 得到w=i=1mαiyiϕ(xi)w∗=∑i=1mαi∗yiϕ(xi),此处可以不直接显式的计算ww∗

    4) 找出所有的S个支持向量,即满足0<αs<C0<αs<C对应的样本(xs,ys)(xs,ys),通过 ys(i=1SαiyiK(xi,xs)+b)=1ys(∑i=1SαiyiK(xi,xs)+b)=1,计算出每个支持向量(xs,ys)(xs,ys)对应的bsbs∗,计算出这些bs=ysi=1SαiyiK(xi,xs)bs∗=ys−∑i=1SαiyiK(xi,xs). 所有的bsbs∗对应的平均值即为最终的b=1Si=1Sbsb∗=1S∑i=1Sbs∗

     这样最终的分类超平面为:i=1mαiyiK(x,xi)+b=0∑i=1mαi∗yiK(x,xi)+b∗=0,最终的分类决策函数为:f(x)=sign(i=1mαiyiK(x,xi)+b)f(x)=sign(∑i=1mαi∗yiK(x,xi)+b∗)

     

    至此,我们的分类SVM算是总结完毕,唯一的漏网之鱼是SMO算法,这个算法关系到,我们如何求出优化函数极小化时候的αα∗,进而求出w,bw,b,我们将在下一篇讨论这个问题。

 

本文转自刘建平Pinard博客园博客,原文链接:http://www.cnblogs.com/pinard/p/6103615.html,如需转载请自行联系原作者


相关文章
|
并行计算 安全 Java
C# .NET面试系列四:多线程
<h2>多线程 #### 1. 根据线程安全的相关知识,分析以下代码,当调用 test 方法时 i > 10 时是否会引起死锁? 并简要说明理由。 ```c# public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } ``` 在给定的代码中,不会发生死锁。死锁通常是由于两个或多个线程互相等待对方释放锁而无法继续执行的情况。在这个代码中,只有一个线程持有锁,且没有其他线程参与,因此不
832 3
|
存储 测试技术 分布式数据库
提升 Apache Hudi Upsert 性能的三个建议
提升 Apache Hudi Upsert 性能的三个建议
246 1
|
9月前
|
UED
产品经理-用户体验五要素 - AxureMost
《用户体验五要素》介绍了构建成功用户体验设计的五个层面:战略层、范围层、结构层、框架层和表现层。战略层明确产品目标与用户需求;范围层定义功能和内容需求;结构层规划交互与信息架构;框架层设计界面、导航和信息布局;表现层则通过视觉设计创造感知体验。每一层都依赖于其下一层,形成自下而上的连锁效应,确保各要素相互作用,共同实现用户体验目标。
|
存储 Shell 数据安全/隐私保护
minio一键安装脚本分享(shell和python)
minio一键安装脚本分享(shell和python)
482 0
|
存储 Java Spring
Spring Batch:让你的数据洪流化作涓涓细流,批量处理的魔法盛宴!
【8月更文挑战第31天】在现代软件开发中,批量处理对于金融交易、数据仓库加载等数据密集型应用至关重要。Spring Batch作为Spring生态的一部分,提供了一套全面的框架,支持事务管理、错误处理、日志记录等功能,帮助开发者高效构建可靠且可扩展的批处理应用。本文将深入探讨其核心概念、关键特性和实际应用,并通过示例代码展示如何配置作业、步骤及读取器、处理器和写入器,帮助读者更好地理解和应用Spring Batch。
354 1
|
SQL 存储 分布式计算
MaxCompute 入门:大数据处理的第一步
【8月更文第31天】在当今数字化转型的时代,企业和组织每天都在产生大量的数据。有效地管理和分析这些数据变得至关重要。阿里云的 MaxCompute(原名 ODPS)是一个用于处理海量数据的大规模分布式计算服务。它提供了强大的存储能力以及丰富的数据处理功能,让开发者能够快速构建数据仓库、实时报表系统、数据挖掘等应用。本文将介绍 MaxCompute 的基本概念、架构,并演示如何开始使用这一大数据处理平台。
1815 0
|
Web App开发 监控 安全
程序员私货:流氓软件的“诸神黄昏”
从刚开始接触电脑的小白,到如今在互联网上“叱咤风云”的老油条,应该都会遇见过这样的电脑软件,他们随意篡改默认程序,频繁推送恶意弹窗,甚至消耗大量内存,拖垮电脑系统,他们就是流氓软件。这种“流氓软件”常见的有哪些?一般程序员通常都怎么处理流氓软件?让我们一起来研究研究!
1045 1
程序员私货:流氓软件的“诸神黄昏”
带你读《2022技术人的百宝黑皮书》——我在淘宝做弹窗,2022 年初的回顾与展望(12)
带你读《2022技术人的百宝黑皮书》——我在淘宝做弹窗,2022 年初的回顾与展望(12)
204 0
|
消息中间件 负载均衡 算法
Spring Cloud Gateway 网关如何实现灰度发布?
Spring Cloud Gateway 网关如何实现灰度发布?
|
JavaScript
js基础中如何对数组进行冒泡,选择排序,如何获取数组中的最大最小值
js基础中如何对数组进行冒泡,选择排序,如何获取数组中的最大最小值
148 0
js基础中如何对数组进行冒泡,选择排序,如何获取数组中的最大最小值