支持向量机,support vector machine,二类分类模型,基本模型定义为特征空间上的间隔最大的线性分类器,学习策略便是间隔最大化,最终转化为一个凸二次规划问题的求解。
在超平面wx+b=0确定的情况下,|wx+b|表示点x到距离超平面的距离,观察wx+b的符号与类标记y的符号是否一致可判断分类是否正确,可以用(y(w*x+b))的正负性来判定或表示分类的正确性。
超平面(w,b)关于数据集T中所有样本点(xi,yi)的函数间隔最小值(x是特征,y是结果标签,i表示第i个样本),便为超平面(w, b)关于训练数据集T的函数间隔:
几何间隔:
对法向量w加约束条件,即使用几何间隔(geometrical margin)对函数间隔加以限制,防止w和b等倍增加而比不变。假定对于一个点 x ,令其垂直投影到超平面上的对应点为 x0 ,w 是垂直于超平面的一个向量,gamma为样本x到超平面的距离
几何间隔就是函数间隔除以||w||,函数间隔y*(wx+b) = y*f(x)实际上就是|f(x)|,是人为定义的间隔度量,而几何间隔|f(x)| / ||w||才是直观上的点到超平面的距离。
函数间隔不适合用来最大化间隔值,在超平面固定后,可以等比例地缩放w的长度和b的值,使得 编辑的值任意大,亦即函数间隔可以在超平面保持不变的情况下取值任意大。加上几何间隔后,使得在缩放w和b的时几何间隔的值是不变的,它只随着超平面的变动而变动,所以要找的最大间隔分类超平面中的“间隔”指的是几何间隔。
如上图,中间的实线便是寻找到的最优超平面(Optimal Hyper Plane),最优超平面两条虚线边界的距离相等,这个距离便是几何间隔,两条虚线间隔边界之间的距离等于2倍几何间隔,而虚线间隔边界上的点则是支持向量。由于这些支持向量刚好在虚线间隔边界上,所以它们满足 编辑,对于所有不是支持向量的点,则显然有 编辑。
SVM 求解建立二次规划原始问题,引入拉格朗日乘子法,然后转换成对偶的形式求解。在机器学习领域,一般的做法是经验风险最小化 (empirical risk minimization,ERM),即构建假设函数(Hypothesis)为输入输出间的映射,采用损失函数来衡量模型的优劣。使损失最小化的模型即为最优的假设函数,采用不同的损失函数也会得到不同的机器学习算法。
SVM采用的就是Hinge Loss,用于“最大间隔(max-margin)”分类。
sklearn 中 SVM 的使用:
SVC 的使用:from sklearn.svm import SVC
C: float参数 默认值为1.0;错误项的惩罚系数。C越大,对分错样本的惩罚程度越大,训练样本中准确率越高,但泛化能力降低,对测试数据的分类准确率降低。减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。
kernel: str参数 默认为‘rbf’;算法中采用的核函数类型,可选参数有:
‘linear’:线性核函数;‘poly’:多项式核函数;‘rbf’:径像核函数/高斯核;
‘sigmod’:sigmod核函数;‘precomputed’:核矩阵;设置为 precomputed 时可使用提前计算好的核函数矩阵,算法内部就不再用核函数去计算核矩阵,直接用给定的核矩阵。核矩阵为如下形式:
可以给出自己定义的核函数,内部就是用自定义的核函数来计算核矩阵。
degree: int 型参数 默认为3;只对多项式核函数有用,是指多项式核函数的阶数 n;对其他核函数会自动忽略该参数。
gamma:float,默认:auto;核函数系数,只对‘rbf’,‘poly’,‘sigmod’有效;如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features。
coef0:float,默认为0.0;核函数的独立项,只对‘poly’和‘sigmod’核函数有用,指参数c。
probability:bool,默认False;是否启用概率估计;必须在调用fit()前启用,使fit()方法速度变慢。
shrinking:bool参数 默认为True;是否采用启发式收缩方式
tol: float参数 默认为1e^-3;svm停止训练的误差精度
cache_size:float参数 默认为200;指定训练所需要的内存,以MB为单位,默认为200MB。
class_weight:字典类型或者‘balance’字符串。默认为None;给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C。如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
verbose :bool参数 默认为False;是否启用详细输出。 设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。
max_iter :int参数 默认为-1;最大迭代次数,如果为-1,表示不限制
random_state:int型参数 默认为None;伪随机数发生器的种子,在混洗数据时用于概率估计。
fit():用于训练SVM,具体参数已经在定义SVC对象的时候给出了,这时候只需要给出数据集X和X对应的标签y即可。
predict():基于以上的训练,对预测样本T进行类别预测,因此只需要接收一个测试集T,该函数返回一个数组表示个测试样本的类别。
属性:
svc.n_support_:各类各有多少个支持向量
svc.support_:各类的支持向量在训练样本中的索引
svc.support_vectors_:各类所有的支持向量
参考: