机器学习算法之支持向量机

                                支持向量机——SVM

优缺点:

(1)非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;
(2)对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;
(3)支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量;
(4)SVM 是一种有坚实理论基础的新颖的小样本学习方法。
它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。
从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,
大大简化了通常的分类和回归等问题;
(5)SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,
而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
(6)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,
而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。
这种“鲁棒”性主要体现在:
①增、删非支持向量样本对模型没有影响;
②支持向量样本集具有一定的鲁棒性;
③有些成功的应用中,SVM 方法对核的选取不敏感

两个不足:
(1) SVM算法对大规模训练样本难以实施,由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算,将耗费大量的机器内存和运算时间。

 

支持向量机分类:

  (1)线性可分支持向量机。当训练集线性可分的时候,通过硬间隔最大化,学习一个线性的分类器,即线性可分支持向量机。又称为硬间隔支持向量机。

  (2)线性近似可分支持向量机。当训练集近似线性可分的时候,通过软间隔最大化,也学习一个线性的分类器,即线性支持向量机。又称为软间隔支持向量机。

  (3)非线性支持向量机。当训练集线性不可分的时候,通过核技巧以及软间隔最大化,学习非线性支持向量机。

(1)线性可分支持向量机 

  给定线性可分训练集,通过硬间隔最大化或者等价的求相应的凸二次规划问题学习得到的分离超平面。

  分离超平面为: w.x+b=0.

推导过程:

(转载于支持向量机)一般来说,一个样本点距离分离超平面的远近可以表示分类预测的准确程度。如果分类正确,那么yi(w.xi+b)>0。所以可以用yi(w.xi+b)表示分类的正确性与确信度。这就是函数间隔的概念。

  函数间隔:

   样本点的函数间隔: Di= yi(w.xi+b)

   训练集的函数间隔:定义为最小的函数间隔。

            D= min Di=  min yi(w.xi+b)

  可以用函数间隔表示分类的正确性与确信度,但是选择分离超平面时,只有函数间隔是不够的。比如成比例的改变w和b,超平面没有变,但是函数间隔却变成了原来的2倍。于是引入了几何间隔。

  样本点的几何间隔为 Mi= yi(w.xi+b)/||W||.即对W做了一个限制。

  训练数据集的几何间隔:定义为最小的几何间隔。

                   M= min Mi = min yi(w.xi+b)/||W||

   支持向量机学习的基本想法是求解能够正确划分训练数据集并且集合间隔最大的分离超平面。对线性可分的训练集而言,线性可分的分离超平面有无数多条,但是几何间隔最大的分离超平面是唯一的。

  间隔最大化的直观解释就是:对训练数据集找到集合间隔最大的超平面意味着以充分大的确信度对训练数据进行分类。也就是说,不仅将正负实例点分开,而且对最难分的实例点(离超平面最近的的点)也有足够大的确信度将其分开。

  即离超平面最近的点是最难分的点,反映了整个分类学习器的性能。

  最大间隔分离超平面:

     Max  M

     St:yi(w.xi+b)/||W||>=M   i=1,2,….N

  即我们希望最大化几何间隔M,约束条件表示每个样本点的集合间隔都至少是M。

  考虑到几何间隔和函数间隔的关系,这个问题可以改写成:

     Max D/||W||

    St  yi(w.xi+b)>=D  i=1,2,….N

   函数间隔D的取值并不会影响最优化问题的解,事实上,将w和b等比例的改变,对目标函数的优化没有任何影响。这样可以去D=1,那么目标函数变成了1/||W||。同时 1/||W||与1/2||W||^2是等价的。

  即此时目标函数变成(后面涉及公式,都是在word中弄好了,截图上来):

        

 

   这是一个凸二次规划问题。

   线性可分训练数据集的最大间隔分离超平面是存在且唯一的。

      

  上述原始问题是标准的QP问题,除了QP现成的解法之外,还可以应用拉格朗日对偶性,通过求解对偶问题得到原始问题的最优解。引入对偶问题的好处:

  (1)    对偶问题往往更容易求解

  (2)    自然引入核函数,进而推广到非线性分类问题。

 

  首先构建拉格朗日函数,将不等式约束加入到目标函数之中。

 

 

   这就是原始问题。

  根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题。

 

  通过对偶变换,我们将求解顺序做了一个变换。首先对w,b求导,并令其等于0,最后整理得到对偶问题为:

St  

 

        

  以上推导的是对偶问题,跟原始问题有啥关系呢?

  在最优化中,如果满足KKT条件,那么原始问题和对偶问题的最优值相等。

 

(2)线性近似可分支持向量机,即软间隔支持向量机

  训练集数据并不总是线性可分的,通常情况下,训练集数据有一些异常点,将这些异常点去掉之后,剩下的大部分样本组成的集合是线性可分的。

  线性不可分意味着某些样本点不满足函数间隔大于等于1的约束条件。为了解决这个问题,可以对每个样本点引入一个松弛变量。使得函数间隔加上松弛变量之后大于等于1.这样约束条件变成:

 

  同时每个松弛变量,都要支付一个代价,目标函数由原来的,变成了

   

 

支持向量机损失函数

  对于线性支持向量机而言,其模型为分离超平面 w*x+b=0, 以及决策函数 f(x)=sign(w*x+b),学习的策略为软间隔最大化,学习算法为凸二次规划。

但是我们又可从另外一个角度去理解模型,即最小化目标函数:

其中,第一项为经验损失,第二项为正则项。由我们的hinge损失可以发现,当样本被正确分类且函数间隔y(w*x+b)大于1,损失为0,否则为 1-y(w*x+b) 可以证明,上述最优化问题与原始最优化问题等价。

 

参数影响

  对于线性近似可分支持向量机,存在惩罚参数C,它可以调节松弛变量与间隔。当C值越大时,对分类误差的惩罚越大,当C值越小,对分类误差的惩罚越小。

 

核函数

为了解决非线性问题,需要引入核函数对自变量进行变换,通常采用核技巧。

设χ是输入空间(欧氏空间或离散集合),Η为特征空间(希尔伯特空间),如果存在一个从χ到Η的映射 

φ(x): χ→Η

使得对所有的x,z∈χ,函数Κ(x,z)=φ(x)∙φ(z), 则称Κ(x,z)为核函数,φ(x)为映射函数,φ(x)∙φ(z)为x,z映射到特征空间上的内积。

由于映射函数十分复杂难以计算,在实际中,通常都是使用核函数来求解内积,计算复杂度并没有增加,映射函数仅仅作为一种逻辑映射,表征着输入空间到特征空间的映射关系。至于为什么需要映射后的特征而不是最初的特征来参与计算,为了更好地拟合是其中一个原因,另外的一个重要原因是样例可能存在线性不可分的情况,而将特征映射到高维空间后,往往就可分了

1 线性核函数

线性内核是最简单的内核函数。 它由内积<x,y>加上可选的常数c给出。 使用线性内核的内核算法通常等于它们的非内核对应物,即具有线性内核的KPCA与标准PCA相同。

表达式 :

2 多项式核函数

多项式核是非固定内核。 多项式内核非常适合于所有训练数据都归一化的问题。

表达式:k(x,y)=(αx T y + c)d

可调参数是斜率α,常数项c和多项式度d。

3 高斯核函数

高斯核是径向基函数核的一个例子。

或者,它也可以使用来实现

可调参数sigma在内核的性能中起着主要作用,并且应该仔细地调整到手头的问题。 如果过高估计,指数将几乎呈线性,高维投影将开始失去其非线性功率。 另一方面,如果低估,该函数将缺乏正则化,并且决策边界将对训练数据中的噪声高度敏感。

 4 指数的内核

指数核与高斯核密切相关,只有正态的平方被忽略。 它也是一个径向基函数内核。

表达式:

 5 拉普拉斯算子核

拉普拉斯核心完全等同于指数内核,除了对sigma参数的变化不那么敏感。 作为等价的,它也是一个径向基函数内核。

表达式:

重要的是注意,关于高斯内核的σ参数的观察也适用于指数和拉普拉斯内核。

 

SVR-支持向量机回归 

