支持向量机
1. 间隔与支持向量
划分超平面,将不同类别的样本分开->最鲁棒、泛化能力最强的划分超平面->
- 划分超平面的描述 w T x + b = 0 w^{T}x+b=0 wTx+b=0w为决定超平面方向的法向量,b为位移项。
- 正确分类的条件: w T x i + b w^{T}x_{i}+b wTxi+b的正负由 y i y_{i} yi正负决定。令 { w T x i + b ≥ + 1 , y i = + 1 w T x i + b ≤ − 1 , y i = − 1 \left\{\begin{matrix} w_{T}x_{i}+b\ge +1, y_{i}=+1\\ w_{T}x_{i}+b\le -1, y_{i}=-1 \end{matrix}\right. {wTxi+b≥+1,yi=+1wTxi+b≤−1,yi=−1使等号成立的训练样本点称为支持向量。两个异类支持向量到超平面的距离之和为 γ = 2 ∣ ∣ w ∣ ∣ \gamma=\frac{2}{||w||} γ=∣∣w∣∣2,称为“间隔”margin。
- 欲找到有最大间隔的划分超平面,即找到满足上述约束的w和b 使得 γ \gamma γ最大,即 max w , b 2 ∣ ∣ w ∣ ∣ s . t . y i ( w T x i + b ) ≥ 1 , i = 1 , 2 , … , m . \max\limits_{w,b}\frac{2}{||w||}\\s.t. y_{i}(w_{T}x_{i}+b)\ge 1,i=1,2,…,m. w,bmax∣∣w∣∣2s.t.yi(wTxi+b)≥1,i=1,2,…,m.也即是最小化 1 2 ∣ ∣ w ∣ ∣ 2 . \frac{1}{2}||w||^{2}. 21∣∣w∣∣2.
2. 对偶问题
求解上述最小化问题,这是一个凸二次规划问题。
可以用拉格朗日乘子法得到对偶问题,限定拉格朗日乘子
α
i
≥
0
\alpha_{i}\ge 0
αi≥0得到拉格朗日函数
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
2
+
∑
i
=
1
m
α
i
(
1
−
y
i
(
w
T
x
i
+
b
)
)
L(w,b,\alpha)=\frac{1}{2}||w||^{2}+\sum_{i=1}^{m}\alpha_{i}(1-y_{i}(w^{T}x_{i}+b))
L(w,b,α)=21∣∣w∣∣2+i=1∑mαi(1−yi(wTxi+b))求偏导、代入得
对偶问题:
max
α
∑
i
=
1
m
α
i
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
x
i
T
x
j
(
♡
)
s
.
t
.
∑
i
=
1
m
α
i
y
i
=
0
,
α
i
≥
0
对偶问题:\max\limits_{\alpha}\sum_{i=1}^{m}\alpha_{i}-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}^{T}x_{j}(\hearts)\\s.t.\sum_{i=1}^{m}\alpha_{i}y_{i}=0,\alpha_{i}\ge0
对偶问题:αmaxi=1∑mαi−21i=1∑mj=1∑mαiαjyiyjxiTxj(♡)s.t.i=1∑mαiyi=0,αi≥0解出α得到
f
(
x
)
=
w
T
x
+
b
=
∑
i
=
1
m
α
i
y
i
x
i
T
x
+
b
f(x)=w_{T}x+b=\sum_{i=1}^{m}\alpha_{i}y_{i}x_{i}^{T}x+b
f(x)=wTx+b=i=1∑mαiyixiTx+b该求和过程还意味着最终模型只与支持向量有关,因为由KKT条件,任意样本有
α
i
=
0
\alpha_{i}=0
αi=0或
y
i
f
(
x
i
)
=
1
y_{i}f(x_{i})=1
yif(xi)=1。
- SMO算法求解( ♡ \hearts ♡):每次选择两个α,固定其他参数,求解此式,重复这两步。转为关于αi的单变量二次规划问题。
- 对于b,使用所有支持向量求解的平均值 b = 1 ∣ S ∣ ∑ s ϵ S ( y s − ∑ i ϵ S α i y i x i T x s ) . b=\frac{1}{|S|}\sum_{s\epsilon S}(y_{s}-\sum_{i\epsilon S} \alpha_{i}y_{i}x_{i}^{T}x_{s}). b=∣S∣1sϵS∑(ys−iϵS∑αiyixiTxs).
3. 核函数
原始空间中并不线性可分->升维(存在性->)。
- 令 ϕ ( x ) \phi(x) ϕ(x)表示将x映射后的特征向量,模型为 f ( x ) = w T ϕ ( x ) + b , f(x)=w_{T}\phi(x)+b, f(x)=wTϕ(x)+b,定义函数 κ \kappa κ来计算高维空间内积: κ ( x i , x j ) = < ϕ ( x i ) , ϕ ( x j ) > = ϕ ( x i ) T ϕ ( x j ) \kappa(x_{i},x_{j})=<\phi(x_{i}),\phi(x_{j})>=\phi(x_{i})^{T}\phi(x_{j}) κ(xi,xj)=<ϕ(xi),ϕ(xj)>=ϕ(xi)Tϕ(xj)类似2求解得到 f ( x ) = w T ϕ ( x ) + b = ∑ i = 1 m α i y i κ ( x , x i ) + b f(x)=w_{T}\phi(x)+b=\sum_{i=1}^{m}\alpha_{i}y_{i}\kappa(x,x_{i})+b f(x)=wTϕ(x)+b=i=1∑mαiyiκ(x,xi)+b
- 如何得到合适的核函数:
定理 核函数作用于所有数据对得到核矩阵K是半正定的。反之,一个对称函数所对应的核矩阵半正定,就能作为核函数使用。也即是:任何一个核函数都隐式地定义了一个称为“再生核Hilbert空间”的特征空间。且容易得核函数的线性组合、直积,及 g ( x ) κ ( x , z ) g ( z ) g(x)\kappa(x,z)g(z) g(x)κ(x,z)g(z)也是核函数。
4. 软间隔与正则化
允许支持向量机在一些样本上出错:soft margin.
优化目标改为
min
w
,
b
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
=
1
m
l
0
/
1
(
y
i
(
w
T
x
i
+
b
)
−
1
)
\min\limits_{w,b}\frac{1}{2}||w||^{2}+C\sum_{i=1}^{m}l_{0/1}(y_{i}(w^{T}x_{i}+b)-1)
w,bmin21∣∣w∣∣2+Ci=1∑ml0/1(yi(wTxi+b)−1)其中
l
0
/
1
l_{0/1}
l0/1为“0/1损失函数”,即自变量<0时取1,其他情况取0.而C的值影响“软硬程度”,C无穷大,转化为硬间隔。
替代损失surrogate loss:
l
0
/
1
l_{0/1}
l0/1数学性质不太好时用于替代它,例如:
优化目标可以写成 min f Ω ( f ) + C ∑ i = 1 m l ( f ( x i ) , y i ) \min\limits_{f}\Omega(f)+C\sum_{i=1}^{m}l(f(x_{i}),y_{i}) fminΩ(f)+Ci=1∑ml(f(xi),yi)前称结构风险,描述模型f的性质;后称经验风险,描述模型与训练数据的契合程度。此式可以成为“正则化”(regularization)问题,Ω成为正则化项,C称为正则化常数。常用 L p L_{p} Lp范数作正则化项。
5. 支持向量回归
支持向量回归SVR能够容忍f(x)与y之间最多有
ϵ
\epsilon
ϵ的偏差,超出这个范围才算损失。也即是构建了一个间隔带。
SVR问题可以形式化为
min
w
,
b
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
=
1
m
l
ϵ
(
f
(
x
i
)
−
y
i
)
,
\min\limits_{w,b}\frac{1}{2}||w||^{2}+C\sum_{i=1}^{m}l_{\epsilon}(f(x_{i})-y_{i}),
w,bmin21∣∣w∣∣2+Ci=1∑mlϵ(f(xi)−yi),其中C为正则化常数,
ℓ
ϵ
(
z
)
=
{
0
,
if
∣
z
∣
⩽
ϵ
∣
z
∣
−
ϵ
,
otherwise
\ell_{\epsilon}(z)=\left\{\begin{array}{ll} 0, & \text { if }|z| \leqslant \epsilon \\ |z|-\epsilon, & \text { otherwise } \end{array}\right.
ℓϵ(z)={0,∣z∣−ϵ, if ∣z∣⩽ϵ otherwise 引入松弛变量得
min
w
,
b
,
ξ
i
,
ξ
i
^
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
=
1
m
(
ξ
i
+
ξ
i
^
)
s
.
t
.
f
(
x
i
)
−
y
i
≤
ϵ
+
ξ
i
,
y
i
−
f
(
x
i
)
≤
ϵ
+
ξ
i
^
,
ξ
i
≥
0
,
ξ
i
^
≥
0.
\min\limits_{w,b,\xi_{i},\hat{\xi_{i}}}\frac{1}{2}||w||^{2}+C\sum_{i=1}^{m}(\xi_{i}+\hat{\xi_{i}})\\s.t.f(x_{i})-y_{i}\le \epsilon+\xi_{i},\\y_{i}-f(x_{i})\le \epsilon+\hat{\xi_{i}},\\\xi_{i}\ge 0,\hat{\xi_{i}}\ge 0.
w,b,ξi,ξi^min21∣∣w∣∣2+Ci=1∑m(ξi+ξi^)s.t.f(xi)−yi≤ϵ+ξi,yi−f(xi)≤ϵ+ξi^,ξi≥0,ξi^≥0.同理用拉格朗日乘子法,结合KKT条件得SVR的解形如
f
(
x
)
=
∑
i
=
1
m
(
α
i
^
−
α
i
)
x
i
T
x
+
b
.
b
=
y
i
+
ϵ
−
∑
i
=
1
m
(
α
i
^
−
α
i
)
x
i
T
x
.
f(x)=\sum_{i=1}^{m}(\hat{\alpha_{i}}-\alpha_{i})x_{i}^{T}x+b.\\b=y_{i}+\epsilon-\sum_{i=1}^{m}(\hat{\alpha_{i}}-\alpha_{i})x_{i}^{T}x.
f(x)=i=1∑m(αi^−αi)xiTx+b.b=yi+ϵ−i=1∑m(αi^−αi)xiTx.特征映射形式则对应引入
κ
\kappa
κ核函数即可。
6. 核方法
表示定理:给定再生核希尔伯特空间H、范数定义,对于任意单调递增函数 Ω \Omega Ω和非负损失函数 ℓ \ell ℓ,优化问题 min h ϵ H = Ω ( ∣ ∣ h ∣ ∣ H ) + ℓ ( h ( x 1 ) , h ( x 2 , … , h ( x m ) ) \min\limits_{h\epsilon H}=\Omega(||h||_{H})+\ell(h(x_{1}),h(x_{2},…,h(x_{m})) hϵHmin=Ω(∣∣h∣∣H)+ℓ(h(x1),h(x2,…,h(xm))的解总能写成 h ∗ ( x ) = ∑ i = 1 m α i κ ( x , x i ) . h^{*}(x)=\sum_{i=1}^{m}\alpha_{i}\kappa(x,x_{i}). h∗(x)=∑i=1mαiκ(x,xi).
- 核方法指基于核函数的学习方法,最常见的是通过“核化”来将线性学习器拓展为非线性学习器。
- 核线性判别分析KLDA:通过核化对线性判别分析进行非线性拓展。
- 关键步骤:通过映射
ϕ
\phi
ϕ将样本映射到特征空间,用线性判别分析可以求得
h
(
x
)
=
w
T
ϕ
(
x
)
h(x)=w_{T}\phi(x)
h(x)=wTϕ(x)。
可用核函数 κ ( x , x i ) = ϕ ( x i ) T ϕ ( x ) \kappa(x,x_{i})=\phi(x_{i})^{T}\phi(x) κ(x,xi)=ϕ(xi)Tϕ(x)来隐式地表达此映射和特征空间。而由表示定理 h ( x ) = ∑ i = 1 m α i κ ( x , x i ) h(x)=\sum_{i=1}^{m}\alpha_{i}\kappa(x,x_{i}) h(x)=∑i=1mαiκ(x,xi)可完成转化。
代码(参考https://blog.csdn.net/m0_72195508/article/details/140480741)
import numpy as np
from scipy import stats
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn import svm
from sklearn.metrics import accuracy_score
# 设置文件路径
file_path = '多分类水果数据.csv'
# 使用 pandas 的 read_csv 函数读取 CSV 文件,注意查看csv文件的编码,默认不填为utf-8编码
data = pd.read_csv(file_path,encoding='gbk')
# 显示数据的前几行来验证读取是否成功
print(data.head())
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.width', 300) # 设置打印宽度(**重要**)
print(data.isnull().any())
# 划分数据
# 选择第二列到最后一列,第一列相当于序号列可以忽略
X = data.iloc[0:59, 1:5] # [:)左闭右开
#选择数据的特征列(第2列到第5列)作为特征矩阵 X,第6列作为标签 Y
Y = data.iloc[0:59, 6]
# 划分数据集为训练集和验证集
X_train, X_valid, Y_train, Y_valid = train_test_split(X, Y, test_size=0.2, random_state=42)
# 使用验证集进行预测,并打印模型的准确率。
# RBF 核函数
rbf_model = svm.SVC(kernel='rbf', gamma='auto')
rbf_model.fit(X_train, Y_train)
rbf_pred = rbf_model.predict(X_valid)
print("RBF Kernel Accuracy:", accuracy_score(Y_valid, rbf_pred))
# 多项式核函数
poly_model = svm.SVC(kernel='poly', degree=3)
poly_model.fit(X_train, Y_train)
poly_pred = poly_model.predict(X_valid)
print("Polynomial Kernel Accuracy:", accuracy_score(Y_valid, poly_pred))
# Sigmoid 核函数
sigmoid_model = svm.SVC(kernel='sigmoid')
sigmoid_model.fit(X_train, Y_train)
sigmoid_pred = sigmoid_model.predict(X_valid)
print("Sigmoid Kernel Accuracy:", accuracy_score(Y_valid, sigmoid_pred))
# 选择新数据并进行预测
test_X = data.iloc[59:, 1:5]
# print(test_X)
test_Y = data.iloc[59:, 6]
# print(test_Y)
#举例:若为xxx核函数,此处以rbf为例
#预测数据
rbf_pred_test = rbf_model.predict(test_X)
print(rbf_pred_test)
一些运行结果: