SVM简介 详细推导 核函数 线性可分 非线性可分

news2024/11/26 7:50:42

SVM(Support Vector Machine)

Vapnik发明用于解决二分类问题的机器学习算法。

线性可分与非线性可分

在二维平面中,线性可分指的是可以通过一条直线对平面上的点进行划分使得标签相同的点在直线的同一侧,标签不同的点在直线的不同侧。

在二维平面中,非线性可分则是指除去线性可分的情况。

下面是一个线性可分的例子:

import matplotlib.pyplot as plot
from random import random
x1 = []
x2 = []
y1 = []
y2 = []
figSize = (6, 6)
dotNum = 20
for i in range(dotNum):
    x1.append(random() * 1 + 4.5 - 0.5)
    x2.append(random() * 1 + 4.5 + 0.5)
    y1.append(x1[-1] + random() * 1 + 0.5)
    y2.append(x2[-1] - random() * 1 - 0.5)

fig, ax = plot.subplots(figsize = figSize)
ax.axis([3.5, 6.5, 2, 8])
ax.plot(x1, y1, "x")
ax.plot(x2, y2, "o")
ax.plot([3, 7], [3, 7], linewidth = 1)
ax.plot([3, 7], [2, 8], linewidth = 1)
ax.plot([3, 7], [1, 9], linewidth = 1)

在这里插入图片描述

下面是一个非线性可分的例子:

import numpy as np
plot.close()
dotNum = 50
x1 = np.random.rand(dotNum) * 2 - np.ones(dotNum)
x2 = np.random.rand(dotNum) - 0.5 * np.ones(dotNum)
y1 = np.append(np.sqrt(1 - x1 ** 2), -1 * np.sqrt(1 - x1 ** 2))
x1 = np.append(x1, x1)
y2 = np.append(np.sqrt(0.25 - x2 ** 2), -1 * np.sqrt(0.25 - x2 ** 2))
x2 = np.append(x2, x2)
fig, ax = plot.subplots(figsize=figSize)
ax.axis([-1.5, 1.5, -1.5, 1.5])
ax.plot(x1, y1, "x")
ax.plot(x2, y2, "o")

在这里插入图片描述

问题引入

对于一个线性可分的数据集,存在着多条线段均可以达到划分数据集的目的,那条直线的分类效果最好?

要找到最好,我们首先要知道什么叫做好。

Vapnik定义了性能指标:间隔。

一些定义

  • 数据集:输入 X = [ x 1 , x 2 , . . . , x n ] X=[x_1, x_2, ..., x_n] X=[x1,x2,...,xn],输出 Y = [ y 1 , y 2 , . . . , y n ] , y i ∈ { − 1 , 1 } Y=[y_1, y_2, ..., y_n], y_i\in\{-1, 1\} Y=[y1,y2,...,yn],yi{1,1}
  • 支持向量:将划分线分别向两侧平移后首次经过的数据向量集合。
  • 间隔:将划分线分别向两侧移动至首次经过数据时,移动后形成的两条线之间的距离。
  • 线性模型: W T x + b = 0 W^Tx+b=0 WTx+b=0
  • 线性可分: ∃ W , b \exists W, b W,b使得 y i ( W T x i + b ) ≥ 0 , 1 ≤ i ≤ n , i ∈ Z y_i(W^Tx_i+b)\ge0,\quad 1\le i \le n, i \in Z yi(WTxi+b)0,1in,iZ

在下图中,上下两侧经过的点是支持向量,而上下两条直线之间的距离即间隔。

Vapnik认为间隔越大的直线越能够抵抗噪声的影响,因此Vapnik希望在能够划分数据集的直线中找到使间隔最大的那一条。

从下图中我们不难发现间隔最大的直线有无数条,而这无数条直线中我们只需要找到支持向量到直线距离相同的那一条(即中间那条直线)即可,这样能够尽可能的区分两类样本。

plot.close()
x1 = []
x2 = []
y1 = []
y2 = []
dotNum = 20
for i in range(dotNum):
    x1.append(random() * 1 + 4.5 - 0.5)
    x2.append(random() * 1 + 4.5 + 0.5)
    y1.append(x1[-1] + random() * 1 + 0.5)
    y2.append(x2[-1] - random() * 1 - 0.5)
line1X = [3, 7]
line1Y = [2, 8]
def dotDis2Line(dot, line):
    a = (line[1][1] - line[1][0]) / (line[0][1] - line[0][0])
    b = -1
    c = a * (-line[0][0]) + line[1][0]
    return np.abs(a * dot[0] + b * dot[1] + c) / np.sqrt(a ** 2 + b ** 2)
def moveDis2Dot(x, y, line):   
    d = -1
    for i in range(len(x)):
        if d == -1 or d > dotDis2Line([x[i], y[i]], line):
            d = dotDis2Line([x[i], y[i]], line)
    return d
d1 = moveDis2Dot(x1, y1, [line1X, line1Y])
d2 = moveDis2Dot(x2, y2, [line1X, line1Y])
print(d1, d2)
line2X = line1X
line2Y = line1Y + d1 / ((line1X[1] - line1X[0]) / (np.sqrt((line1X[1] - line1X[0]) ** 2 + (line1Y[1] - line1Y[0]) ** 2)))
line3X = line1X
line3Y = line1Y - d2 / ((line1X[1] - line1X[0]) / (np.sqrt((line1X[1] - line1X[0]) ** 2 + (line1Y[1] - line1Y[0]) ** 2)))
fig, ax = plot.subplots(figsize=figSize)
ax.axis([3.5, 6.5, 2, 8])
ax.plot(x1, y1, "x")
ax.plot(x2, y2, "o")
ax.plot(line1X, line1Y, linewidth = 1)
ax.plot(line2X, line2Y, linewidth = 1)
ax.plot(line3X, line3Y, linewidth = 1)

在这里插入图片描述

SVM的数学推导

复习两条知识:

  • W T x + b = 0 W^Tx+b=0 WTx+b=0 a W T x + a b = 0 , ∀ a ≠ 0 aW^Tx+ab=0, \forall a\ne0 aWTx+ab=0,a=0为同一个(超)平面
  • 欧式空间中点到(超)平面(直线)的距离: d = ∣ W T x + b ∣ ∥ W ∥ d = \frac{\vert W^Tx+b\vert}{\parallel W\parallel} d=WWTx+b

有了上面的知识我们便可以写出SVM的数学模型:
m a x d = ∣ W T x i + b ∣ ∥ W ∥ , x i   i s   S V s . t . y i ( W T x i + b ) ≥ 0 , 1 ≤ i ≤ n , i ∈ Z W T x i = W T x j , x i   a n d   x j   a r e   a n y   S V max\quad d = \frac{\vert W^Tx_i+b\vert}{\parallel W\parallel},\quad x_i\ is\ SV\quad s.t.\\ y_i(W^Tx_i+b)\ge0,\quad 1\le i \le n, i \in Z\\ W^Tx_i = W^Tx_j,\quad x_i\ and\ x_j\ are\ any\ SV maxd=WWTxi+b,xi is SVs.t.yi(WTxi+b)0,1in,iZWTxi=WTxj,xi and xj are any SV
上面的式子并不简单,因为我们不能很好的确定那些向量是支持向量。

不过,对于任何一个线性模型,我们总可以用 a a a去放缩支持向量到线性模型的距离,也就是: ∃ a , a ∣ W T x i + b ∣ = 1 , x i   i s   S V \exists a, a\vert W^Tx_i+b\vert=1,\quad x_i\ is\ SV a,aWTxi+b=1,xi is SV

W T x + b = 0 W^Tx+b=0 WTx+b=0 a W T x + a b = 0 , ∀ a ≠ 0 aW^Tx+ab=0, \forall a\ne0 aWTx+ab=0,a=0为同一个(超)平面(直线),我们只需要求出 a W T x + a b = 0 , ∀ a ≠ 0 aW^Tx+ab=0, \forall a\ne0 aWTx+ab=0,a=0即可。因此,我们可以对上面的式子进行如下整理:
m i n 1 2 ∥ W ∥ 2 s . t . y i ( W T x i + b ) ≥ 1 , 1 ≤ i ≤ n , i ∈ Z min\quad \frac 1 2{\parallel W\parallel}^2\quad s.t.\\ y_i(W^Tx_i+b)\ge1,\quad 1\le i \le n, i \in Z\\ min21W2s.t.yi(WTxi+b)1,1in,iZ
上面的优化问题显然是一个凸优化,可以通过最优化理论学习到的知识找到最优解。

非线性可分模型

我们只需要在原优化问题中引入松弛变量 ϵ \epsilon ϵ便可继续求解 W , b W,b W,b,即:
m i n 1 2 ∥ W ∥ 2 + C ∑ i = 1 n ϵ i s . t . y i ( W T x i + b ) ≥ 1 − ϵ i , 1 ≤ i ≤ n , i ∈ Z ϵ i ≥ 0 , 1 ≤ i ≤ n , i ∈ Z min\quad \frac 1 2{\parallel W\parallel}^2 + C\sum_{i=1}^{n}\epsilon_i\quad s.t.\\ y_i(W^Tx_i+b)\ge 1 - \epsilon_i,\quad 1\le i \le n, i \in Z\\ \epsilon_i \ge 0,\quad 1\le i \le n, i \in Z\\ min21W2+Ci=1nϵis.t.yi(WTxi+b)1ϵi,1in,iZϵi0,1in,iZ
上面的问题依然是一个凸优化,但是我们不难发现,即使我们求出 W , b W,b W,b,我们依然不能通过 W x + b = 0 Wx+b=0 Wx+b=0对非线性可分数据集进行划分。

如何解决?升维,如果一个数据集在低维非线性可分,其在高维可能线性可分。

升维如何通过数学表示?函数。

下面给出另一个非线性可分的例子(异或问题):