https://blog.csdn.net/zb123455445/article/details/78354489

对于一般的回归问题,给定训练样本D={(x1,y1),(x2,y2),...,(xn,yn)},yi€R,我们希望学习到一个f(x)使得其与y尽可能的接近,w,b是待确定的参数。在这个模型中,只有当f(x)与y完全相同时,损失才为零,而支持向量回归假设我们能容忍的f(x)与y之间最多有ε的偏差,当且仅当f(x)与y的差别绝对值大于ε时,才计算损失,此时相当于以f(x)为中心,构建一个宽度为2ε的间隔带,若训练样本落入此间隔带,则认为是被预测正确的。(间隔带两侧的松弛程度可有所不同)

因此SVR问题可转化为(下式左部是正则化项):

l为损失函数

因此引入了松弛因子,重写第一个式子为:

最后引入拉格朗日乘子,可得拉格朗日函数:

对四个遍历求偏导,令偏导数为零,可得

把上边的式子带入,即可求得SVR的对偶问题

上边的过程需要满足KKT条件,即

最后,可得SVR的解为

其中b为

 

面试常见问题:

转载于:https://blog.csdn.net/a857553315/article/details/79586846

1.SVM的原理是什么?
SVM是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。(间隔最大是它有别于感知机)
(1)当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
(2)当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
(3)当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。

注:以上各SVM的数学推导应该熟悉:硬间隔最大化(几何间隔)---学习的对偶问题---软间隔最大化(引入松弛变量)---非线性支持向量机(核技巧)。

 2.SVM为什么采用间隔最大化?

当训练数据线性可分时,存在无穷个分离超平面可以将两类数据正确分开。利用间隔最大化求得最优分离超平面,这时,解是唯一的。另一方面,此时的分隔超平面所产生的分类结果对未知实例的泛化能力最强。

 3.为什么要将求解SVM的原始问题转换为其对偶问题?
一、是对偶问题往往更易求解,(当我们寻找约束存在时的最优点的时候,约束的存在虽然减小了需要搜寻的范围,但是却使问题变得更加复杂。为了使问题变得易于处理,我们的方法是把目标函数和约束全部融入一个新的函数,即拉格朗日函数,再通过这个函数来寻找最优点。)
(a)目前处理的模型严重依赖于数据集的维度d,如果维度d太高就会严重提升运算时间;
(b)对偶问题把SVM从依赖d个维度转变到依赖N个数据点,最后计算时只有支持向量有意义,所以计算量比N小很多。

二、自然引入核函数,进而推广到非线性分类问题。

 4.为什么SVM要引入核函数?
当样本在原始空间线性不可分时,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。引入映射后的对偶问题:
在学习预测中,只定义核函数K(x,y),而不是显式的定义映射函数ϕ。因为特征空间维数可能很高,甚至可能是无穷维,因此直接计算ϕ(x)·ϕ(y)是比较困难的。相反,直接计算K(x,y)比较容易(即直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果)。
核函数的定义:K(x,y)=<ϕ(x),ϕ(y)>,即在特征空间的内积等于它们在原始样本空间中通过核函数K计算的结果。

除了 SVM 之外,任何将计算表示为数据点的内积的方法,都可以使用核方法进行非线性扩展。

5.svm RBF核函数的具体公式?
Gauss径向基函数则是局部性强的核函数,其外推能力随着参数σ的增大而减弱。

这个核会将原始空间映射为无穷维空间。不过,如果 σ 选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上相当于一个低维的子空间;反过来,如果 σ 选得很小,则可以将任意的数据映射为线性可分——当然这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数σ ,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。

6.为什么SVM对缺失数据敏感?

这里说的缺失数据是指缺失某些特征数据,向量数据不完整。SVM没有处理缺失值的策略(决策树有)。而SVM希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能很重要。缺失特征数据将影响训练结果的好坏。

