# 机器学习西瓜书——第六章 支持向量机

## 6.1 间隔与支持向量

{

w

T

x

i

+

b

+

1

,

y

i

=

+

1

w

T

x

i

+

b

1

,

y

i

=

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}=-1end{cases}

{wTxi+b+1,wTxi+b1,yi=+1yi=1

γ

=

2

w

gamma=frac{2}{|boldsymbol{w}|}

γ=w2

min

w

,

b

1

2

w

2

s.t.

y

i

(

w

T

x

i

+

b

)

1

,

i

=

1

,

2

,

,

m

begin{aligned} min _{boldsymbol{w}, b} & frac{1}{2}|boldsymbol{w}|^{2} \ text { s.t. } & y_{i}left(boldsymbol{w}^{mathrm{T}} boldsymbol{x}_{i}+bright) geqslant 1, quad i=1,2, ldots, m end{aligned}

w,bmin s.t. 21w2yi(wTxi+b)1,i=1,2,,m

## 6.2 对偶问题

α

i

alpha_i

αi呢？

max

α

i

=

1

m

α

i

1

2

i

=

1

m

j

=

1

m

α

i

α

j

y

i

y

j

x

i

T

x

j

max _{boldsymbol{alpha}} sum_{i=1}^{m} alpha_{i}-frac{1}{2} sum_{i=1}^{m} sum_{j=1}^{m} alpha_{i} alpha_{j} y_{i} y_{j} boldsymbol{x}_{i}^{mathrm{T}} boldsymbol{x}_{j}

αmaxi=1mαi21i=1mj=1mαiαjyiyjxiTxj

s.t.

i

=

1

m

α

i

y

i

=

0

α

i

0

,

i

=

1

,

2

,

,

m

begin{array}{ll} text { s.t. } & sum_{i=1}^{m} alpha_{i} y_{i}=0 \ & alpha_{i} geqslant 0, quad i=1,2, ldots, m end{array}

s.t. i=1mαiyi=0αi0,i=1,2,,m

## 6.3 核函数

ϕ

(

x

i

)

T

ϕ

(

x

j

)

phileft(boldsymbol{x}_{i}right)^{mathrm{T}} phileft(boldsymbol{x}_{j}right)

ϕ(xi)Tϕ(xj)通常是困难的，为了避开这个障碍，可以设想这样一个函数，即核函数：

κ

(

x

i

,

x

j

)

=

ϕ

(

x

i

)

,

ϕ

(

x

j

)

=

ϕ

(

x

i

)

T

ϕ

(

x

j

)

kappaleft(boldsymbol{x}_{i}, boldsymbol{x}_{j}right)=leftlanglephileft(boldsymbol{x}_{i}right), phileft(boldsymbol{x}_{j}right)rightrangle=phileft(boldsymbol{x}_{i}right)^{mathrm{T}} phileft(boldsymbol{x}_{j}right)

κ(xi,xj)=ϕ(xi),ϕ(xj)=ϕ(xi)Tϕ(xj)

## 6.4 软间隔与正则化

min

w

,

b

1

2

w

2

+

C

i

=

1

m

0

/

1

(

y

i

(

w

T

x

i

+

b

)

1

)

,

min _{boldsymbol{w}, b} frac{1}{2}|boldsymbol{w}|^{2}+C sum_{i=1}^{m} ell_{0 / 1}left(y_{i}left(boldsymbol{w}^{mathrm{T}} boldsymbol{x}_{i}+bright)-1right),

w,bmin21w2+Ci=1m0/1(yi(wTxi+b)1),

0

/

1

ell_{0 / 1}

0/1是“0/1损失函数”

0

/

1

(

z

)

=

{

1

,

if

z

<

0

0

,

otherwise

ell_{0 / 1}(z)= begin{cases}1, & text { if } z<0 \ 0, & text { otherwise }end{cases}

0/1(z)={1,0, if z<0 otherwise

0

/

1

ell_{0 / 1}

0/1非凸、非连续，数学性质不太好，有其他损失函数一般具有较好的数学性质，如它们通常是凸的连续函数却是

0

/

1

ell_{0 / 1}

0/1的上界。

## 6.5 支持向量回归

f

(

x

)

f(x)

f(x)与真实输出y之间的差别来计算损失，当且仅当f(x)与y完全相同时，损失才为零。与此不同，支持向量回归假设我们能容忍f(x)与y之间最多有一定的偏差。

# 代码实现

## 线性SVM

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm

data = np.array([
[0.1, 0.7],
[0.3, 0.6],
[0.4, 0.1],
[0.5, 0.4],
[0.8, 0.04],
[0.42, 0.6],
[0.9, 0.4],
[0.6, 0.5],
[0.7, 0.2],
[0.7, 0.67],
[0.27, 0.8],
[0.5, 0.72]
])# 建立数据集
label = [1] * 6 + [0] * 6 #前六个数据的label为1后六个为0
x_min, x_max = data[:, 0].min() - 0.2, data[:, 0].max() + 0.2
y_min, y_max = data[:, 1].min() - 0.2, data[:, 1].max() + 0.2
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.002),
np.arange(y_min, y_max, 0.002)) # meshgrid如何生成网格
print(xx)
model_linear = svm.SVC(kernel='linear', C = 0.001)# 线性svm
model_linear.fit(data, label) # 训练
Z = model_linear.predict(np.c_[xx.ravel(), yy.ravel()]) # 预测
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap = plt.cm.ocean, alpha=0.6) # contour() 是用来绘制等高线的，此次用来显示预测差异
plt.scatter(data[:6, 0], data[:6, 1], marker='o', color='r', s=100, lw=3)
plt.scatter(data[6:, 0], data[6:, 1], marker='x', color='k', s=100, lw=3)
plt.title('Linear SVM')
plt.show()