plot.close()
dotNum = 10
delta = 0.05
x1 =  np.random.rand(dotNum) + delta
y1 =  np.random.rand(dotNum) + delta
x2 = (np.random.rand(dotNum) + delta) * -1
y2 = (np.random.rand(dotNum) + delta) * -1
x3 =  np.random.rand(dotNum) + delta
y3 = (np.random.rand(dotNum) + delta) * -1
x4 = (np.random.rand(dotNum) + delta) * -1
y4 =  np.random.rand(dotNum) + delta
fig, ax = plot.subplots(figsize=figSize)
ax.plot(x1, y1, "x", color = "red")
ax.plot(x2, y2, "x", color = "red")
ax.plot(x3, y3, "o", color = "blue")
ax.plot(x4, y4, "o", color = "blue")

在这里插入图片描述

上面的例子显然非线性可分,不过如果我们通过升维函数: Φ ( x , y ) = ( x , y , x × y ) \Phi(x, y) = (x, y, x \times y) Φ(x,y)=(x,y,x×y)便可以获得三维坐标系下的一个线性可分数据集。

其中 z ≥ 0 z\ge0 z0的是一类, z < 0 z\lt0 z<0的是一类。

plot.close()
def upgrageXOR(x):
    return x[0] * x[1]
z1 = list(map(upgrageXOR, zip(x1, y1)))
z2 = list(map(upgrageXOR, zip(x2, y2)))
z3 = list(map(upgrageXOR, zip(x3, y3)))
z4 = list(map(upgrageXOR, zip(x4, y4)))
fig = plot.figure(figsize = figSize)
ax = plot.axes(projection = '3d')
partSlice = slice(0, 5, 1)
ax.scatter3D(x1, y1, z1, color = "red")
ax.scatter3D(x2, y2, z2, color = "red")
ax.scatter3D(x3, y3, z3, color = "blue")
ax.scatter3D(x4, y4, z4, color = "blue")
print(z1[partSlice], z2[partSlice], z3[partSlice], z4[partSlice], sep = "\n")
[0.239201108785093, 0.017559350544461505, 0.08023209278548173, 0.14450350214058533, 0.4912453255956246]
[0.5598293060799046, 0.04942993213533571, 0.23619320598941207, 0.2792950680234368, 0.010465888992148398]
[-0.21178774554679936, -0.39726697761636637, -0.20384691182268425, -0.6917409633280558, -0.37480972879922647]
[-0.28958407125871255, -0.08269375663158536, -0.8102547901685642, -0.12668636290350974, -0.17468973945750135]

在这里插入图片描述

另一个问题,高维一定线性可分吗?

已经有定理证明随着维度的提升,新的数据集线性可分的概率单调不减,且线性可分的概率收敛于 1 1 1

也就是说我们只要找到一个无穷升维函数,便一定可以将一个非线性可分的数据集化成线性可分的数据集。

如果假设我们现在已经找到了这样的 Φ \Phi Φ,那么我们的优化问题便可以写成如下的形式:
m i n 1 2 ∥ W ∥ 2 + C ∑ i = 1 n ϵ i s . t . y i ( W T Φ ( x i ) + b ) ≥ 1 − ϵ i , 1 ≤ i ≤ n , i ∈ Z ϵ i ≥ 0 , 1 ≤ i ≤ n , i ∈ Z min\quad \frac 1 2{\parallel W\parallel}^2 + C\sum_{i=1}^{n}\epsilon_i\quad s.t.\\ y_i(W^T\Phi(x_i)+b)\ge 1 - \epsilon_i,\quad 1\le i \le n, i \in Z\\ \epsilon_i \ge 0,\quad 1\le i \le n, i \in Z\\ min21W2+Ci=1nϵis.t.yi(WTΦ(xi)+b)1ϵi,1in,iZϵi0,1in,iZ
即使让 C C C等于 0 0 0上面优化问题依然存在解,不过此时 C ∑ i = 1 n ϵ i C\sum_{i=1}^{n}\epsilon_i Ci=1nϵi的作用是作为正则项防止出现过拟合的情况。

Kernel Function

新的问题出现了,如何找到 Φ \Phi Φ使得变换后的数据集是线性可分的?

事实上,找到这样的 Φ \Phi Φ是非常困难的,我们似乎从一个死胡同走到了另一个死胡同。

真的没有办法了吗?

非也,找不到 Φ \Phi Φ,我们去找一个其他Kernel Function

事实上,有下面的定理成立:

我们并不需要找到一个 Φ \Phi Φ,只需要找到一个 K K K,其满足 K ( x 1 , x 2 ) = Φ ( x 1 ) T Φ ( x 2 ) K(x_1,x_2) = \Phi(x_1)^T\Phi(x_2) K(x1,x2)=Φ(x1)TΦ(x2),这样的 K K K依然可以求解上述优化问题。

新的问题又出现了,这样的 K K K一定能找到吗?

是的,这样的 K K K一定能找到,真是踏破铁鞋无觅处,得来全不费工夫。

实际上,若一个 K K K,满足以下两点:

  • K ( x 1 , x 2 ) = K ( x 2 , x 1 ) K(x_1, x_2) = K(x_2, x_1) K(x1,x2)=K(x2,x1)
  • ∀ c i , x i , i ∈ [ 1 , n ] , i ∈ Z , 都有 ∑ i = 1 n ∑ j = 1 n c i c j K ( x i , x j ) ≥ 0 \forall c_i, x_i, i\in[1, n], i\in Z, 都有\sum_{i=1}^{n}\sum_{j=1}^{n} c_ic_jK(x_i,x_j) \ge 0 ci,xi,i[1,n],iZ,都有i=1nj=1ncicjK(xi,xj)0

则这样的 K K K即满足 K ( x 1 , x 2 ) = Φ ( x 1 ) T Φ ( x 2 ) K(x_1,x_2) = \Phi(x_1)^T\Phi(x_2) K(x1,x2)=Φ(x1)TΦ(x2),其中 Φ \Phi Φ是一个无限升维函数。

常用的两个核函数:

  • K ( x 1 , x 2 ) = e − ∥ x 1 − x 2 ∥ 2 2 σ 2 K(x_1, x_2) = e^{-\frac{\parallel x_1 - x_2 \parallel ^2}{2\sigma^2}} K(x1,x2)=e2σ2x1x22
  • K ( x 1 , x 2 ) = ( x 1 T x 2 + 1 ) d K(x_1, x_2) = (x_1^Tx_2+1)^d K(x1,x2)=(x1Tx2+1)d

有了核函数,就可以通过解决对偶问题来解决原问题了(实际上应该是原问题不好解决,尝试解决对偶问题发现可以通过核函数求解对偶问题)。

相信大家都学习过最优化理论这门课程,那么写出上述问题的对偶问题应该不是难事。

完了最优化理论课程上只讲了线性对偶问题,非线性的对偶问题没有涉及。讲了,但只讲了一点点。

对偶问题

对于一个优化问题:
m i n f ( W ) s . t . g i ( W ) ≤ 0 , i ∈ [ 1 , k ] , i ∈ Z h i ( W ) = 0 , , i ∈ [ 1 , k ] , i ∈ Z min\quad f(W)\quad s.t.\\ g_i(W) \le 0, i \in [1, k],\quad i \in Z \\ h_i(W) = 0, , i \in [1, k],\quad i \in Z \\ minf(W)s.t.gi(W)0,i[1,k],iZhi(W)=0,,i[1,k],iZ
定义 L ( W , α , β ) = f ( W ) + ∑ i = 1 k α i g i ( W ) + ∑ i = 1 m β i h i ( W ) L(W, \alpha, \beta) = f(W) + \sum_{i = 1}^{k}\alpha_i g_i(W) + \sum_{i = 1}^{m}\beta_i h_i(W) L(W,α,β)=f(W)+i=1kαigi(W)+i=1mβihi(W),则其对偶问题如下:
m a x Θ ( α , β ) = i n f W L ( W , α , β ) s . t . α i ≥ 0 , i ∈ [ 1 , k ] , i ∈ Z β i ≥ 0 , , i ∈ [ 1 , k ] , i ∈ Z max\quad \Theta(\alpha, \beta) = \underset{W}{inf} L(W, \alpha, \beta)\quad s.t. \\ \alpha_i \ge 0, i \in [1, k],\quad i \in Z \\ \beta_i \ge 0, , i \in [1, k],\quad i \in Z \\ maxΘ(α,β)=WinfL(W,α,β)s.t.αi0,i[1,k],iZβi0,,i[1,k],iZ
这里的对偶问题与最优化理论课程中介绍的线性对偶问题有着一些相似的定理。

∀ W ∗ , α ∗ , β ∗ \forall W^*,\alpha^*,\beta^* W,α,β是各自问题的可行解,则有 f ( W ∗ ) ≥ Θ ( α ∗ , β ∗ ) f(W^*)\ge\Theta(\alpha^*, \beta^*) f(W)Θ(α,β),证明如下:
Θ ( α ∗ , β ∗ ) ≤ L ( W ∗ , α ∗ , β ∗ ) = f ( W ∗ ) + ∑ i = 1 k α i g i ( W ∗ ) ≤ f ( W ∗ ) (1) \Theta(\alpha^*, \beta^*) \le L(W^*, \alpha^*, \beta^*)=f(W^*)+\sum_{i = 1}^{k}\alpha_i g_i(W^*)\le f(W^*) \tag{1} Θ(α,β)L(W,α,β)=f(W)+i=1kαigi(W)f(W)(1)

强对偶定理:若 f ( W ) f(W) f(W)为凸函数, g i , h i g_i,h_i gi,hi均为线性函数,则有 f ( W ∗ ) = Θ ( α ∗ , β ∗ ) f(W^*)=\Theta(\alpha^*, \beta^*) f(W)=Θ(α,β)

不难发现若强对偶定理成立,那么 ( 1 ) (1) (1)中的不等号全部要变成等号,于是可以得到 K . K . T . K.K.T. K.K.T.条件: α i g i ( W ∗ ) = 0 , i ∈ [ 1 , k ] , i ∈ Z \alpha_i g_i(W^*)=0,\quad i \in [1, k], i \in Z αigi(W)=0,i[1,k],iZ

