文章目录
- 1 SVM算法原理
- 1.1 目标函数确定
- 1.2 约束条件优化问题转换
- 1.3 对偶问题转换
- 1.4 确定超平面
- 1.5 计算举例
- 1.6 SVM原理小节
- 2 SVM核函数
- 2.1 核函数的作用
- 2.2 核函数分类
- 2.3 高斯核函数
- 2.3 高斯核函数API
- 2.4 超参数 γ \gamma γ
1 SVM算法原理
1.1 目标函数确定
SVM思想:要去求一组参数(w,b),使其构建的超平面函数能够最优地分离两个集合
样本空间中任意点x到超平面(w,b)的距离可写成:
欲找到具有最大间隔的划分超平面,也就是要找到能满足下式中约束的参数w和b,使得间隔γ最大。
- y为正例的时候取值为1,y为负例的时候取值为-1
距离超平面最近的几个训练样本点使上式等号成立,他们被称为“支持向量”,两个异类支持向量到超平面的距离之和为:
1.2 约束条件优化问题转换
1.3 对偶问题转换
此时,求解当 α 是什么值时,该值会变得很大,当求出 α 值,再求解 w, b 值。此时,就变成了极大极小值问题。
1.4 确定超平面
1.5 计算举例
1.6 SVM原理小节
- 支持向量机公式推导最主要找到 w、b 的求解方法
- α 非0的样本为支持向量
2 SVM核函数
2.1 核函数的作用
核函数将原始输入空间映射到新的特征空间,从而,使原本线性不可分的样本可能在核空间可分。
2.2 核函数分类
当存在线性不可分的场景时,我们需要使用核函数来提高训练样本的维度、或者将训练样本投向高维
- 线性核:一般是不增加数据维度,而是预先计算内积,提高速度
- 多项式核:一般是通过增加多项式特征,提升数据维度,并计算内积
- 高斯核(RBF、径向基函数):一般是通过将样本投射到无限维空间,使得原来不可分的数据变得可分。高斯核函数使用的最多。
SVM 默认使用 RBF 核函数,将低维空间样本投射到高维空间,再寻找分割超平面。
2.3 高斯核函数
高斯核 Radial Basis Function Kernel (径向基函数,又称RBF核)
- γ = 1 2 σ 2 \gamma=\frac {1}{2\sigma^2} γ=2σ21
- γ \gamma γ是超参数,作用与标准差相反
- γ \gamma γ越大,高斯分布越窄,数据越集中; γ \gamma γ越小,高斯分布越宽,数据越分散
2.3 高斯核函数API
from sklearn.svm import SVC
SVC(kernel="rbf",gamma=gamma)
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from plot_util import plot_decision_boundary
# 获取数据
x,y=make_moons(noise=0.15)
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()
# 构建函数
def RBFsvm(gamma=0.1):
return Pipeline(
[
('std_scalar',StandardScaler()),
('svc',SVC(kernel='rbf',gamma=gamma))
]
)
# 实验
# svc1 =RBFsvm(0.5)
# x_std=svc1['std_scalar'].fit_transform(x)
# svc1.fit(x_std,y)
# plot_decision_boundary(svc1,axis=[-3,3,-3,3])
# plt.scatter(x_std[y==0,0],x_std[y==0,1])
# plt.scatter(x_std[y==1,0],x_std[y==1,1])
# plt.show()
svc1 =RBFsvm(1.0)
svc1.fit(x,y)
plot_decision_boundary(svc1,axis=[-1.5,2.5,-1,1.5])
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()
svc2 =RBFsvm(100)
svc2.fit(x,y)
plot_decision_boundary(svc2,axis=[-1.5,2.5,-1,1.5])
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()
svc3 =RBFsvm(0.1)
svc3.fit(x,y)
plot_decision_boundary(svc3,axis=[-1.5,2.5,-1,1.5])
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
plt.show()