## 多项式SVM

plt.figure(figsize=(16, 15))

for i, degree in enumerate([1, 3, 5, 7, 9, 12]):#多项式次数选择了1,3,5,7,9,12
# C: 惩罚系数，gamma: 高斯核的系数
model_poly = svm.SVC(C=0.0001, kernel='poly', degree=degree) # 多项式核
model_poly.fit(data, label)# 训练
# ravel - flatten
# c_ - vstack
# 把后面两个压扁之后变成了x1和x2，然后进行判断，得到结果在压缩成一个矩形
Z = model_poly.predict(np.c_[xx.ravel(), yy.ravel()])#预测
Z = Z.reshape(xx.shape)

plt.subplot(3, 2, i + 1)
plt.contourf(xx, yy, Z, cmap=plt.cm.ocean, alpha=0.6)

# 画出训练点
plt.scatter(data[:6, 0], data[:6, 1], marker='o', color='r', s=100, lw=3)
plt.scatter(data[6:, 0], data[6:, 1], marker='x', color='k', s=100, lw=3)
plt.title('Poly SVM with $degree=$' + str(degree))
plt.show()


## 高斯核SVM

plt.figure(figsize=(16, 15))

for i, gamma in enumerate([1, 5, 15, 35, 45, 55]):
# C: 惩罚系数，gamma: 高斯核的系数
model_rbf = svm.SVC(kernel='rbf', gamma=gamma, C= 0.0001).fit(data, label)

# ravel - flatten
# c_ - vstack
# 把后面两个压扁之后变成了x1和x2，然后进行判断，得到结果在压缩成一个矩形
Z = model_rbf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.subplot(3, 2, i + 1)
plt.contourf(xx, yy, Z, cmap=plt.cm.ocean, alpha=0.6)

# 画出训练点
plt.scatter(data[:6, 0], data[:6, 1], marker='o', color='r', s=100, lw=3)
plt.scatter(data[6:, 0], data[6:, 1], marker='x', color='k', s=100, lw=3)
plt.title('RBF SVM with $gamma=$' + str(gamma))
plt.show()


THE END