机器学习算法_支持向量机
支持向量机只能做二分类任务SVM全称支持向量机,即寻找到一个超平面使样本分成两类,且间隔最大硬间隔:如果样本线性可分,在所有样本分类都正确的情况下,寻找最大间隔;如果出现异常值或样本线性不可分,此时硬间隔无法实现软间隔:允许部分样本,在最大间隔之内,甚至在错误的一边,寻找最大间隔;目标是尽可能保持间隔宽阔和限制间隔违例之间寻找良好的平衡惩罚系数:通过惩罚系数来控制这个平衡,C值越小,则间隔越宽,分
一、支持向量机
-
支持向量机只能做二分类任务
-
SVM全称支持向量机,即寻找到一个超平面使样本分成两类,且间隔最大
-
硬间隔:如果样本线性可分,在所有样本分类都正确的情况下,寻找最大间隔;如果出现异常值或样本线性不可分,此时硬间隔无法实现
-
软间隔:允许部分样本,在最大间隔之内,甚至在错误的一边,寻找最大间隔;目标是尽可能保持间隔宽阔和限制间隔违例之间寻找良好的平衡
-
惩罚系数:通过惩罚系数来控制这个平衡,C值越小,则间隔越宽,分错的样本个数也就越多;反之,C值越大,则间隔越窄,分错的样本个数越少
二、LinearSVC_API
class sklearn.svm LinearSVC(C = 1.0)
- 示例
from plot_util import plot_decision_boundary_svc, plot_decision_boundary
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.svm import LinearSVC
X, y = load_iris(return_X_y= True)
x = X[y < 2, :2]
y = y[y < 2]
plt.scatter(x[y == 0, 0], x[y == 0, 1], c = 'r')
plt.scatter(x[y == 1, 0], x[y == 1, 1], c = 'b')
plt.show()
# 特征处理
transform = StandardScaler()
x_tran = transform.fit_transform(x)
# 模型训练
model = LinearSVC(C = 30)
model.fit(x_tran, y)
y_pre = model.predict(x_tran)
print(accuracy_score(y, y_pre))
# 可视化处理
plot_decision_boundary_svc(model, axis = [-3, 3, -3, 3])
plt.scatter(x_tran[y == 0, 0], x_tran[y == 0, 1], c = 'r')
plt.scatter(x_tran[y == 1, 0], x_tran[y == 1, 1], c = 'b')
plt.show()
# 模型训练
model = LinearSVC(C = 0.01)
model.fit(x_tran, y)
y_pre = model.predict(x_tran)
print(accuracy_score(y, y_pre))
# 可视化处理
plot_decision_boundary_svc(model, axis = [-3, 3, -3, 3])
plt.scatter(x_tran[y == 0, 0], x_tran[y == 0, 1], c = 'r')
plt.scatter(x_tran[y == 1, 0], x_tran[y == 1, 1], c = 'b')
plt.show()
三、SVM算法原理
要去求一组参数(w, b),使其构建的超平面函数能够最优地分离两个集合
样本空间中任一点x到超平面(w, b)的距离可写成:r=wTx+b∣∣w∣∣r = \frac{w^Tx+b}{||w||}r=∣∣w∣∣wTx+b,想要找到具有最大间隔的划分超平面,也就是要找到能满足下式中约束的参数w和b,使得间隔γ\gammaγ最大
{wTxi+b⩾+1,yi=+1;wTxi+b⩽−1,yi=−1.\begin{cases} \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i} + b \geqslant +1, & y_{i} = +1; \\ \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i} + b \leqslant -1, & y_{i} = -1. \end{cases}{wTxi+b⩾+1,wTxi+b⩽−1,yi=+1;yi=−1.
距离超平面最近的几个训练样本点使上式等号成立,他们被称为“支持向量”,两个异类支持向量到超平面的距离之和为(最大间隔距离表示):2∣∣w∣∣\frac{2}{||w||}∣∣w∣∣2
-
训练样本:{wTxi+b⩾+1,yi=+1;wTxi+b⩽−1,yi=−1.\begin{cases} \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i} + b \geqslant +1, & y_{i} = +1; \\ \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i} + b \leqslant -1, & y_{i} = -1. \end{cases}{wTxi+b⩾+1,wTxi+b⩽−1,yi=+1;yi=−1.则目标函数可以写成:maxw,b=2∣∣w∣∣s.t.yi(wTxi+b)⩾1,其中i=1,2,3,…,mmax_{w, b} = \frac{2}{||w||}s.t.y_i(w^Tx_i+b) \geqslant 1,其中i=1,2,3,\dots, mmaxw,b=∣∣w∣∣2s.t.yi(wTxi+b)⩾1,其中i=1,2,3,…,m
-
将目标函数进一步优化:minw,b=12∣∣w∣∣2s.t.yi(wTxi+b)⩾1,其中i=1,2,3,…,mmin_{w, b} = \frac{1}{2}||w||^2 s.t.y_i(w^Tx_i+b) \geqslant 1,其中i = 1, 2, 3, \dots, mminw,b=21∣∣w∣∣2s.t.yi(wTxi+b)⩾1,其中i=1,2,3,…,m
-
添加核函数,将目标函数转化成以下形式:KaTeX parse error: {align*} can be used only in display mode.
-
构建拉格朗日函数:其中αi\alpha_iαi为拉格朗日乘子(相当于λi\lambda_iλi):L(w,b,α)=12∣∣w∣∣2−∑i=1nαi(1−yi(wT⋅Φ(xi)+b)−1)……①L(w, b, \alpha) = \frac{1}{2}||w||^2-\sum_{i = 1}^{n} \alpha_i\left(1 - y_{i} \left(\boldsymbol{w}^{\mathrm{T}} \cdot \boldsymbol{\varPhi}(x_{i}) + b\right)-1\right) \dots \dots ①L(w,b,α)=21∣∣w∣∣2−∑i=1nαi(1−yi(wT⋅Φ(xi)+b)−1)……①
-
要想求得极小值,上式后半部分应该取的极大值:minw,bmaxαL(w,b,α)<==>maxαminw,bL(w,b,α)min_{w, b}max_{\alpha}L(w, b, \alpha) <==> max_{\alpha }min_{w, b}L(w, b, \alpha)minw,bmaxαL(w,b,α)<==>maxαminw,bL(w,b,α)
-
要找minw,bL(w,b,α)min_{w, b}L(w, b, \alpha)minw,bL(w,b,α),既要先对w,bw, bw,b求导
-
对www求偏导,并令其为0:L=12∣∣w∣∣2−∑i=1nαi(yiwTφ(xi)+yib−1)=12∣∣w∣∣2−∑i=1nαiyiwTφ(xi)+αiyib−αiL=\frac{1}{2}||w||^2-\sum_{i = 1}^n \alpha_i(y_iw^T \varphi(x_i)+y_ib-1)=\frac{1}{2}||w||^2-\sum_{i = 1}^n \alpha_iy_iw^T \varphi(x_i)+\alpha_iy_ib-\alpha_iL=21∣∣w∣∣2−∑i=1nαi(yiwTφ(xi)+yib−1)=21∣∣w∣∣2−∑i=1nαiyiwTφ(xi)+αiyib−αi
∂L∂w=w−∑i=1nαiyiφ(xi)=0\frac{\partial L}{\partial w}= w-\sum_{i = 1}^n\alpha_iy_i \varphi(x_i) = 0∂w∂L=w−∑i=1nαiyiφ(xi)=0
得到:w=∑i=1nαiyiφ(xi)=0w =\sum_{i = 1}^n\alpha_iy_i \varphi(x_i) = 0w=∑i=1nαiyiφ(xi)=0
-
对b求偏导,并令其为0:
L=12∣∣w∣∣2−∑i=1nαiyiwTφ(xi)+αiyib−αiL = \frac{1}{2}||w||^2-\sum_{i = 1}^n \alpha_iy_iw^T\varphi(x_i)+\alpha_iy_ib-\alpha_iL=21∣∣w∣∣2−∑i=1nαiyiwTφ(xi)+αiyib−αi∂L∂b=∑i=1nαiyi=0\frac{\partial L}{\partial b}=\sum_{i = 1}^n\alpha_iy_i=0∂b∂L=∑i=1nαiyi=0
得到:∑i=1nαiyi=0\sum_{i = 1}^n\alpha _iy_i = 0∑i=1nαiyi=0
-
-
将上面两个求导的结果代入①式中,得到:KaTeX parse error: {align*} can be used only in display mode.
四、SVM核函数
- 核函数作用:核函数将原始输入空间映射到新的特征空间,从而使原本线性不可分的样本可能在核空间可分
- 核函数分类
- 线性核:k(xi,xj)=xiTxjk(x_i, x_j)=x_i^Tx_jk(xi,xj)=xiTxj
- 多项式核:k(xi,xj)=(xiTxj)dk(x_i, x_j) = (x_i^Tx_j)^dk(xi,xj)=(xiTxj)d
- 高斯核(RBF, 径向基函数):k(xI,xj)=epx(−∣∣xi−xj∣∣22σ2)k(x_I, x_j) = epx(-\frac{||x_i-x_j||^2}{2\sigma^2})k(xI,xj)=epx(−2σ2∣∣xi−xj∣∣2)——产生将样本投射到无限维空间的运算效果,使得原来不可分的数据变得可分,使用最多
- 拉普拉斯核:k(xi,xj)=exp(−∣∣xi−xj∣∣2σ)k(x_i, x_j)=exp(-\frac{||x_i-x_j||^2}{\sigma})k(xi,xj)=exp(−σ∣∣xi−xj∣∣2)
- Sigmod核:k(xi,xj)=tanh(βxiTxj+θ)k(x_i, x_j) = tanh(\beta x_i^Tx_j+\theta)k(xi,xj)=tanh(βxiTxj+θ)
1.高斯核
-
公式:K(x,y)=e−γ∣∣x−y∣∣2K(x, y) = e^{-\gamma||x-y||^2}K(x,y)=e−γ∣∣x−y∣∣2,其中γ=12σ2\gamma=\frac{1}{2\sigma^2}γ=2σ21
- γ\gammaγ是超参数,作用与标准差相反,γ\gammaγ越大(标准差越小),高斯分布越窄,γ\gammaγ越小,高斯分布越宽
-
API(γ\gammaγ较大,过拟合;γ\gammaγ较小,欠拟合)
from sklearn.svm import SVC
SVC(kernel = 'rbf', gamma=gamma)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)