python核函数是什么的简单介绍
机器学习有很多关于核函数的说法,什么是核函数?核函数的作用是什么
核函数一般是为了解决维度过高导致的计算能力不足的缺陷,实质就是特征向量内积的平方。
成都创新互联于2013年开始,先为资源等服务建站,资源等地企业,进行企业商务咨询服务。为资源企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
为什么会提出核函数:
一般我们在解决一般的分类或者回归问题的时候,给出的那个数据可能在低维空间并不线性可分,但是我们选用的模型却是在特征空间中构造超平面,从而进行分类,如果在低维空间中直接使用模型,很明显,效果必然会大打折扣。
但是!如果我们能够将低纬空间的特征向量映射到高维空间,那么这些映射后的特征线性可分的可能性更大【记住这里只能说是可能性更大,并不能保证映射过去一定线性可分】,由此我们可以构造映射函数,但问题随之而来了,维度扩大,那么随之而言的计算成本就增加了,模型效果好了,但是可用性降低,那也是不行的。
于是有人提出了核函数的概念,可以在低维空间进行高维度映射过后的计算,使得计算花销大为降低,由此,使得映射函数成为了可能。举个简单的例子吧,假设我们的原始样本特征维度为2,将其映射到三维空间,随便假设我们的映射函数为f(x1,x2) = (x1^2, x2^2, 2*x1*x2),那么在三维空间中,样本线性可分更大,但是向量内积的计算开销从4提高到9【如果从10维映射到1000维,那么计算花销就提高了10000倍,而实际情况下,特征维度几万上百万十分常见】,再看对于样本n1=(a1,a2),n2=(b1,b2),映射到三维空间之后,两者的内积I1为:a1^2 * b1^2 + a2^2 * b2^2 + 4 * a1 * a2 * b1 * b2,此时,又有,n1,n2在二维空间中的内积为:a1b1 + a2b2,平方之后为I2:a1^2 * b1^2 + a2^2 * b2^2 + 4 * a1 * a2 * b1 * b2,此时 I1 和 I2 是不是很相似,只要我们将f(x1,x2)调整为: (x1^2, x2^2, 根号(2*x1*x2) ) ,那么此时就有I1 = I2,也就是说,映射到三维空间里的内积,可以通过二维空间的内积的平方进行计算! 个人博客: 里有关于svm核函数的描述~
实际上核函数还是挺难找的,目前常用的有多项式核,高斯核,还有线性核。
希望能帮到你,也希望有更好的想法,在下面分享下哈。
支持向量机—从推导到python手写
笔者比较懒能截图的地方都截图了。
支持向量机分为三类:
(1)线性可分支持向量机,样本线性可分,可通过硬间隔最大化训练一个分类器。
(2)线性支持向量机,样本基本线性可分,可通过软间隔最大化训练一个分类器。
(3)非线性支持向量机,样本线性不可分,可通过核函数和软间隔最大化训练一个分类器。
上面最不好理解的恐怕就是硬间隔和软间隔了,
说白了硬间隔就是说存在这么一个平面,可以把样本完全正确无误的分开,当然这是一种极理想的情况,现实中不存在,所以就有了软间隔。
软间隔说的是,不存在一个平面可以把样本完全正确无误的分开,因此呢允许一些样本被分错,怎么做呢就是加入松弛变量,因为希望分错的样本越小越好,因此松弛变量也有约束条件。加入松弛变量后,问题就变为线性可分了,因为是每一个样本都线性可分,因此松弛变量是针对样本的,每一个样本都对应一个不同的松弛变量。
其实感知机说白了就是找到一条直线把样本点分开,就是上方都是一类,下方是另一类。当然完全分开是好事,往往是不能完全分开的,因此就存在一个损失函数,就是误分类点到这个平面的距离最短:
这里啰嗦一句,误分类点y*(wx+b)0,所以加个负号在前边。
一般情况下||w||都是可以缩放,那么我们把它缩放到1,最后的目标函数就变成了
间隔就是距离,我们假设分离超平面为 ,那么样本点到这个平面的距离可以记为 。我们都知道通过感知机划分的点,超平面上方的点 ,下方的点 ,然后通过判断 的值与y的符号是否一致来判断分类是否正确。根据这个思路函数间隔定义为:
支持向量的定义来源于几何间隔,几何间隔最直接的解释是离分隔超平面最近点的距离,其他任何点到平面的距离都大于这个值,所以几何间隔就是支持向量。然后呢同样道理,w和b是可以缩放的,所以定义支持向量满足如下条件:
再通俗一点说,支持向量是一些点,这些点到分隔平面的距离最近,为了便于表示,把他们进行一下缩放计算,让他们满足了wx+b=+-1.
核函数是支持向量机的核心概念之一,它存在的目的就是将维度转换之后的计算简化,达到减少计算量的目的。我们都知道支持向量机求的是间距最大化,通常情况下我们求得的alpha都等于0,因此支持向量决定了间距最大化程度。
核函数的形式是这样的
其中x(i)和x(j)都是向量,他们两个相乘就是向量内积,相乘得到一个数。刚才说了目标函数一般只和支持向量有关,因此在做核函数计算之前,实际就是选择的支持向量进行计算。
这个写完下面得再补充
我们知道了支持向量的概念,那么支持向量机的目标函数是要使这两个支持向量之间的距离尽可能的远,因为这样才能更好地把样本点分开,当然支持向量也要满足最基本的约束条件,那就是分类正确,还有就是其他点到分隔平面的距离要大于等于支持向量到分隔平面的距离。
这种凸优化问题都可以通过拉格朗日算子进行优化,就是把约束条件通过拉格朗日系数放到目标函数上。这部分基础知识,就是拉格朗日算法可以将等式约束和不等式约束都加到目标函数上,完成求解问题的转换,但是要满足一些约束条件,也就是我们后边要说的kkt条件。
这里有个细节就是转换时候的加减号问题,这个和目标函数还有约束的正负号有关。一般这么理解,就是求最小化问题时候,如果约束是大于0的,那么拉个朗日算子可以减到这一部分,这样一来目标函数只能越来越小,最优解就是约束为0的时候,这个时候和没有约束的等价,再求最小就是原问题了。
这里是最小化问题,直接减掉这部分约束,然后后半部分永远大于等于0所以这个式子的值是要小于原来目标函数值的。我们知道当x满足原问题的约束条件的时候,最大化L就等于那个原目标函数。所以我们可以把这个问题转化为:
把它带回去原来的目标函数中,整理一下。
这个时候只要求最优的α,就可以求出w和b了。我们上边做了那么一堆转换,这个过程要满足一个叫做kkt条件的东西,其实这个东西就是把一堆约束条件整理到一起。
(1)原有问题的可行性,即h(x )=0,g(x )0
放到这里就是:
SMO算法的核心思想是求出最优化的α,然后根据之前推导得到的w,b,α之间的关系计算得到w和b,最后的计算公式是:
现在的问题就是怎么求α了。
SMO算法总共分两部分,一部分是求解两个α的二次规划算法,另一部分是选择两个α的启发式算法。
先说这个选择α的启发式算法部分:大神可以证明优先优化违反kkt条件的α可以最快获得最优解,至于咋证明的,就先不看了。
在讲支持向量机的求解算法时候,直接给出了核函数K,那么怎么去理解核函数呢。核函数的作用是解决样本点在高维空间的内积运算问题,怎么理解呢,通常的分类问题都是有很多个特征的,然后为了达到现线性可分,又会从低维映射到高维,样本量再一多计算量非常大,因此先通过函数进行一个转换,减少乘法的计算量。
要理解核函数,先理解内积运算,内积运算实际是两个向量,对应位置相乘加和,比如我有x1 = [v1,v2], x2=[w1,w2],那么x1和x2的内积计算方法就是:v1w1+v2w2。
如果上面那种情况线性不可分,需要到高维进行映射,让数据变得线性可分,然后数据变为五维的,即v1 2+v2 2+v1+v2+v1v2,然后再进行一次内积计算,数据变为 。
稍作变换,可以变为 ,形式展开和上边那个长式子差不多,然后其实可以映射内积相乘的情况,所以可以进行核函数的变化。
问题在于,当你需要显式的写出来映射形式的时候,在维度很高的时候,需要计算的量太大,比如x1有三个维度,再进行映射就有19维度了,计算很复杂。如果用核函数,还是在原来低维度进行运算,既有相似的效果(映射到高维),又低运算量,这就是核函数的作用了。
核函数的种类:
这部分的核心在于SMO算法的编写。有待补充。
核函数的定义和作用是什么?
核函数的作用就是隐含着一个从低维空间到高维空间的映射,而这个映射可以把低维空间中线性不可分的两类点变成线性可分的。当然,我举的这个具体例子强烈地依赖于数据在原始空间中的位置。事实中使用的核函数往往比这个例子复杂得多。它们对应的映射并不一定能够显式地表达出来;它们映射到的高维空间的维数也比我举的例子(三维)高得多,甚至是无穷维的。这样,就可以期待原来并不线性可分的两类点变成线性可分的了。核函数要满足的条件称为Mercer's condition。由于我以应用SVM为主,对它的理论并不很了解,就不阐述什么了。使用SVM的很多人甚至都不知道这个条件,也不关心它;有些不满足该条件的函数也被拿来当核函数用。
新闻标题:python核函数是什么的简单介绍
标题路径:http://pwwzsj.com/article/docjhhe.html