文章目录
SVM基本原理
- 找到一个最优的超平面,使得距离超平面最近的样本距离超平面最远,这个距离称为间隔
- 二维数据找直线:y = wx+b
- 三维数据找超平面:y = w^Tx+b
超平面的特征
- 超平面分开了两类
- 该超平面具有最大化间隔
- 该超平面处于间隔的中间,到所有支持向量距离相等【支持向量:超平面上的点】
目标函数
距离计算
距离函数优化
去掉绝对值
y
(
x
)
=
w
T
Φ
(
x
)
+
b
y
(
x
i
)
>
0
−
>
y
i
=
+
1
y
(
x
i
)
<
0
−
>
y
i
=
−
1
可
得
:
y
i
y
(
x
i
)
>
0
根
据
y
i
y
(
x
i
)
>
0
可
得
d
i
s
t
=
y
i
∗
(
w
T
∗
Φ
(
x
i
)
+
b
)
∣
∣
w
∣
∣
y(x) = w^T\Phi(x)+b\\ y(x_i)>0->y_i=+1\\ y(x_i)<0->y_i=-1\\ 可得:y_iy(x_i)>0\\ 根据y_iy(x_i)>0可得\\ dist = \frac{y_i*(w^T*\Phi(x_i)+b)}{||w||}
y(x)=wTΦ(x)+by(xi)>0−>yi=+1y(xi)<0−>yi=−1可得:yiy(xi)>0根据yiy(xi)>0可得dist=∣∣w∣∣yi∗(wT∗Φ(xi)+b)
目标函数
线 性 可 分 时 的 最 大 化 超 平 面 : w ⋅ x + b = 0 支 持 向 量 上 , y i ∗ ∣ w T x 0 + b ∣ = 1 非 支 持 向 量 上 , y i ∗ ∣ w T x 0 + b ∣ > 1 线性可分时的最大化超平面:w·x+b=0\\ 支持向量上,y_i*|w^Tx_0+b|=1\\ 非支持向量上,y_i*|w^Tx_0+b|>1\\ 线性可分时的最大化超平面:w⋅x+b=0支持向量上,yi∗∣wTx0+b∣=1非支持向量上,yi∗∣wTx0+b∣>1
拉格朗日求解
- 涉及对偶条件和KKT条件
决策方程
y i = s i g n ( y ( x ) ) = s i g n ( w t φ ( x ) + b ) y i = s i g n ( y ( x ) ) = { − 1 , y ( x ) < 0 0 , y ( x ) = 0 1 , y ( x ) > 0 y_i = sign(y(x))=sign(w^tφ(x)+b)\\ y_i = sign(y(x))=\left\{ \begin{aligned} -1 &,y(x)<0 \\ 0 &,y(x)=0 \\ 1 &,y(x)>0 \end{aligned} \right. yi=sign(y(x))=sign(wtφ(x)+b)yi=sign(y(x))=⎩⎪⎨⎪⎧−101,y(x)<0,y(x)=0,y(x)>0
支持向量
距离超平面最近的点为支持向量,实际参与计算的样本点
https://zhuanlan.zhihu.com/p/52168498
软间隔
- 减少噪声点的影响,解决线性不可分问题
- 线性不可分时,引入非负松弛因子
- C为松弛因子的系数
非线性处理手段
- 以上都是基于线性模型,即可以通过直线或一个平面区分类别,但实际有的案例是非线性的,那么上述的方法就无法求解。
同心圆形状分布
异或问题
核函数
φ(x)
x通过φ(x)映射函数转为高维
核函数概念
从低维映射到高维过程中计算内积的简便方法
低维不可分,通过映射到高维实现可分,映射是指将数据通过**φ(x)**从低维映射到高维空间
我们不需要知道映射函数的显示表达式,只要知道一个核函数,也能计算内积
核函数的定义:如果原始特征内积为<x , z> ,映射后为<φ(x), φ(z)>,则**核函数(常数)**定义为:
选择核函数
-
若特征数量个数和样本数量差不多,则选择线性核函数
-
若特征数量小,样本数量正常,则选择高斯核函数
-
若特征数量小,样本数量很大,则选择增加特征,缩小样本和特征差距,实现线性可分
-
大部分都是高斯核函数
-
对于一个半正定核矩阵,总能找到一个与之对应的映射φ
高斯核函数
-
高斯核函数别名
- RBF (Radial Basic Function Kernel)
- 径向基函数
-
高斯函数核心思想
- 将每个样本点映射到一个指定维度的特征空间,从而使数据可分
-
高斯核函数参数
γ = 1 2 ∗ σ 2 γ = \frac{1}{2*\sigma^2} γ=2∗σ21
- 高斯分布
- u决定分布图中心的偏移情况
- σ决定分布值峰值高低
- 高斯函数的σ越大,峰值越小,反之。
SVM多分类问题策略
1对多(ovr)
训练时把某个类别的样本归为一类,剩余样本归为一类,这样k个类别需要k个SVM,分类时把未知样本分类为具有最大分类函数值的那类
如 A B C三类
SVM1 A(+) BC(-)
SVM2 B(+) AC(-)
SVM3 C(+) AB(-)
当出现- 1, +1,+1时,不能区分B和C,这时通过计算(预测置信度),若是正例,选择越大的;若是负例,选择越小的。
将测试集D依次放入SVM1,SVM2,SVM3中训练
优点是计算速度快
缺点是存在偏差
一对一(ovo)
任意两类间设计一个SVM,需要n(n-1)/2个SVM,对未知样本分类时,选择最后投票数最多的类别
SVM(A, B) if A win, A++, else B++;
SVM(A, C) if A win, A++, else C++;
SVM(B, C) if A win, B++, else C++;
缺点是代价比较大
优点:准确较高,SVM是天生为两类问题设计的
DAG-SVMs
有向无环图,一对一中衍生
6个类别训练时需要15个SVM模型,预测时只需k-1个决策函数即可,较ovo快速
DAG-图的决策函数?
每个结点用符号函数做决策,正例往左,负例往右
层次支持向量机(H-SVMs)
层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止
选择LinearSVC还是SVC?
LinearSVC
- LinearSVC只支持Linear核
- LinearSVC is not linear SVM
- 因为LinearSVC最小化合页损失函数的平方,而SVC最小化合页损失函数绝对值(非凸优化)
- LinearSVC使用ovr,SVC使用ovo进行多分类,当然,SVC可以选择ovr
差异参考:https://scikit-learn.org/stable/auto_examples/svm/plot_iris_svc.html#sphx-glr-auto-examples-svm-plot-iris-svc-py
SVC
- 支持多种核函数
- LinearSVC is not linear SVM
合页损失函数
当样本被正确分类且函数间隔大于1时,合页损失才是0,否则损失是1-y(wx+b)。
sklearn.svm.SVC 参数设置
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越大,松弛因子越小,对误差要求更小,划分更准确,对噪声敏感
kernel:和函数,有以下:'linear','poly','rbf','sigmoid','precomputed'
0:线性
1:多项式poly
2:RBF
3:sigmoid
degree
多项式poly的维度,默认为3
tol:停止训练的误差值,默认0.001
decision_function_shape:'ovo'、'ovr'或者none,默认为none表示二分类,多分类情况下使用'ovr'或者'ovo'
SVR用于回归
未完待续。。。
参考
https://www.bilibili.com/video/BV1wf4y1F7xU?p=64&spm_id_from=pageDriver
https://apachecn.gitee.io/ailearning/#/docs/ml/6
https://www.jianshu.com/p/3ea7bb62ffe8
https://www.cnblogs.com/liqizhou/archive/2012/05/11/2495788.html