7.SVM是用的是哪个库?Sklearn/libsvm中的SVM都有什么参数可以调节?
用的是sklearn实现的。采用sklearn.svm.SVC设置的参数。本身这个函数也是基于libsvm实现的(PS: libsvm中的二次规划问题的解决算法是SMO)。
SVC函数的训练时间是随训练样本平方级增长,所以不适合超过10000的样本。
对于多分类问题,SVC采用的是one-vs-one投票机制,需要两两类别建立分类器,训练时间可能比较长。
sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,random_state=None)
参数:
C:C-SVC的惩罚参数C,默认值是1.0。C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 
    0 – 线性:u'v
    1 – 多项式:(gamma*u'*v + coef0)^degree
    2 – RBF函数:exp(-gamma|u-v|^2)
    3 –sigmoid:tanh(gamma*u'*v + coef0)
degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
max_iter :最大迭代次数。-1为无限制。
decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3

主要调节的参数有:C、kernel、degree、gamma、coef0。

8.SVM如何处理多分类问题?
一般有两种做法:
一种是直接法,直接在目标函数上修改,将多个分类面的参数求解合并到一个最优化问题里面。看似简单但是计算量却非常的大。
另外一种做法是间接法:对训练器进行组合。其中比较典型的有一对一,和一对多。
 一对多,就是对每个类都训练出一个分类器,由svm是二分类,所以将此而分类器的两类设定为目标类为一类,其余类为另外一类。这样针对k个类可以训练出k个分类器,当有一个新的样本来的时候,用这k个分类器来测试,那个分类器的概率高,那么这个样本就属于哪一类。这种方法效果不太好,bias比较高。

 一对一法(one-vs-one),针对任意两个类训练出一个分类器,如果有k类,一共训练出C(2,k) 个分类器,这样当有一个新的样本要来的时候,用这C(2,k) 个分类器来测试,每当被判定属于某一类的时候,该类就加一,最后票数最多的类别被认定为该样本的类。

10、样本失衡会对SVM的结果产生影响吗?
答:会,超平面会靠近样本少的类别。因为使用的是软间隔分类,而如果对所有类别都是使用同样的惩罚系数,则由于优化目标里面有最小化惩罚量,所以靠近少数样本时,其惩罚量会少一些。比如:假设理想的分隔超平面是大样本中有很多数据到该超平面的函数距离是小于1的,而小样本中是只有少数样本的函数距离小于1的。但是由于惩罚系数相同,实际算法得到的超平面会往小样本数据靠近。
参考博客提供的解法
1)、对多数类和和少数类采用不同的惩罚因子,对正例和负例赋予不同的C值,例如正例远少于负例,则正例的C值取得较大,这种方法的缺点是可能会偏离原始数据的概率分布;
2)、对训练集的数据进行预处理即对数量少的样本以某种策略进行采样,增加其数量或者减少数量多的样本,典型的方法如:随机插入法,缺点是可能出现 overfitting,较好的是:Synthetic Minority Over-sampling TEchnique(SMOTE),其缺点是只能应用在具体的特征空间中,不适合处理那些无法用特征向量表示的问题,当然增加样本也意味着训练时间可能增加;

3)、基于核函数的不平衡数据处理。

11、样本失衡时,如何评价分类器的性能好坏?

答:使用ROC曲线

12、数据维度大于数据量的对SVM的影响?

答:这种情况下一般采用线性核(即无核),因为此时特征够用了(很大可能是线性问题),没必要映射到更高维的特征空间。

13、怎么用SVM解决多分类问题?参考1;参考2
答:1)一对一法:任意两类样本之间设计一个SVM,最终有k(k-1)/2个分类器,投票决定,libsvm是这么做的。虽然分类器多,但是训练总时间要比一对多的速度快,因为训练复杂度是跟样本量有关的。
2)一对多法:最终k个分类器,最终如果只有一个+1,则分为该类;如果有多个+1(分类重叠),则取wx+b的值最大的那个;如果没有+1(不可分),则分为其余类,会造成数据集倾斜问题。PS:当样本可以属于多个类别时,采取这种方式。

3)DAG法:用一对一的方法建立k(k-1)/2个分类器,然后将这些分类器建立成有向无环图(有点像二叉树);预测的时候,都只需要调用k-1个分类器;缺点是存在错误累积,一旦开始分类错的话,接下来就不可能分对了。所以第一个分类器一定要选好

14、数据不规范化对SVM的影响?参考

答:大值特征会掩盖小值特征(内积计算)。高斯核会计算向量间的距离,也会产生同样的问题;多项式核会引起数值问题。影响求解的速度。数据规范化后,会丢失一些信息。预测的时候,也要进行规范化,测试数据规划时,使用的最大值和最小值都是训练集的而不是测试集的。

15、如何处理离散型变量?参考

答:{red, green, blue} 可以表示为 (0,0,1), (0,1,0), and (1,0,0);这样向量的内积或距离才有真正意义。

16、如何选择核函数?参考1;参考2;参考3;参考4
答:线性核是高斯核的特例,对于特征非常多的情况下,应使用线性核。因为此时特征够用了(很大可能是线性问题),没必要映射到更高维的特征空间,线性核的训练速度快,而且一般情况下效果还不错,尤其是维度高的情况下。
sigmoid核在给定的参数下和高斯核相似
多项式核的参数太多;对于高斯核0<Kij<1,而多项式核则可能会出现无穷大或无穷小;
其他核需要调参(使用交叉验证),所以速度慢。

高斯核必然映射到无穷维,因为核函数的泰勒展开有无穷多项。

17、为什么SVM训练的时候耗内存,而预测的时候占内存少?
答:因为SVM训练过程中需要存储核矩阵。而预测的时候只需要存储支持向量和相关参数。

详细回答:算法最耗时的地方是优化乘子的选择和更新一阶导数信息,这两个地方都需要去计算核函数值,而核函数值的计算最终都需要去做内积运算,这就意味着原始空间的维度很高会增加内积运算的时间;对于dense matrix我就直接用numpy的dot了,而sparse matrix采用的是CSR表示法,求它的内积我实验过的方法有三种,第一种不需要额外空间,但时间复杂度为O(nlgn),第二种需要一个hash表(用dictionary代替了),时间复杂度为线性,第三种需要一个bitmap(使用BitVector),时间复杂度也为线性,实际使用中第一种速度最快,我就暂时用它了,应该还有更快的方法,希望高人们能指点一下;另外由于使用dictionary缓存核矩阵,遇到训练数据很大的数据集很容易挂掉,所以在程序中,当dictionary的内存占用达到配置文件的阈值时会将其中相对次要的元素删掉,保留对角线上的内积值。

18、在SMO中,什么叫违反KKT条件最严重的?

答:每一个α对应一个样本,而KKT条件是样本和对应的α应该满足的关系。所谓违反最严重是指α对应的样本错得最离谱

19、SVM适合处理什么样的数据?

答:高维稀疏,样本少。【参数只与支持向量有关,数量少,所以需要的样本少,由于参数跟维度没有关系,所以可以处理高维问题】高维问题还可以另外一个角度来思考,假设给定一个训练数据集,其特征是少量的,那么很可能需要映射到高维空间才能求解,那么这个问题就是一个高维问题

20、线性核VS多项式核VS径向基核?
答:1)训练速度:线性核只需要调节惩罚因子一个参数,所以速度快;多项式核参数多,难调;径向基核函数还需要调节γ,需要计算e的幂,所以训练速度变慢。【调参一般使用交叉验证,所以速度会慢】
2)训练结果:线性核的得到的权重w可以反映出特征的重要性,从而进行特征选择;多项式核的结果更加直观,解释性强;径向基核得到权重是无法解释的。

3)适应的数据:线性核:样本数量远小于特征数量(n<<m)【此时不需要映射到高维】,或者样本数量与特征数量都很大【此时主要考虑训练速度】;径向基核:样本数量远大于特征数量(n>>m)

21、径向基核函数中参数的物理意义
答:如果σ选得很大的话,高次特征上的权重实际上衰减得非常快,使用泰勒展开就可以发现,当很大的时候,泰勒展开的高次项的系数会变小得很快,所以实际上相当于一个低维的子空间;

如果σ选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题,因为此时泰勒展开式中有效的项将变得非常多,甚至无穷多,那么就相当于映射到了一个无穷维的空间,任意数据都将变得线性可分

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值