支持向量机之松弛因子与线性支持向量机

一、线性支持向量机解决的问题

线性可分支持向量机只支持线性可分的训练数据,通过硬间隔最大化实现分类数据;如果训练数据不是线性可分的,我们就需要使用线性支持向量机的方法,去除其中的一些异常点,从而实现剩余样本点的线性可分;相应于硬间隔最大化,它称为软间隔最大化;

二、线性支持向量机的数学模型

为了弥补某些线性不可分样本点的间隔不足的问题,我们为每个样本点引入松弛变量 ξi0,从而使得最终的间隔大于等于1

image

故得到如下约束条件

yi(wxi+b)1ξi

同时目标函数需要计算每个训练样本的松弛量,为了平衡函数间隔和误分类样本点的数量,引入取值为正的惩罚参数C;其值一般由应用问题决定,C值大时对误分类的惩罚增大,C值小时对误分类的惩罚减小;

12w2+Ci=1Nξi

线性不可分问题的线性支持向量机的学习问题变为如下的凸二次规划问题;

minw,b,ξ12w2+Ci=1Nξis.t.yi(wxi+b)1ξi,i=1,2,,Nξi0,i=1,2,,N

通过解决这个优化问题,可以得到超平面

wx+b=0

分类决策函数

f(x)=sign(wx+b)

三、线性支持向量机的对偶算法

模型的原始问题的拉格朗日函数为

L(w,b,ξ,α,μ)12w2+Ci=1Nξii=1Nαi(yi(wxi+b)1+ξi)i=1Nμiξi

对偶问题是拉格朗日函数的极大极小问题。我们首先求L(w,b,ξ,α,µ)对w,b,ξ的极小

wL(w,b,ξ,α,μ)=wi=1Nαiyixi=0bL(w,b,ξ,α,μ)=i=1Nαiyi=0ξiL(w,b,ξ,α,μ)=Cαiμi=0

通过计算得到

w=i=1Nαiyixii=1Nαiyi=0Cαiμi=0

将以上计算结果带入拉格朗日函数

minw,b,ξL(w,b,ξ,α,μ)=12i=1Nj=1Nαiαjyiyj(xixj)+i=1Nαi

接着求α的极大,即得对偶问题

maxα12i=1Nj=1Nαiαjyiyj(xixj)+i=1Nαis.t.i=1Nαiyi=00αiC

可以通过求解对偶问题而得到原始问题的解,进而确定分离超平面和决策函数。
设有对偶问题的一个解

α=(α1,α2,,αN)T

如果存在一个分量满足以下条件

0<αj<C

则可得原始问题的解(b*可能存在多个解)

w=i=1Nαiyixib=yji=1Nyiαi(xixj)

最终可得超平面和分类决策函数为

i=1Nαiyi(xxi)+b=0f(x)=sign(i=1Nαiyi(xxi)+b)

四、松弛因子与支持向量

线性支持向量机模型得到的最优超平面如下图所示,与线性可分支持向量机模型相比,线性支持向量机模型中支持向量分为3种

1)分布在间隔边界H1与H2上的样本,此类样本计算的距离得分值刚好等于1,即 yi(wTxi+b)=1,此时松弛因子 ξi=0,如样本a、b、c;

2)分布在间隔边界H1与H2之间的样本,如果在间隔内刚好落在分类超平面L上,则yi(wTxi+b)=0,此时的松弛因子ξi=1,如样本f;而在间隔边界与超平面L之间时,样本的得分值在0与1之间,即0<yi(wTxi+b)<1,此时的松弛因子0<ξi<1,如样本d;如果样本进一步漂移,如样本在超平面L的另一侧,则样本的得分值小于0,即1<yi(wTxi+b)<0,此时的松弛因子1<ξi<2,如样本e;

3)越过间隔边界分布在相反类别区域的样本,则样本的得分小于-1,即yi(wTxi+b)<1,此时的松弛因子ξi>2,如样本h、g;

image

五、合页损失函数,线性支持向量机的另一种解释

支持向量机以函数间隔来衡量分类的准确性,自然也可以合页损失函数来计算损失;当函数间隔大于1的时候,样本分类正确,则损失为0,否则取函数值作为损失;

L(y(wx+b))=[z]+=[1y(wx+b)]+={z,z>00,z0

通过加入L2范数正则化得到目标函数为

i=1N[1yi(wxi+b)]++λw2

合页损失函数的图形如下图所示,横轴是函数间隔y(w·x+b),纵轴是损失。由于函数形状像一个合页,故名合页损失函数。
从图中可以看到合页函数是0-1损失函数的上界,它克服了0-1函数非连续可导导致的难以优化的问题;

图中的虚线是感知机的的损失函数(公式如下), 当样本点被正确分类的时候损失值为0,相比之下合页函数不仅要分类正确,还需要足够高的确信度时损失值才是0;

[yi(wxi+b)]+

image
六、算法示例

sklearn提供了LinearSVC类,我们可以通过参数指定C的值,以及使用损失函数;

from sklearn.datasets import load_iris
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

x, y = load_iris(return_X_y= True)
svc = Pipeline([
    ('scaler',StandardScaler()),
    ('linear_svc', LinearSVC(C=10, loss='hinge'))
])
svc = svc.fit(x, y)
print(svc.predict(x))
print(svc.score(x, y))

# [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#  0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1
#  1 1 1 2 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
#  2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2
#  2 2]
# 0.9466666666666667
posted @   无风听海  阅读(453)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2013-05-06 SSIS典型应用场景分析
点击右上角即可分享
微信分享提示