• SVM


    一.SVM

    1.SVM(Support Vector Machines)是一种监督学习中的二分类器,目标是在样本空间内找到一个超平面对数据集进行分类,关键点在于怎样确定这个超平面。

    2.训练好的模型的算法复杂度是由支持向量的个数决定的,而不是由数据的维度决定的。所以 SVM 不太容易产生 overfitting

    3.SVM 训练出来的模型完全依赖于支持向量

    一个 SVM 如果训练得出的支持向量个数比较少,那么SVM 训练出的模型比较容易被泛化

    稀疏性和稳健性

    二.超平面

    1.一般分类模型都是找到一个决策边界对样本点进行分类,而SVM是找到一个超平面作为决策边界。

    2.超平面:n维欧氏空间中余维度等于一的线性子空间,也就是必须是(n-1)维度,这是平面中的直线、空间中的平面之推广;所以一个超平面严格把样本空间分成两部分。

    三.最大间隔分类器

    1.我们的目标是找到一个超平面把样本分为两类,但是可能存在许多超平面,也可能不存在严格划分的超平面。

    2.我们把距离超平面最近的两类中的样本点作为支持向量,把两个异类支持向量到超平面的距离作为间隔。

    3.若存在有许多超平面,我们肯定要选择其中使得模型表现最好的,怎么判别其中最好的超平面?对于一组样本点,我们定义一组样本到超平面的距离为所有样本到超平面的所有距离中的最小距离;我们可以用超平面对整个样本集分为两类,则这两类到超平面都有‘最短’距离,这两个‘最短’距离和被称为‘几何间隔’,几何间隔越大表示分的两类样本的距离越大,也表示分类后的两类样本更合理,在几何间隔间的分类器的容错率就越高;由于超平面也相当于决策边界,因此我们也要让分类后的两类样本离决策边界尽量远,也就是两类样本到超平面的距离要尽量远,很明显超平面的选择为几何间隔的中间那个超平面,而此时超平面附近的间隔表示误差率上限。因此我们要找到一个超平面,使几何间隔最大,也就是模型的误差上界尽可能大,模型受到数据的影响尽可能小,模型更稳定。

    4.关于间隔和几何间隔:几何间隔就是点到超平面的距离,也就是样本点在单位法向量上的投影;而定义的函数间隔是根据超平面来定义的,是样本点在单位法向量上的投影再乘以法向量的长度,是一种逻辑上的表达,表示支持向量所在边界平面与分隔超平面的截距之差,是一个常数。若我们把原模型中的w和b进行扩大或缩放,超平面并不会有变化,但函数间隔却变了,因此需要对分离超平面的法向量加上某些约束,如规范化,||w||=1,使函数间隔是确定的,这时函数间隔成为了几何间隔。可以理解为几何间隔是函数间隔除以||w||的表达,几何间隔是函数间隔归一化的结果。

     

    四.利用拉格朗日法转化为对偶问题求解

    1.拉格朗日乘子法:原问题f为包含约束条件的关于参数的最小化问题,通过解得最优参数使得函数的值最小。我们引入拉格朗日乘子,把原问题f中的约束条件(不等式约束和等式约束)乘以一个乘子加入到原最小化问题中,要使变换后的问题f'与原问题f等价,就要满足KKT条件:(1)f'对参数求导为0,因为最优化问题若没有约束,求导为0可得极值点--最优解,若f和f'等价,f’对参数求导使之为0可得f的参数的最优解,是用拉格朗日乘子来表示的;(2)等式约束条件为0,这是f中的约束,仍要在f’中表现;(3)不等式约束与拉格朗日乘子的组合为0,这样才能让f’和f一样。通过KKT条件,用拉格朗日乘子来表示原模型f的最优解,这样,我们可以把关于参数的最优化问题改为关于拉格朗日乘子的最优化问题,这也就是原问题的对偶问题,原问题和对偶问题等价。通过求解对偶问题的来求得原问题的最优解,SVM对偶问题是一个凸规划问题。

    2.SVM拉格朗日乘子

    3.求解对偶问题-SMO:根据KKT条件3,我们有很多乘子,这些乘子有线性关系,SMO每次选择一对更新的参数,固定其他参数,求解对偶问题获得更新后的参数(求导、迭代)

    3.关于预测公式:从预测公式中看出:若要预测样本点j,先把它和每个样本点进行相似性比较(内积),再把相似度作为每个样本点预测值的权重,估计最后的预测值。即:当不知道样本点的y时,找相似点的预测值对其进行预测,这是对每个样本点偏差对待,有的权重大,有的小。那些权重大的点靠近决策边界,作为支持向量。

    在预测公式中,注意到引入的每个拉格朗日乘子ai与相应的样本(Xi,yi)密切相关,又由KKT条件可得ai与样本i的关系:对于任意样本i总有ai=0或者yif(xi)-1=0,若ai=0,则模型中关于样本i的那项为0,即该样本不会对模型有影响;若yif(xi)-1=0,此时表示对应样本点在决策区域边界上,表明该样本对模型的建立有影响,作为一个支持向量。因此训练完成后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关。

    五.核函数

    1.背景:对于线性不可分的问题,我们可以把低维空间映射到高维空间,样本集的信息就会更详细,样本间的差距更明显,这样可以用一个超平面线性分割样本集。已证明一个有限维的空间中样本集可以映射到更高维度上线性可分。

    2.样本集从低维空间到高维空间实际是坐标系的改变,比如(x1,x2)---(x1^2,x2^2,2x1x2),即对于用一个样本用不同维度表示,数学表示为用一个变换函数把原向量映射到高维空间。

    3.SVM的核函数:注意到SVM的对偶问题中以及最后的模型中关注的是预测样本与已知样本的内积,则若我们对样本集进行变化后,关注的也应该是变换后的样本集之间的内积,但是变换后的样本内积由于样本维度的增加会变成高复杂度计算,因此我们假定变换后样本间内积可由它们在原始样本空间中通过核函数计算的结果,也就是说本来要先对样本进行变换,在将变换后的样本进行内积运算;现在直接设定一个关于两个样本的函数,把该函数作为转换后的内积运算公式,节省了计算。也就是说由于预测和训练时只涉及样本之间的内积,所以不需要显式地指定变换,而是用核函数替换当中的内积。使用核函数后,我们对于样本如何变化是不知的,它是怎样映射也是不知的,但是我们知道映射后的样本内积。

    4.核函数:核函数是表示变换后样本间内积的表达式。

    5.什么函数能作为核函数:K为核函数当且仅当核函数矩阵为半正定矩阵

    6.合适核函数的选择:核函数表示了变换后样本的内积,若映射的空间不对,则也不能线性可分样本。我们可以用网格搜索的方法来一个个尝试常用核函数。

    7.核函数相关:两个核函数可以组合(线性组合、直积)或变换成一个新的核函数

    五.间隔和正则化

    1.我们不是一定能找到合适的核函数使得样本映射到正确的线性可分的空间,而且有时我们得出的SVM可能是过拟合的,因此我们允许分类器可以犯一些错误,具体地来说,我们放宽限制条件,在约束条件右边>=1上加入一个误差项,用来表示模型违反自身分类原则的程度,这个误差项应该越小越好,但是这个样本误差项除以||w||表示了样本点到所对应类的支持平面的距离。这个误差越小,表示点到超平面的距离越短,但是我们原本假设的最大化间隔代表最大化距离,两者是矛盾的。

    2.我们在原问题中加入了误差项,表示模型的预计损失,这个损失应该越小越好,损失的增大表示间隔的增大,损失越小代表了间隔的减小,这与我们原本的1/2(||w||)^2(最大化间隔)矛盾,引入损失系数C,表示模型训练对于预测损失最小化和间隔最大化之间的选择权重。

    3.我们仍然用拉格朗日乘子法求出对偶问题,在解决该问题。根据KKT,我们最终得出:若没有损失项,表明模型不允许错误,此时模型对于样本集严格划分连隔离,这样的模型的建立仅与在决策边界上的样本(支持向量)有关,此时形成硬间隔(hard margin);若存在损失项,表明模型允许错误,但是要最小化错误,此时形成的间隔可以有一定范围的变化,被称为软间隔(soft margin)。软间隔SVM引入了损失系数(超参数)C来表示模型对于误差的忍受程度,平衡减小损失和最大化间隔的关系,C越大,越注重减小损失,间隔变小,即严格分类;C越小,表明模型对于误差的忍受程度越大,模型更注重于最大化间隔,此时间隔会比较大,相对的误差率也会相应增大,模型对于样本不是严格分类的,此时支持向量会在间隔内部或者在决策边界上。

    六.SVM的拓展

    1.总结:SVM可表现为如下最优化问题,可用拉格朗日乘子法化为对偶问题从而求解得到最后的模型如下,最优化问题中第一项表示划分超平面间隔的大小,第二项表示在训练集上的误差,C表示损失函数,C越大,误差项应该越小,越注重分类的正确性

    2.以上SVM可拓展为如下模型,第一项描述模型f的某些性质(结构风险),第二项表示模型和训练数据的误差(经验风险),C从中平衡,C越大,越注重减少经验风险,也就是越注重模型对数据的拟合度;C越小,越注重结构风险(模型的某些特点,比如希望获得复杂度小的模型),另一方面也降低了过拟合风险。

    这是一个正则化问题,第一项为正则化项,对模型拟合性能的惩罚,希望获得更好的泛化性能,L2范数倾向于w的分量取值尽量均衡,即非0向量个数尽量稠密,L0和L1范数倾向于w的分量尽量疏密,即非0向量个数尽量少。

    3.支持向量回归SVR---肯定有偏差,设定一个偏差项作为能够接受的误差范围,则真实值以及附近表示预测准确不计算误差,出这个范围的计算误差,相似于SVM中的1

    4.核方法:通过引入核函数把线性分类器变为非线性分类器。核函数是代表变换后的向量内积,它把低维空间映射到高维空间从而使非线性分类问题可线性分类,通过引入核函数,把原来的线性分类器也可进行非线性分类。

    七.补充

    1.支持向量机

     1 from sklearn.datasets import load_iris
     2 from sklearn.svm import SVC
     3 from sklearn.model_selection import train_test_split
     4 import numpy as np
     5 
     6 iris = load_iris()
     7 X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=0)
     8 
     9 # 网格搜索
    10 best_score = 0
    11 C_list = [0.001,0.01,0.1,1,10,100]
    12 kernel_functions = ['linear','poly','rbf']
    13 for kernel in kernel_functions:
    14     for C in C_list:
    15         svm = SVC(kernel=kernel,C=C)
    16         svm.fit(X_train,y_train)
    17         score = svm.score(X_test,y_test)
    18         if score > best_score:#找到表现最好的参数
    19             best_score = score
    20             best_parameters = {'kernel':kernel,'C':C}
    21 
    22 print("Best score:{:.2f}".format(best_score))
    23 print("Best parameters:{}".format(best_parameters))
    SVM
    1     def __init__(self, C=1.0, kernel='rbf', degree=3, gamma='auto',
    2                  coef0=0.0, shrinking=True, probability=False,
    3                  tol=1e-3, cache_size=200, class_weight=None,
    4                  verbose=False, max_iter=-1, decision_function_shape='ovr',
    5                  random_state=None):
    SVM-2

    2.

  • 相关阅读:
    uboot nand erase 的显示错误修复
    Sougo for linux install.
    S3C6410移植uboot2010.3(2)基本的启动信息修改
    S3C6410移植uboot2010.3(4)uboot的dnw功能添加
    S3C6410移植uboot2010.3(3)正常化配置
    ubuntu乱码修复
    应老婆点(20070705 13:11:34)(新浪)
    克己慎独 2008923 13:32:00 (21ic)
    信任(20061229 14:16:32)(新浪)
    不要轻易承诺 2008926 14:42:00 (21ic)
  • 原文地址:https://www.cnblogs.com/yu-liang/p/12688000.html
Copyright © 2020-2023  润新知