要写出 S V M SVM SVM数学问题的对偶形式,我们首先要将原优化问题化成与上面对应的标准形式:
m i n 1 2 ∥ W ∥ 2 − C ∑ i = 1 n ϵ i s . t . − y i Φ ( x i ) T W − y i b + 1 + ϵ i ≤ 0 , 1 ≤ i ≤ n , i ∈ Z ϵ i ≤ 0 , 1 ≤ i ≤ n , i ∈ Z min\quad \frac 1 2{\parallel W\parallel}^2 - C\sum_{i=1}^{n}\epsilon_i\quad s.t.\\ -y_i\Phi(x_i)^TW-y_ib + 1 + \epsilon_i \le 0,\quad 1\le i \le n, i \in Z\\ \epsilon_i \le 0,\quad 1\le i \le n, i \in Z\\ min21W2Ci=1nϵis.t.yiΦ(xi)TWyib+1+ϵi0,1in,iZϵi0,1in,iZ
于是不难写出其对偶问题如下:
m a x Θ ( α , β ) = i n f ϵ , W , b { 1 2 ∥ W ∥ 2 − C ∑ i = 1 n ϵ i + ∑ i = 1 n α i ( − y i Φ ( x i ) T W − y i b + 1 + ϵ i ) + ∑ i = 1 n β i ϵ i } s . t . α i ≥ 0 , 1 ≤ i ≤ n , i ∈ Z β i ≥ 0 , 1 ≤ i ≤ n , i ∈ Z max\quad \Theta(\alpha, \beta) = \underset{\epsilon,W,b}{inf}\left\{\frac 1 2{\parallel W\parallel}^2 - C\sum_{i=1}^{n}\epsilon_i + \sum_{i=1}^{n}\alpha_i(-y_i\Phi(x_i)^TW-y_ib + 1 + \epsilon_i)+ \sum_{i=1}^{n}\beta_i\epsilon_i\right\}\quad s.t.\\ \alpha_i \ge 0,\quad 1\le i \le n, i \in Z\\ \beta_i \ge 0,\quad 1\le i \le n, i \in Z\\ maxΘ(α,β)=ϵ,W,binf{21W2Ci=1nϵi+i=1nαi(yiΦ(xi)TWyib+1+ϵi)+i=1nβiϵi}s.t.αi0,1in,iZβi0,1in,iZ

对偶问题的求解

我们不难发现,上述问题满足强对偶定理,于是我们尝试通过 K . K . T . K.K.T. K.K.T.点求解对偶问题。

