支持向量机 数模打卡

支持向量机

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+b1,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∣∣w2.

2. 对偶问题

求解上述最小化问题,这是一个凸二次规划问题。
可以用拉格朗日乘子法得到对偶问题,限定拉格朗日乘子 α i ≥ 0 \alpha_{i}\ge 0 αi0得到拉格朗日函数 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∣∣w2+i=1mαi(1yi(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=1mαi21i=1mj=1mαiαjyiyjxiTxj()s.t.i=1mαiyi=0,αi0解出α得到 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=1mα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=S1S(ysiϵ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=1mα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∣∣w2+Ci=1ml0/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=1ml(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∣∣w2+Ci=1mlϵ(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∣∣w2+Ci=1m(ξi+ξi^)s.t.f(xi)yiϵ+ξi,yif(xi)ϵ+ξi^,ξi0,ξ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=1m(αi^αi)xiTx+b.b=yi+ϵi=1m(α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=Ω(∣∣hH)+(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)

一些运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值