SVM算法原理详解及python实现

SVM算法

  • 算法原理
  • 对数据的要求
  • 算法的优缺点
  • 算法需要注意的点
  • 算法实现(python)(待更.........)

算法原理

{ w T x + b > 0 y i = 1 ⟺ y ( x i ) > 0 w T x + b < 0 y i = − 1 ⟺ y ( x i ) < 0 \begin{cases} w^Tx+b>0 \quad y_i=1 \Longleftrightarrow y(x_i)>0\\ w^Tx+b<0 \quad y_i=-1 \Longleftrightarrow y(x_i)<0\\ \end{cases} {wTx+b>0yi=1y(xi)>0wTx+b<0yi=1y(xi)<0
将点到直线的距离转化为: ∣ w T x + b ∣ ∣ ∣ w ∣ ∣ ( 几 何 间 距 ) ⟺ y i ∣ w T x + b ∣ ⩾ 0 ∣ ∣ w ∣ ∣ ( 函 数 间 隔 ) \frac{|w^Tx+b|}{||w||}(几何间距)\Longleftrightarrow\frac{y_i|w^Tx+b|\geqslant0}{||w||}(函数间隔) wwTx+b()wyiwTx+b0()

进行缩放变换:使 ∣ Y ∣ ⩾ 1 ⇒ y i ∣ w T x + b ∣ ⩾ 1 |Y|\geqslant1\Rightarrow y_i|w^Tx+b|\geqslant1 Y1yiwTx+b1(之前我们认为恒大于0,现在严格了些)

优化目标: a r g m a x ( w , b ) { 1 ∣ ∣ w ∣ ∣ m i n ( i ) [ y i ( w T x + b ) ] } argmax(w,b)\{\frac{1}{||w||}min(i)[y_i(w^Tx+b)]\} argmax(w,b){w1min(i)[yi(wTx+b)]}

优化目标: a r g m a x ( w , b ) { 1 ∣ ∣ w ∣ ∣ } s t . y i ∣ w T x + b ∣ ⩾ 1 argmax(w,b)\{\frac{1}{||w||}\} \quad st. y_i|w^Tx+b|\geqslant1 argmax(w,b){w1}st.yiwTx+b1

优化目标: m i n ( w , b ) { 1 2 ∣ ∣ w ∣ ∣ 2 } s t . y i ∣ w T x + b ∣ ⩾ 1 min(w,b)\{\frac{1}{2}{||w||^2}\} \quad st. y_i|w^Tx+b|\geqslant1 min(w,b){21w2}st.yiwTx+b1

拉格朗日乘子法求解: L ( ω , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 n α i ( y i ( w T x i + b ) − 1 ) s t . y i ∣ w T x + b ∣ ⩾ 1 L(\omega,b,\alpha)=\frac{1}{2}{||w||^2}-\sum_{i=1}^n\alpha_i(y_i(w^Tx_i+b)-1) \quad st. y_i|w^Tx+b|\geqslant1 L(ω,b,α)=21w2i=1nαi(yi(wTxi+b)1)st.yiwTx+b1

求导可得:
{ ∂ L ∂ ω = ω − ∑ i = 1 n α i y i x i = 0 ∂ L ∂ b = ∑ i = 1 n α i y i = 0 \begin{cases} \frac{\partial L}{\partial \omega}=\omega-\sum_{i=1}^n\alpha_iy_ix_i=0\\ \frac{\partial L}{\partial b}=\sum_{i=1}^n\alpha_iy_i=0\\ \end{cases} {ωL=ωi=1nαiyixi=0bL=i=1nαiyi=0

将求导后的式子带入L可得: L ( ω , b , α ) = ∑ i = 1 n α i − 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j x i x j s t . ∑ i = 1 n α i y i ⩾ 0 且 α i ⩾ 0 L(\omega,b,\alpha)=\sum_{i=1}^n\alpha_i-\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_jx_ix_j \quad st. \sum_{i=1}^n\alpha_iy_i\geqslant0且\alpha_i\geqslant0 L(ω,b,α)=i=1nαi21i=1nj=1nαiαjyiyjxixjst.i=1nαiyi0αi0

求解得:
{ α i = 0 不 是 支 持 向 量 α i ≠ 0 是 支 持 向 量 \begin{cases} \alpha_i=0\quad不是支持向量\\ \alpha_i\ne0\quad是支持向量 \end{cases} {αi=0αi=0

对数据的要求

  1. 对于 缺失值需要处理(填充或者删除)
  2. 分类变量需要编码(涉及距离计算)
  3. 数据需要标准化或者归一化处理(消除量纲的影响。涉及距离计算的算法都需要考虑)

算法的优缺点

一、优点
1.SVM只由支持向量决定,计算的复杂度取决于支持向量的数量,在某种意义上避免‘维度灾难’
2. 具有一定的鲁棒性(增删非支持向量对模型无影响)
3. 理论完善

一、缺点
1.大规模训练样本难以实施,存储与计算将耗费大量内存与时间
2.对缺失数据敏感
3. 可解释能力弱
4. 解决多分类问题困难
5. 核函数选择不易

算法需要注意的点

1. SVM几种原理
1、线性可分: 硬间隔最大化
2、线性近似可分(有个别点偏移): 引入松弛变量(软间隔最大化)
3、非线性支持向量机(引入线性核函数(实际求解时不在高维上,因为可能无穷维,求解不易),线性不可分): 高斯核 K ( x , x i ) = e x p ( − ∣ ∣ x − x i ∣ ∣ 2 σ 2 ) ( σ 小 会 带 来 过 拟 合 ) K(x,x_i)=exp(-\frac{||x-x_i||^2}{\sigma^2})(\sigma小会带来过拟合) K(x,xi)=exp(σ2xxi2)(σ)

2. SVM为什么采用间隔最大化?
获得最优解,泛化能力最强(因为解有无穷多个)

3. SVM处理多分类问题?
1、一对多: 将某一类归一类,其余类归一类共训练K个类K个分类器,用K个分类器来测试新样本,哪个分类器概率(p)高就预测为哪一类(bias较高)
2、一对一: 任意两个类训练一个分类器,一共训练 C k 2 C_k^2 Ck2个分类器,最后投票判别

算法实现(python)(待更…)

你可能感兴趣的:(机器学习算法(分类))