我们首先解决inf,对于凸函数而言,只需要其偏导数均等于0即可,因此:
{ ∂ L ∂ W = W − ∑ i = 1 n α i y i Φ ( x i ) = 0 ∂ L ∂ b i = α i + β i − C = 0 , 1 ≤ i ≤ n , i ∈ Z ∂ L ∂ ϵ i = ∑ i = 1 n α i y i = 0 , 1 ≤ i ≤ n , i ∈ Z \left\{ \begin{aligned} &\frac {\partial L} {\partial W}=W-\sum_{i=1}^{n}\alpha_i y_i \Phi(x_i) = 0\\ &\frac {\partial L} {\partial b_i}=\alpha_i+\beta_i-C = 0,\quad 1\le i \le n, i \in Z\\ &\frac {\partial L} {\partial \epsilon_i}=\sum_{i=1}^n\alpha_i y_i = 0,\quad 1\le i \le n, i \in Z\\ \end{aligned} \right. WL=Wi=1nαiyiΦ(xi)=0biL=αi+βiC=0,1in,iZϵiL=i=1nαiyi=0,1in,iZ
我们稍加整理便可以得到:
{ W = ∑ i = 1 n α i y i Φ ( x i ) α i + β i = C , 1 ≤ i ≤ n , i ∈ Z ∑ i = 1 n α i y i = 0 , 1 ≤ i ≤ n , i ∈ Z \left\{ \begin{aligned} &W=\sum_{i=1}^{n}\alpha_i y_i \Phi(x_i)\\ &\alpha_i+\beta_i=C,\quad 1\le i \le n, i \in Z\\ &\sum_{i=1}^n\alpha_i y_i = 0,\quad 1\le i \le n, i \in Z\\ \end{aligned} \right. W=i=1nαiyiΦ(xi)αi+βi=C,1in,iZi=1nαiyi=0,1in,iZ
将三个式子带入到 Θ ( α , β ) \Theta(\alpha, \beta) Θ(α,β)中,便可以将对偶问题进行化简得到:
m a x Θ ( α , β ) = Θ ( α ) = ∑ i = 1 n α i − 1 2 ∑ i = 1 n ∑ i = 1 n α i α j y i y j Φ T ( x i ) Φ ( x j ) = ∑ i = 1 n α i − 1 2 ∑ i = 1 n ∑ i = 1 n α i α j y i y j K ( x i , x j ) s . t . α i ≥ 0 , 1 ≤ i ≤ n , i ∈ Z ∑ i = 1 n α i y i = 0 , 1 ≤ i ≤ n , i ∈ Z max\quad \Theta(\alpha, \beta)=\Theta(\alpha)=\sum_{i=1}^{n}\alpha_i-\frac 1 2 \sum_{i=1}^{n}\sum_{i=1}^{n}\alpha_i\alpha_jy_iy_j\Phi^T(x_i)\Phi(x_j) =\sum_{i=1}^{n}\alpha_i-\frac 1 2 \sum_{i=1}^{n}\sum_{i=1}^{n}\alpha_i\alpha_jy_iy_jK(x_i,x_j)\quad s.t.\\ \alpha_i \ge 0,\quad 1 \le i \le n, i \in Z\\ \sum_{i=1}^{n}\alpha_i y_i = 0,\quad 1\le i \le n, i \in Z\\ maxΘ(α,β)=Θ(α)=i=1nαi21i=1ni=1nαiαjyiyjΦT(xi)Φ(xj)=i=1nαi21i=1ni=1nαiαjyiyjK(xi,xj)s.t.αi0,1in,iZi=1nαiyi=0,1in,iZ
我们可以通过SMO算法求解上述问题。

新的问题,我们如何通过已经求解出来的 α i \alpha_i αi来求解 W , b W,b W,b

似乎可以通过 W = ∑ i = 1 n α i y i Φ ( x i ) W=\sum_{i=1}^{n}\alpha_i y_i \Phi(x_i) W=i=1nαiyiΦ(xi)求解 W W W,不过我们并不知道 Φ ( x i ) \Phi(x_i) Φ(xi)

事实上,我们没有必要求解 W W W,对于测试数据,我们只需要知道 W T Φ ( x ) W^T\Phi(x) WTΦ(x)
W T Φ ( x ) = ( ∑ i = 1 n α i y i Φ ( x i ) ) T Φ ( x ) = ∑ i = 1 n α i y i Φ T ( x i ) Φ ( x ) = ∑ i = 1 n α i y i K ( x i , x ) W^T\Phi(x)=(\sum_{i=1}^{n}\alpha_i y_i \Phi(x_i))^T\Phi(x)=\sum_{i=1}^{n}\alpha_i y_i \Phi^T(x_i)\Phi(x) = \sum_{i=1}^{n}\alpha_i y_i K(x_i, x) WTΦ(x)=(i=1nαiyiΦ(xi))TΦ(x)=i=1nαiyiΦT(xi)Φ(x)=i=1nαiyiK(xi,x)
因此我们只需要求解 b b b即可。

K . K . T . K.K.T. K.K.T.条件可以知道:
β i ϵ i = 0 , 1 ≤ i ≤ n , i ∈ Z α i ( − y i Φ ( x i ) T W − y i b + 1 + ϵ i ) = 0 , 1 ≤ i ≤ n , i ∈ Z \beta_i\epsilon_i=0,1\le i \le n,\quad i \in Z\\ \alpha_i(-y_i\Phi(x_i)^TW-y_ib + 1 + \epsilon_i)=0,\quad 1\le i \le n, i \in Z\\ βiϵi=0,1in,iZαi(yiΦ(xi)TWyib+1+ϵi)=0,1in,iZ
我们可以让 β i ≠ 0 \beta_i\ne 0 βi=0,则 ϵ i = 0 \epsilon_i=0 ϵi=0,若 α i ≠ 0 \alpha_i\ne 0 αi=0则有:
b = 1 − y i Φ ( x i ) T W y i b=\frac{1-y_i\Phi(x_i)^TW}{y_i}\\ b=yi1yiΦ(xi)TW
我们可以选择多个 α i ≠ 0 \alpha_i \ne 0 αi=0算出多个 b b b求平均值作为最终的 b b b

最后给出一个例子SVM求解非线性可分的例子(之前的异或问题):

from sklearn import svm
from sklearn.metrics import accuracy_score

model = svm.SVC(C = 1, kernel = "rbf", gamma = "scale")
trainDataLen = 100
x1 =  np.random.rand(trainDataLen) + delta * np.ones(trainDataLen)
y1 =  np.random.rand(trainDataLen) + delta * np.ones(trainDataLen)
x2 = (np.random.rand(trainDataLen) + delta * np.ones(trainDataLen)) * -1
y2 = (np.random.rand(trainDataLen) + delta * np.ones(trainDataLen)) * -1
x3 =  np.random.rand(trainDataLen) + delta * np.ones(trainDataLen)
y3 = (np.random.rand(trainDataLen) + delta * np.ones(trainDataLen)) * -1
x4 = (np.random.rand(trainDataLen) + delta * np.ones(trainDataLen)) * -1
y4 =  np.random.rand(trainDataLen) + delta * np.ones(trainDataLen)
feature = []
for i in range(trainDataLen):
    feature.append([x1[i], y1[i]])
    feature.append([x2[i], y2[i]])
    feature.append([x3[i], y3[i]])
    feature.append([x4[i], y4[i]])
label = [1, 1, -1, -1] * trainDataLen
testDataLen = 1000
testFeature  = list(zip( np.random.rand(testDataLen) + delta * np.ones(testDataLen),
                         np.random.rand(testDataLen) + delta * np.ones(testDataLen)))
testFeature += list(zip((np.random.rand(testDataLen) + delta * np.ones(testDataLen)) * -1,
                        (np.random.rand(testDataLen) + delta * np.ones(testDataLen)) * -1))
testFeature += list(zip( np.random.rand(testDataLen) + delta * np.ones(testDataLen),
                        (np.random.rand(testDataLen) + delta * np.ones(testDataLen)) * -1))
testFeature += list(zip((np.random.rand(testDataLen) + delta * np.ones(testDataLen)) * -1,
                         np.random.rand(testDataLen) + delta * np.ones(testDataLen)))
testLabel = [1] * testDataLen * 2 + [-1] * testDataLen * 2
testDataLen *= 4

fig, ax = plot.subplots(figsize=figSize)
model.fit(feature, label)
predictLabel = list(model.predict(testFeature))
print("testLabel:   ", testLabel[:10])
print("predictLabel:", predictLabel[:10])
print("accuracy ratio:", accuracy_score(testLabel, predictLabel))
class1X = []
class1Y = []
class2X = []
class2Y = []
for i in range(testDataLen):
    if predictLabel[i] == 1:
        class1X.append(testFeature[i][0])
        class1Y.append(testFeature[i][1])
    else:
        class2X.append(testFeature[i][0])
        class2Y.append(testFeature[i][1])
ax.plot(class1X, class1Y, "x")
ax.plot(class2X, class2Y, "o")
testLabel:    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
predictLabel: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
accuracy ratio: 1.0

在这里插入图片描述

在介绍线性可分的情况下,我们只说了优化问题是一个凸优化,没有给出具体的求解算法。

实际上,对于线性可分的数据集,也可以通过对偶问题求解,相当于使用“核函数” K ( x i , x j ) = x i T x j K(x_i, x_j)=x_i^Tx_j K(xi,xj)=xiTxj(严格来说不是核函数,其不一定满足半正定性)。这样就可以同样使用SMO算法求解线性可分的情况。

处理多类别数据

一个SVM可以解决二分类问题,那么对于一个N分类问题,我们使用多个个SVM即可进行分类。

以三分类问题为例

一类对其他类方法(构造 N N NSVM):
S V M 1 : ( C 2 C 3 ) v . s . ( C 1 ) S V M 2 : ( C 1 C 3 ) v . s . ( C 2 ) S V M 3 : ( C 1 C 2 ) v . s . ( C 3 ) SVM1:(C_2C_3)v.s.(C1)\\ SVM2:(C_1C_3)v.s.(C2)\\ SVM3:(C_1C_2)v.s.(C3)\\ SVM1:(C2C3)v.s.(C1)SVM2:(C1C3)v.s.(C2)SVM3:(C1C2)v.s.(C3)
一类对另一类方法(构造 C N 2 C^2_N CN2SVM):
S V M 1 : ( C 1 ) v . s . ( C 2 ) S V M 2 : ( C 1 ) v . s . ( C 3 ) S V M 3 : ( C 2 ) v . s . ( C 3 ) SVM1:(C_1)v.s.(C2)\\ SVM2:(C_1)v.s.(C3)\\ SVM3:(C_2)v.s.(C3)\\ SVM1:(C1)v.s.(C2)SVM2:(C1)v.s.(C3)SVM3:(C2)v.s.(C3)
其他的方法(构造 N − 1 N-1 N1SVM):
S V M 1 : ( C 2 C 3 ) v . s . ( C 1 ) S V M 2 : ( C 3 ) v . s . ( C 2 ) \begin{aligned} &SVM1:(C_2C_3)v.s.(C1)\\ &SVM2:(C_3)v.s.(C2)\\ \end{aligned} SVM1:(C2C3)v.s.(C1)SVM2:(C3)v.s.(C2)

参考

【SVM支持向量机】讲解

scikit-learn

matplotlib

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1563308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:基本指令篇

文章目录 前言1.ls 指令2.pwd命令3.cd 指令4.touch指令5.mkdir指令&#xff08;重要&#xff09;6.rmdir指令 && rm 指令&#xff08;重要&#xff09;7.man指令&#xff08;重要&#xff09;8.cp指令&#xff08;重要&#xff09;9.mv指令&#xff08;重要&#xff09…

时序数据库IoTDB:功能详解与行业应用

一文读懂时序数据库 IoTDB。 01 为什么需要时序数据库 解释时序数据库前&#xff0c;先了解一下何谓时序数据。 时序数据&#xff0c;也称为时间序列数据&#xff0c;是指按时间顺序记录的同一统计指标的数据集合。这类数据的来源主要是能源、工程、交通等工业物联网强关联行业…

【Java面试题系列】基础篇

目录 基本常识标识符的命名规则八种基本数据类型的大小&#xff0c;以及他们的封装类3*0.10.3返回值是什么short s1 1; s1 s1 1;有什么错? short s1 1; s1 1;有什么错?简述&&与&的区别&#xff1f;简述break与continue、return的区别&#xff1f;Arrays类的…

直方图均衡化的本质

Rafael C. Gonzalez “Digital Image Processing”的错误 直方图均衡化的本质是灰度级分布的近邻映射&#xff0c;这部分的内容全错。总有些人崇洋媚外。 我修改了相关的内容&#xff0c;参阅禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程…

如何在Linux系统运行RStudio Server并实现无公网IP远程访问【内网穿透】

文章目录 推荐 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

【Leetcode】top 100 二分查找

35 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 基础写法&#xff01;&#xff01;&#xff01;牢记…

【算法刷题day14】Leetcode:144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历

文章目录 二叉树递归遍历解题思路代码总结 二叉树的迭代遍历解题思路代码总结 二叉树的统一迭代法解题思路代码总结 草稿图网站 java的Deque 二叉树递归遍历 题目&#xff1a; 144.二叉树的前序遍历 94.二叉树的中序遍历 145.二叉树的后序遍历 解析&#xff1a;代码随想录解析…

RN实现全局数据共享(非Redux,使用原生内置的方法实现)

下面这个方法是在RN使用全局数据共享的,使用原生React的方式搞得,相对于Redux配置相对简单,适合小型项目 项目内创建MyContext.js // MyContext.jsimport React from react;const MyContext React.createContext();export default MyContext;App.js引入 // App.jsimport Rea…

在c# 7.3中不可用,请使用9.0或更高的语言版本

参考连接&#xff1a;在c# 7.3中不可用,请使用8.0或更高的语言版本_功能“可为 null 的引用类型”在 c# 7.3 中不可用。请使用 8.0 或更高的语言版本-CSDN博客https://blog.csdn.net/liangyely/article/details/106163660 [踩坑记录] 某功能在C#7.3中不可用,请使用 8.0 或更高的…

大学html作业-大数据分析系统大屏项目(免费)

大学html作业-大数据分析系统大屏项目&#xff08;免费&#xff09; 源码来自githab&#xff0c;有些简单的问题我都修复了。大家可以直接去找原作者的源码&#xff0c;如果githab打不开就从我下载的网盘里下载吧。 效果

数据结构:归并排序

归并排序 时间复杂度O(N*logN) 如果两个序列有序,通过归并,可以让两个序列合并后也有序,变成一个有序的新数组 对于一个数组,如果他的左右区间都有序,就可以进行归并了 归并的方法 将数组的左右两个有序区间比较,每次都取出一个最小的,然后放入临时数组(不能在原数组上修改…

基于8086温度采集系统仿真设计

**单片机设计介绍&#xff0c;基于8086温度采集系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086的温度采集系统仿真设计是一个综合性的项目&#xff0c;它结合了微处理器技术、传感器应用以及仿真技术&#…

紫光展锐P7885核心板详细参数介绍_5G安卓智能模块开发方案

紫光展锐P7885核心板采用了先进的6nm EUV制程工艺&#xff0c;集成了高性能的应用处理器和金融级安全解决方案&#xff0c;为用户带来了全新的性能体验。 P7885核心板搭载了先进的6nm制程工艺SoC P7885&#xff0c;其中包含四核A76和四核A55&#xff0c;主频可达2.7Ghz&#xf…

【一步一步学】RouterOS Mesh介绍,小白也能懂。

理论介绍 RouterOS Mesh是一种网络拓扑结构&#xff0c;它利用无线技术将多个路由器连接在一起&#xff0c;形成一个覆盖范围更广、信号更稳定的网络。这种结构可以帮助用户实现更好的网络覆盖和负载均衡&#xff0c;提高整体网络性能。 RouterOS Mesh的原理是通过建立多个路由…

JavaEE 初阶篇-深入了解单例模式(经典单例模式:饿汉模式、懒汉模式)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 单例模式的概述 2.0 单例模式 - 饿汉式单例 2.1 关于饿汉式单例的线程安全问题 3.0 单例模式 - 懒汉式单例 3.1 关于懒汉式单例的线程安全问题 3.1.1 加锁 synchr…

Java | Leetcode Java题解之第4题寻找两个正序数组的中位数

题目&#xff1a; 题解&#xff1a; class Solution {public double findMedianSortedArrays(int[] A, int[] B) {int m A.length;int n B.length;if (m > n) { return findMedianSortedArrays(B,A); // 保证 m < n}int iMin 0, iMax m;while (iMin < iMax) {int…

枚举---算法

1、定义 枚举算法&#xff1a;也称之为穷举算法&#xff0c;这种算法就是在解决问题的时候去使用所有的方式去解决这个问题&#xff0c;会通过推理去考虑事件发生的每一种可能&#xff0c;最后推导出结果。优点&#xff1a;简单粗暴&#xff0c;它暴力的枚举所有可能&#xff…

每天五分钟计算机视觉:使用神经网络完成人脸的特征点检测

本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…

低噪声、轨至轨运算放大器芯片—— D721、D722、D724,适合用于音频领域

应用领域 D721、D722、D724是我们推荐的三款低噪声、轨至轨运算放大器芯片&#xff0c;其中D721为单运放&#xff0c;D722为双运放&#xff0c;D724为四运放。适合用于音频领域、传感器等的信号放大处理&#xff0c;比如K歌宝、音响、测距、滤波器、AD转换器前级信号处理等等。…

通过开发板来学习ROS2 21讲(基础环境配置)

通过开发板来学习ROS2 21讲&#xff08;基础环境配置&#xff09; 简介 ROS2 21讲是古月居倾力打造的ROS2 的入门学习视频&#xff0c;相信有很多小伙伴也是通过ROS2 21讲入门的ROS2。在学习过程中&#xff0c;大家有可能是使用虚拟机/PC机来运行ROS2上的案例&#xff0c;但是…