文章目录
【一】 SVM(Support Vector Machine,支持向量机)
【有监督】拥有核函数的分类算法,数学理论基础丰富
【二】 拉格朗日 & KKT条件(LAGrange)
- 拉格朗日(LAGrange)可以把 constrain 变成 non-constrain,举个例子:
{ m i n x 1 2 + x 2 2 s . t x 2 − x 1 = − 1 ⇒ m i n x 1 2 + x 2 2 + λ ( x 2 − x 1 + 1 ) \left\{ \begin{array} { l } { \bm { min \;\; {x_1}^2 + {x_2}^2 } } \\ \\ { \bm { s.t \;\,\,\, x_2-x_1 = -1 } } \end{array} \right. \;\;\;\bm \Rightarrow \;\;\; \bm { min \;\;\;x _ { 1 } ^ { 2 } + x _ { 2 } ^ { 2 } + \lambda \; ( x _ { 2 } - x _ { 1 } + 1 ) } ⎩⎨⎧minx12+x22s.tx2−x1=−1⇒minx12+x22+λ(x2−x1+1)
- 等号 条件处理
{ m i n f ( x ) s . t g i ( x ) = 0 , i = 1 , 2 , . . . , m ⇒ m i n f ( x ) + ∑ i = 1 m λ i ⋅ g i ( x ) \left\{ \begin{array} { l } { \bm { min \;\; f ( x ) } } \\ \\ { \bm { s.t \;\,\,\, g _ i(x) = 0, \;\;\; i = 1,2,...,m } } \end{array} \right. \;\;\;\bm \Rightarrow \;\;\; \bm { min \;\;\; f ( x ) + \sum _ { i = 1 } ^ { m } \red { \lambda _ { i } \cdot g _ { i } ( x ) } } ⎩⎨⎧minf(x)s.tgi(x)=0,i=1,2,...,m⇒minf(x)+i=1∑mλi⋅gi(x)
- 不等号 条件处理
{ m i n f ( x ) s . t h i ( x ) ≤ 0 , i = 1 , 2 , . . . , m ⇒ { m i n f ( x ) + ∑ i = 1 m λ i ⋅ h i ( x ) s . t λ i = 0 , h i ( x ) ≤ 0 s . t λ i > 0 , h i ( x ) = 0 \left\{ \begin{array} { l } { \bm { min \;\; f ( x ) } } \\ \\ { \bm { s.t \;\,\,\, h _ i(x) \leq 0, \;\;\; i = 1,2,...,m } } \end{array} \right. \;\;\;\bm \Rightarrow \;\;\; \left\{ \begin{array} { l } { \bm { min \;\;\; f ( x ) + \sum _ { i = 1 } ^ { m } \red { \lambda _ { i } \cdot h _ { i } ( x ) } } } \\ \\ { \bm { s.t \;\,\,\, \lambda _ { i } = 0, \;\;h _ { i } ( x ) \leq 0 } } \\ \\ { \bm { s.t \;\,\,\, \lambda _ { i } > 0, \;\;h _ { i } ( x ) = 0 } }\end{array} \right. ⎩⎨⎧minf(x)s.thi(x)≤0,i=1,2,...,m⇒⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧minf(x)+∑i=1mλi⋅hi(x)s.tλi=0,hi(x)≤0s.tλi>0,hi(x)=0
- KKT条件
m i n f ( x ) + ∑ i = 1 m λ i ⋅ g i ( x ) + ∑ j = 1 m ′ μ j ⋅ h j ( x ) \bm { min \;\;\; f ( x ) + \sum _ { i = 1 } ^ { m } \red { \lambda _ { i } \cdot g _ { i } ( x ) } + \sum _ { j = 1 } ^ { m ^ { \prime } } \red { \mu _ { j } \cdot h _ { j } ( x ) } } minf(x)+i=1∑mλi⋅gi(x)+j=1∑m′μj⋅hj(x)
s . t { λ i , μ j ≥ 0 , ∀ i ∀ j h j ( x ) ≤ 0 , μ j ⋅ h j ( x ) = 0 , ∀ j s.t \; \left\{ \begin{array} { l } { \bm { \lambda _ { i } \, , \; \mu _ { j } \geq 0 , \;\;\; \forall i \;\,\forall j} } \\ \\ { \bm { h _ { j } ( x ) \leq 0, \;\;\; \mu _ { j } \cdot h _ { j } ( x ) = 0 , \;\;\; \forall j } } \end{array} \right. s.t⎩⎨⎧λi,μj≥0,∀i∀jhj(x)≤0,μj⋅hj(x)=0,∀j
【三】 手撕 SVM(必须掌握)
- 函数距离( d ^ \hat { d } d^)+ 几何距离(d)
![](https://i-blog.csdnimg.cn/blog_migrate/6a3c6a155ab4ad4eac16d219027089ad.png)
- 函数距离 和 几何距离 之间的关系(||W|| 是矩阵 W 的模)
d = d ^ ∥ W ∥ d = \frac { \hat { d } } { \| W \| } d=∥W∥d^
- 最大化 两条虚线间的间隔
γ = 2 ∥ W ∥ \gamma = \frac { 2 } { \| W \| } γ=∥W∥2
- 目标函数(数学模型)
{ m i n 1 2 ∥ w ∥ 2 y i ⋅ ( w T x i + b ) ≥ 1 \left\{ \begin{array} { l } { \bm { min \, \frac { 1 } { 2 } \| w \| ^ { 2 } } } \\ \\ { \bm { y _ { i } \cdot ( w ^ { T } x _ { i } + b ) \geq 1 } } \end{array} \right. ⎩⎨⎧min21∥w∥2yi⋅(wTxi+b)≥1
- 个别点 不满足限制条件:添加松弛变量 ξ
![](https://i-blog.csdnimg.cn/blog_migrate/96e4b270fa500c72d10d31a1d7365c2d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/080baaba8862038e20a0f08f684bc0ca.png)
- 引入 松弛变量 ξ 后的 目标函数
{ m i n 1 2 ∥ w ∥ 2 + λ ∑ i = 1 n ξ i y i ⋅ ( w T x i + b ) ≥ 1 − ξ i \left\{ \begin{array} { l } { \bm { min \,\; \frac { 1 } { 2 } \| w \| ^ { 2 } + \lambda \sum _ { i = 1 } ^ { n } \xi _ { i }} } \\ \\ { \bm { y _ { i } \cdot ( w ^ { T } x _ { i } + b ) \geq { 1- \xi_i } } } \end{array} \right. ⎩⎨⎧min21∥w∥2+λ∑i=1nξiyi⋅(wTxi+b)≥1−ξi
- Hinge Loss 损失函数 :正是因为 HingeLoss 的 零区域 对应的正是 非支持向量 的普通样本,从而所有的普通样本都 不参与 最终超平面的决定,这才是支持向量机最大的优势所在,对训练样本数目的依赖大大减少,而且提高了训练效率
L o s s = m a x ( 0 , 1 − y i ( w T x i + b ) \bm { Loss = max \,(\, 0 \,,\, 1-y _ { i } ( w ^ { T } x _ { i } + b \,) } Loss=max(0,1−yi(wTxi+b)
- SVM 的 KKT 条件(不等号处理)
m i n 1 2 ∣ ∣ w ∣ ∣ 2 + ∑ i = 1 n λ i ⋅ [ 1 − y i ⋅ ( w T x i + b ) ] \bm { min \;\;\; \frac { 1 } { 2 } | | w | | ^ { 2 } + \sum _ { i = 1 } ^ { n } \lambda _ { i } \cdot [\, 1 - y _ { i } \cdot ( w ^ { T } x _ { i } + b ) \,] } min21∣∣w∣∣2+i=1∑nλi⋅[1−yi⋅(wTxi+b)]
s
.
t
{
λ
i
≥
0
,
∀
i
[
1
−
y
i
⋅
(
w
T
x
i
+
b
)
]
≤
0
,
∀
i
λ
i
⋅
[
1
−
y
i
⋅
(
w
T
x
i
+
b
)
]
=
0
,
∀
i
s.t \; \left\{ \begin{array} { l } { \bm { \lambda _ { i } \geq 0 , \;\;\; \forall i } } \\ \\ { \bm { [\, 1 - y _ { i } \cdot ( w ^ { T } x _ { i } + b ) \,] \leq0 , \;\;\; \forall i } } \\ \\ { \bm { \lambda _i \cdot [\, 1 - y _ { i } \cdot ( w ^ { T } x _ { i } + b ) \,] = 0 , \;\;\; \forall i } } \end{array} \right.
s.t⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧λi≥0,∀i[1−yi⋅(wTxi+b)]≤0,∀iλi⋅[1−yi⋅(wTxi+b)]=0,∀i
- SVM 的 Dual Problem(对偶问题,
x
i
T
x
j
\bm \red { x _ { i } ^ { T } x _ { j } }
xiTxj 是使用 Kernel Trick 的关键)
m i n − 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j x i T x j + 1 2 ∑ i = 1 n λ i \bm { min \;\;\; - \frac { 1 } { 2 } \sum _ { i = 1 } ^ { n } \sum _ { j = 1 } ^ { n } \lambda _ { i } \, \lambda _ { j } \, y _ { i } \, y _ { j } \, \red { x _ { i } ^ { T } x _ { j } } + \frac { 1 } { 2 } \sum _ { i = 1 } ^ { n } \lambda _ { i } } min−21i=1∑nj=1∑nλiλjyiyjxiTxj+21i=1∑nλi
s . t { λ i ≥ 0 , ∀ i [ 1 − y i ⋅ ( w T x i + b ) ] ≤ 0 , ∀ i λ i ⋅ [ 1 − y i ⋅ ( w T x i + b ) ] = 0 , ∀ i ∂ L ∂ w : w = ∑ i = 1 n λ i y i x i ∂ L ∂ b : ∑ i = 1 n λ i y i = 0 s.t \; \left\{ \begin{array} { l } { \bm { \lambda _ { i } \geq 0 , \;\;\; \forall i } } \\ \\ { \bm { [\, 1 - y _ { i } \cdot ( w ^ { T } x _ { i } + b ) \,] \leq0 , \;\;\; \forall i } } \\ \\ { \bm { \lambda _i \cdot [\, 1 - y _ { i } \cdot ( w ^ { T } x _ { i } + b ) \,] = 0 , \;\;\; \forall i } } \\ \\ { \bm { \frac { \partial L } { \partial w } : w = \sum _ { i = 1 } ^ { n } \lambda _ { i } y _ { i } x _ { i } } } \\ \\ { \bm { \frac { \partial L } { \partial b } : \sum _ { i = 1 } ^ { n } \lambda _ { i } y _ { i } = 0 } } \end{array} \right. s.t⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧λi≥0,∀i[1−yi⋅(wTxi+b)]≤0,∀iλi⋅[1−yi⋅(wTxi+b)]=0,∀i∂w∂L:w=∑i=1nλiyixi∂b∂L:∑i=1nλiyi=0
【四】 Kernel Trick(核函数)
- Linear(线性核)
k ( x , y ) = x T y k ( x , y ) = \bm {x ^ { T } y} k(x,y)=xTy
- Polynomial(多项式核)
k ( x , y ) = ( 1 + x T y ) d k ( x , y ) = \bm { ( 1 + x ^ { T } y ) ^ { d }} k(x,y)=(1+xTy)d
- Gaussian(高斯核)
k ( x , y ) = e x p ( − ∥ x − y ∥ 2 2 σ 2 ) k ( x , y ) = \bm {exp \,(\frac { - \| x - y \| ^ { 2 } } { 2 \sigma ^ { 2 } })} k(x,y)=exp(2σ2−∥x−y∥2)
- 如何选择核函数
- 如果特征的数量大到和样本数量差不多,则选用 LR 或者 线性核 的SVM
- 如果特征的数量小,样本的数量正常,则选用 SVM+高斯核函数
- 如果特征的数量小,样本的数量非常大,则需要手工添加一些特征从而变成第一种情况
【五】 SVM 代码使用(Sklearn)
from sklearn.svm import SVC, LinearSVC
'''
:param (参数)
decision_function_shape: 'ovo' 实现多分类
kernel: 选择不同的核函数
'''
svm = SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape=None, degree=3,
gamma='auto', kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
svm = LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, intercept_scaling=1,loss='squared_hinge',
max_iter=1000, multi_class='ovr', penalty='l2', random_state=None, tol=0.0001, verbose=0)
'''
:object (方法)
svm.fit(X,y): SVM 是有监督的机器学习算法
svm.predict(X): 返回数据 X 预测的类别
'''