支持向量机SVM

一、线性支持向量机

在这里插入图片描述
①基本模型(转化为最优化问题):在这里插入图片描述
②使用拉格朗日乘子法可以获得其对偶问题:
在这里插入图片描述
③对偶问题:
在这里插入图片描述
满足KKT条件:
在这里插入图片描述
在这里插入图片描述

④求解α:(SMO算法)
在这里插入图片描述
违背了KKT条件,就会距离目标函数的优化越来越远,当目标函数的优化目标是取最大值时,目标函数在违背KKT条件下的实例下的函数值就会减小;当目标函数的优化目标是最小值时,目标函数在违背KKT条件下的实例下的函数值就会变大。对偶化的目标函数的优化方向是取最大值,所以说目标函数在当前违背KKT条件下的实例的函数值是减小的。

SMO高效性:
仅考虑αi和αj,在这里插入图片描述

得到关于αi的单变量二次规划问题(仅有约束:αi≥0),具有闭式解,不用调用数值优化方法即可高效计算得到αi和αj
⑤求解b:
在这里插入图片描述
采用所有支持向量的求解均值以提高鲁棒性:在这里插入图片描述
二分类:

>>> from sklearn import svm
>>> X = [[0, 0], [1, 1]]
>>> y = [0, 1]
>>> # 训练模型
>>> clf = svm.SVC(gamma='scale')
>>> clf.fit(X, y)  
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
 decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf',
 max_iter=-1, probability=False, random_state=None, shrinking=True,
 tol=0.001, verbose=False)
>>> # 模型预测
>>> clf.predict([[2., 2.]])
array([1])
>>> # 获得支持向量
>>> clf.support_vectors_
array([[ 0.,  0.],
 [ 1.,  1.]])
>>> # 获得支持向量的索引
>>> clf.support_
array([0, 1]...)
>>> # 为每一个类别获得支持向量的数量
>>> clf.n_support_
array([1, 1]...)

多分类:

>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(gamma='scale', decision_function_shape='ovo')
>>> clf.fit(X, Y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
 decision_function_shape='ovo', degree=3, gamma='scale', kernel='rbf',
 max_iter=-1, probability=False, random_state=None, shrinking=True,
 tol=0.001, verbose=False)
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes: 4*3/2 = 6
6
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes
4

二、非线性支持向量机

在这里插入图片描述
对偶问题:

在这里插入图片描述
常用核函数(核函数都是半正定的):
在这里插入图片描述
核函数在这里插入图片描述

>>> linear_svc = svm.SVC(kernel='linear')
>>> linear_svc.kernel
'linear'
>>> rbf_svc = svm.SVC(kernel='rbf')
>>> rbf_svc.kernel
'rbf'

三、软间隔

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

效果图:
在这里插入图片描述

四、支持向量回归SVR(推导过程同上)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
引入两个松弛变量:
在这里插入图片描述

在这里插入图片描述

>>> from sklearn import svm
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> clf = svm.SVR()
>>> clf.fit(X, y)
SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto_deprecated',
 kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
>>> clf.predict([[1, 1]])
array([ 1.5])

五、半监督SVM

优化目标:
在这里插入图片描述在这里插入图片描述

六、使用诀窍

  1. 惩罚系数C的设置:在合理的情况下, C 的默认选择为 1 。如果您有很多混杂的观察数据, 您应该要去调小它。 C 越小,就能更好地去正规化估计。
    当C值较大时,LinearSVC和LinearSVR对C值较不敏感,即当C值大于特定阈值后,模型效果将会停止提升。同时,较大的C值将会导致较长的训练时间,Fan
    et al.(2008)的论文显示,训练时间的差距有时会达到10倍。
  2. 数据标准化:支持向量机算法本身不能够很好地支持非标准化的数据,所以建议将数据标准化。
  3. 数据不均衡问题:在 SVC ,如果分类器的数据不均衡(例如,很多正例很少负例),设置 class_weight=‘balanced’ 与/或尝试不同的惩罚系数 C 。
  4. 底层实现的随机性:SVC和NuSVC的底层实现仅使用随机数生成器来打乱数据顺序进行概率估计(当probability被设置为True时)。这种随机性可以用random_state参数来控制。如果将probability设为False,这些估计器就不是随机的,random_state对结果没有影响。
  5. L1正则化:使用由 LinearSVC(loss=‘l2’, penalty=‘l1’, dual=False) 提供的 L1 惩罚去产生稀疏解,也就是说,特征权重的子集不同于零,这样做有助于决策函数。 随着增加 C 会产生一个更复杂的模型(有更多的特征被选择)。可以使用 l1_min_c 去计算 C 的数值,去产生一个”null” 模型(所有的权重等于零)

七、优点与缺点

优点:
1.在高维空间中非常高效.
2.即使在数据维度比样本数量大的情况下仍然有效.
3.在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的.
4.通用性: 不同的核函数与特定的决策函数一一对应.常见的 kernel 已经提供,也可以指定定制的内核.

缺点:
1.如果特征数量比样本数量大得多,在选择核函数 核函数 时要避免过拟合, 而且正则化项是非常重要的.
2.支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值