从零开始的机器学习4-支持向量机


主要内容对应周志华西瓜书第六章。

一些问题

1、试计算样本空间中的任意样本点 到超平面( w , b \bm{w}, b w,b)的距离。
设样本空间中的某样本点为 x = ( x 1 , x 2 , . . . , x n ) , n \bm{x}=(x_1, x_2,...,x_n),n x=(x1,x2,...,xn)n为样本空间的维数。
超平面( w , b \bm{w}, b w,b)其法向量为 w \bm{w} w,任取上面一点 x 0 x_0 x0 w T x 0 + b = 0 \bm{w}^T\bm{x}_0+b=0 wTx0+b=0
x \bm{x} x到超平面的距离即为 x \bm{x} x x 0 x_0 x0的距离于 w \bm{w} w方向上的投影。
x \bm{x} x x 0 x_0 x0的距离为:
∣ x − x 0 ∣ |\bm{x}-\bm{x}_0| xx0
到平面的距离为为:
∣ w T ( x − x 0 ) ∣ ∣ w ∣ = ∣ w T x + b ∣ ∣ w ∣ \frac{|\bm{w}^T(\bm{x}-\bm{x}_0)|}{|\bm{w}|} =\frac{|\bm{w}^T\bm{x}+b|}{|\bm{w}|} wwT(xx0)=wwTx+b
2、试说明支持向量机对噪声敏感的原因。
SVM的目的是求出与支持向量有最大化距离的直线,以每个样本为圆心,该距离为半径做圆,可以近似认为圆内的点与该样本属于相同分类。如果出现了噪声,那么这个噪声所带来的错误分类也将最大化,所以SVM对噪声是很敏感的。
3、试说明支持向量机引入软间隔的意义。
现实任务中往往很难保证所有样本在特征空间中线性可分,而且严格的分割,其结果也有可能是过分割造成的。
软间隔允许支持向量机在一些样本上出错以达到更好的分类效果。如下图
在这里插入图片描述
如果让全出的蓝色点“出错”,我们可以得到一个更宽的间隔,有更好的效果。
软间隔可以减小过拟合以及噪声的影响。
4、试写出“软间隔支持向量机”的对偶问题及其KKT条件。
软间隔支持向量机
min ⁡ w , b , ξ 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 m ξ i s . t .    y i ( w T x i + b ) ≥ 1 − ξ i    ξ i ≥ 0 , i = 1 , 2 , . . . , m \min\limits_{\bm{w},b,\xi} \frac{1}{2}||\bm{w}||^2+C\sum_{i=1}^m\xi_i\\ \begin{aligned} s.t. &\ \ y_i(\bm{w}^T\bm{x}_i+b)\ge1-\xi_i\\ &\ \ \xi_i\ge0,i=1,2,...,m \end{aligned} w,b,ξmin21w2+Ci=1mξis.t.  yi(wTxi+b)1ξi  ξi0,i=1,2,...,m
则通过拉格朗日乘子法得到的拉格朗日函数如下:
(1) L ( w , b , α , ξ , μ ) =   1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 m ξ i   + ∑ i = 1 m α i ( 1 − ξ i − y i ( w T x i + b ) ) − ∑ i = 1 m μ i ξ i , \begin{aligned} L(\bm{w},b,\bm{\alpha},\bm{\xi},\bm{\mu})= &\ \frac{1}{2}||\bm{w}||^2+C\sum_{i=1}^m\xi_i\\ &\ +\sum_{i=1}^m\alpha_i(1-\xi_i-y_i(\bm{w}^T\bm{x}_i+b))-\sum_{i=1}^m\mu_i\xi_i,\tag{1} \end{aligned} L(w,b,α,ξ,μ)= 21w2+Ci=1mξi +i=1mαi(1ξiyi(wTxi+b))i=1mμiξi,(1)
L ( w , b , α , ξ , μ ) L(\bm{w},b,\bm{\alpha},\bm{\xi},\bm{\mu}) L(w,b,α,ξ,μ) w , b , ξ i \bm{w},b,\xi_i w,b,ξi求偏导可得:
(2) w = ∑ i = 1 m α i y i x i 0 = ∑ i = 1 m α i y i C = α i + μ i \begin{aligned} \bm{w} &=\sum_{i=1}^m\alpha_iy_i \bm{x}_i\\ 0&=\sum_{i=1}^m\alpha_iy_i\\ C&= \alpha_i+\mu_i\tag{2} \end{aligned} w0C=i=1mαiyixi=i=1mαiyi=αi+μi(2)
将(2)式代入(1)式,有原问题的对偶问题:
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   0 ≤ α i ≤ C , i = 1 , 2 , . . . , m . \begin{aligned} \max\limits_{\bm{\alpha}} &\ \sum_{i=1}^m\alpha_i-\frac{1}{2}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j\bm{x}_i^T\bm{x}_j\\ s.t. &\ \sum_{i=1}^m\alpha_iy_i=0\\ & \ 0\le\alpha_i\le C,i=1,2,...,m. \end{aligned} αmaxs.t. i=1mαi21i=1mj=1mαiαjyiyjxiTxj i=1mαiyi=0 0αiC,i=1,2,...,m.
对应的KKT条件要求:
{ α i ≥ 0 ,    μ i ≥ 0 , y i f ( x i ) − 1 + ξ i ≥ 0 , α i ( y i f ( x i ) − 1 + ξ i ) = 0 , ξ i ≥ 0 ,    μ i ξ i = 0 \begin{cases} \alpha_i\ge0,\ \ \mu_i\ge0,\\ y_if(\bm{x}_i)-1+\xi_i\ge0,\\ \alpha_i(y_if(\bm{x}_i)-1+\xi_i)=0,\\ \xi_i\ge0,\ \ \mu_i\xi_i=0 \end{cases} αi0,  μi0,yif(xi)1+ξi0,αi(yif(xi)1+ξi)=0,ξi0,  μiξi=0
5、试说明支持向量机引入核函数的意义。
不引入核函数的支持向量机只能在原本的空间线性划分样本,然而限时任务中在原始空间中很有可能不存在一个能正确划分两类样本的超平面,故可将样本从原始空间映射到一个更高维的空间去寻找一个合适的划分超平面。
在这里插入图片描述
通过核函数映射到三维空间便线性可分:
在这里插入图片描述

LSSVM的Python实现

最小二乘支持向量机使用均方误差作为软间隔支持向量机中的替代损失,并修改约束有式:
min ⁡ w , b , ξ   1 2 ∣ ∣ w ∣ ∣ 2 + 1 2 γ ∑ i = 1 m e i 2 s . t .     y i ( w T ⋅ ϕ ( x i ) + b ) ≥ 1 − e i , i = 1 , 2 , . . . , m \begin{aligned} \min\limits_{\bm{w},b,\xi} &\ \frac{1}{2}||\bm{w}||^2+\frac{1}{2}\gamma\sum_{i=1}^me^2_i\\ s.t. \ &\ y_i(\bm{w}^T\cdot \phi(\bm{x}_i)+b)\ge1-e_i, i=1,2,...,m \end{aligned} w,b,ξmins.t.  21w2+21γi=1mei2 yi(wTϕ(xi)+b)1ei,i=1,2,...,m
拉格朗日对偶为:
L ( w , b , α , e ) =   1 2 ∣ ∣ w ∣ ∣ 2 + 1 2 γ ∑ i = 1 m e i 2   + ∑ i = 1 m α i ( 1 − e i − y i ( w T ⋅ ϕ ( x i ) + b ) ) \begin{aligned} L(\bm{w},b,\bm{\alpha},\bm{e})= &\ \frac{1}{2}||\bm{w}||^2+\frac{1}{2} \gamma\sum_{i=1}^me^2_i\\ &\ +\sum_{i=1}^m\alpha_i(1-e_i-y_i(\bm{w}^T\cdot \phi(\bm{x}_i)+b)) \end{aligned} L(w,b,α,e)= 21w2+21γi=1mei2 +i=1mαi(1eiyi(wTϕ(xi)+b))

L ( w , b , α , e ) L(\bm{w},b,\bm{\alpha},\bm{e}) L(w,b,α,e) w , b , e i \bm{w},b,e_i w,b,ei求偏导可得:
w = ∑ i = 1 m α i y i ϕ ( x i ) 0 = ∑ i = 1 m α i y i α i = γ i e i 0 = 1 − e i − y i ( w T ⋅ ϕ ( x i ) + b ) \begin{aligned} \bm{w} &=\sum_{i=1}^m\alpha_iy_i\phi(\bm{x}_i)\\ 0&=\sum_{i=1}^m\alpha_iy_i\\ \alpha_i&= \gamma_ie_i\\ 0&=1-e_i-y_i(\bm{w}^T\cdot \phi(\bm{x}_i)+b)\\ \end{aligned} w0αi0=i=1mαiyiϕ(xi)=i=1mαiyi=γiei=1eiyi(wTϕ(xi)+b)

通过计算可直接求得 α \bm{\alpha} α b b b
b = ( y T ( Ω + I γ ) − 1 y ) − 1 × y T ( Ω + I γ ) − 1 1 ⃗ α = ( Ω + I γ ) − 1 × ( 1 ⃗ − y b ) b=(y^T(\Omega+\frac{I}{\gamma})^{-1}y)^{-1}\times y^T(\Omega+\frac{I}{\gamma})^{-1}\vec1\\ \bm{\alpha}=(\Omega+\frac{I}{\gamma})^{-1}\times(\vec1-yb) b=(yT(Ω+γI)1y)1×yT(Ω+γI)11 α=(Ω+γI)1×(1 yb)

其中:
Ω i j = y i y j ϕ ( x i ) T ϕ ( x j ) = y i y j K ( x i , x j ) 1 ⃗ = ( 1 , 1 , . . . , 1 ) T \begin{aligned} \Omega_{ij}&=y_iy_j\phi(x_i)^T\phi(x_j)=y_iy_jK(x_i,x_j)\\ \vec1&=(1,1,...,1)^T \end{aligned} Ωij1 =yiyjϕ(xi)Tϕ(xj)=yiyjK(xi,xj)=(1,1,...,1)T

模型训练

def trainLSSVM(kMat, trainY, gamma):
    omiga = multiply(trainY@trainY.T, kMat)
    rows = omiga.shape[0]
    vecOne = ones((rows, 1))
    H = omiga + eye(rows)/gamma
    b = trainY.T@(linalg.inv(H)@vecOne)/(trainY.T@(linalg.inv(H)@vecOne))
    alpha = linalg.inv(H)@(vecOne - trainY@b)
    return alpha, b

核函数

def kernelmat(sigma, trainX, testX):
    trainRows = trainX.shape[0]
    if testX is None:
        trainX2 = sum(trainX**2, 0)@ones((1, trainRows))
        kMat = trainX2 + trainX2.T - 2*(trainX*trainX.T)
    else:
        testRows = testX.shape[0]
        trainX2 = sum(trainX**2, 0)@ones((1, testRows))
        testX2 = sum(testX**2, 0)@ones((1, trainRows))
        kMat = trainX2 + testX2.T - 2*(trainX*testX.T)
    kMat = -kMat/(sigma**2*2)
    kMat = exp(kMat)
    return kMat

模型使用

def simLSSVM(trainX, trainY, testX, alpha, b, sigma):
    kMat = kernelmat(sigma, trainX, testX)
    testY = kMat.T@(multiply(alpha, trainY))
    testY = sum(testY, 0) + b
    testY = sign(testY)
    return testY

关于 γ \gamma γ σ \sigma σ

LSSVM模型在 γ \gamma γ σ \sigma σ确定的情况下是可以通过计算求出解析解的。然而因为有替代损失核函数的存在,通常LSSVM模型需要优化两个参数。
这里以交叉验证的错误率作为目标函数值,使用模拟退火法对其进行优化

交叉验证

def crossvalidateCost(trainX, trainY, kMat, gamma, sigma, L):
    rows = trainY.shape[0]
    blockSize = rows/L
    costs = zeros((L, 1))
    vecIndex = range(0, rows)
    vecIndex = mat(vecIndex)
    i = 1
    for x in costs:
        if i == 0:
            validation = blockSize*(i-1) + 1 + vecIndex
        else:
            validation = blockSize * (i - 1) + 1 + mat(range(0, blockSize))
        training = setdiff1d(vecIndex, validation)
        subK = kMat[training, training]
        subX = trainX[training, :]
        subY = trainY[training, :]
        testX = trainX[validation, :]
        trueY = trainY[validation, :]
        [alpha, b] = trainLSSVM(subK, subY, gamma)
        testY = simLSSVM(subX, subY, testX, alpha, b, sigma)
        x = 1 - (sum(testY == trueY)/len(testY))
    return mean(costs)

整体框架

    # 优化gamma和sigma
    gammaOrg = 10
    sigmaOrg = 0.45
    [gamma, sigma] = SAA(trainX, trainY, gammaOrg, sigmaOrg)
    # 训练模型
    kMat = kernelmat(sigma, trainX, testX)
    [alpha, b] = trainLSSVM(kMat, trainY, gamma)
    # 分类
    testY = simLSSVM(trainX, trainY, testX, alpha, b, sigma)

    acc = sum(testY == trueY)/len(trueY)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值