支持向量机——分类
支持向量机 (SVMs) 的应用面比较广,可用于回归、分类和和 异常检测。其最常见的应用是做分类。
支持向量机(Support Vector Machine, SVM) 是由最优分类面衍生而来, 在线性可分情况中, 其根本思想是将特征向量映射到一个比自身维度更高的空间里,在这个空间里建立一个新的隔离平面,使得隶属不同类别的特征向量点间隔最大。各类别对应的平行超平面间的距离越大,分类器的总误差则越小。
设 n 个样本的训练合集为
(
x
i
,
y
i
)
,
i
=
1
,
2
,
…
…
,
n
(x_{i},y_{i}),i=1,2,……,n
(xi,yi),i=1,2,……,n。
d
d
d维空间中线性判别函数的形式为
g
(
x
)
=
w
x
+
b
g(x)=wx+b
g(x)=wx+b
某数据点
x
i
x_{i}
xi到分类平面的距离可以表示为
∣
ω
x
+
b
∣
∥
ω
∥
\frac{\left| \omega x+b \right|}{\left\| \omega \right\|}
∥ω∥∣ωx+b∣,点到原点的距离为
∣
b
∣
∥
ω
∥
\frac{\left| b \right|}{\left\| \omega \right\|}
∥ω∥∣b∣。
离分类平面最近的数据点和它们对应的平行超平面,将判别函数归一化使所有数据点都满足
∣
g
(
x
)
∣
≥
1
\left| g(x) \right|\ge 1
∣g(x)∣≥1,且距分类平面距离最小的数据点
∣
g
(
x
)
∣
=
1
\left| g(x) \right|=1
∣g(x)∣=1。计算
∥
ω
∥
2
2
\frac{{{\left\| \omega \right\|}^{2}}}{2}
2∥ω∥2极小值优化分类平面,使分类间隔最大化。
约束条件为:
y
i
[
ω
x
+
b
]
−
1
≥
0
{{y}_{i}}[\omega x+b]-1\ge 0
yi[ωx+b]−1≥0
目标函数为:
φ
(
ω
)
=
1
2
∥
ω
∥
2
=
1
2
(
ω
,
ω
)
\varphi (\omega )=\frac{1}{2}{{\left\| \omega \right\|}^{2}}=\frac{1}{2}(\omega ,\omega )
φ(ω)=21∥ω∥2=21(ω,ω)
可定义如下的
L
a
g
r
a
n
g
e
Lagrange
Lagrange 函数
L
(
ω
,
b
,
a
)
=
1
2
(
ω
,
ω
)
−
∑
i
=
1
n
a
i
{
y
i
[
(
ω
x
i
)
+
b
]
−
1
}
L(\omega ,b,a)=\frac{1}{2}(\omega ,\omega )-\sum\limits_{i=1}^{n}{{{a}_{i}}\{{{y}_{i}}[(\omega {{x}_{i}})+b]-1\}}
L(ω,b,a)=21(ω,ω)−i=1∑nai{yi[(ωxi)+b]−1}
其中
a
i
>
0
a_i>0
ai>0,为
L
a
g
r
a
n
g
e
Lagrange
Lagrange乘子,将所求问题转化为对
ω
\omega
ω和
b
b
b求
L
a
g
r
a
n
g
e
Lagrange
Lagrange极小值。
对
ω
\omega
ω和
b
b
b求偏微分,令其等于0。
∑
i
=
1
n
a
i
y
i
=
0
\sum\limits_{i=1}^{n}{{{a}_{i}}{{y}_{i}}=0}
i=1∑naiyi=0
其中
a
i
≥
0
a_i\ge 0
ai≥0。求解下列函数的最大值
Q
(
a
)
=
∑
i
=
1
n
a
i
∗
−
1
2
∑
i
,
j
=
1
n
a
i
a
j
y
i
y
j
(
x
i
,
x
j
)
Q(a)=\sum\limits_{i=1}^{n}{a_{i}^{*}-\frac{1}{2}\sum\limits_{i,j=1}^{n}{{{a}_{i}}{{a}_{j}}{{y}_{i}}{{y}_{j}}({{x}_{i}},{{x}_{j}})}}
Q(a)=i=1∑nai∗−21i,j=1∑naiajyiyj(xi,xj)
若
a
i
∗
a_{i}^{*}
ai∗为最优解,则
ω
∗
=
∑
i
=
1
n
a
i
∗
y
i
x
i
{{\omega }^{*}}=\sum\limits_{i=1}^{n}{a_{i}^{*}{{y}_{i}}}{{x}_{i}}
ω∗=i=1∑nai∗yixi
采用训练样本,训练决策函数,使其具备分类功能,并在反复训练中不断优化确立最优分类平面,形成适用于此类样本分类问题的支持向量机。决策函数可表示为:
f
(
x
)
=
s
g
n
(
∑
i
=
1
n
a
i
y
i
(
x
,
x
i
)
+
b
)
f(x)=sgn (\sum\limits_{i=1}^{n}{{{a}_{i}}}{{y}_{i}}(x,{{x}_{i}})+b)
f(x)=sgn(i=1∑naiyi(x,xi)+b)
所使用的核函数为
S
i
g
m
o
i
d
Sigmoid
Sigmoid函数。
K
(
x
,
x
t
)
=
tanh
(
v
(
x
i
,
x
j
)
+
c
)
K(x,{{x}_{t}})=\tanh (v({{x}_{i}},{{x}_{j}})+c)
K(x,xt)=tanh(v(xi,xj)+c)
代码展示
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
# we create two clusters of random points
n_samples_1 = 1000
n_samples_2 = 100
centers = [[0.0, 0.0], [2.0, 2.0]]
clusters_std = [1.5, 0.5]
X, y = make_blobs(n_samples=[n_samples_1, n_samples_2],
centers=centers,
cluster_std=clusters_std,
random_state=0, shuffle=False)
# fit the model and get the separating hyperplane
clf = svm.SVC(kernel='linear', C=1.0)
clf.fit(X, y)
# fit the model and get the separating hyperplane using weighted classes
wclf = svm.SVC(kernel='linear', class_weight={1: 10})
wclf.fit(X, y)
# plot the samples
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors='k')
# plot the decision functions for both classifiers
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# create grid to evaluate model
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
# get the separating hyperplane
Z = clf.decision_function(xy).reshape(XX.shape)
# plot decision boundary and margins
a = ax.contour(XX, YY, Z, colors='k', levels=[0], alpha=0.5, linestyles=['-'])
# get the separating hyperplane for weighted classes
Z = wclf.decision_function(xy).reshape(XX.shape)
# plot decision boundary and margins for weighted classes
b = ax.contour(XX, YY, Z, colors='r', levels=[0], alpha=0.5, linestyles=['-'])
plt.legend([a.collections[0], b.collections[0]], ["non weighted", "weighted"],
loc="upper right")
plt.show()
支持向量机——回归
支持向量分类的方法可以被扩展用作解决回归问题. 这个方法被称作支持向量回归。
支持向量分类有三种不同的实现形式:SVR,NuSVR 和 LinearSVR。在只考虑线性核的情况下,LinearSVR 比 SVR 提供一个更快的实现形式。
采用对样本泛化性能极强的 SVR算法, 可以有效避免常规算法因样本数据不足引起的计算精度低和不易收敛等不足。给定训练集 :
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
…
…
,
(
x
n
,
y
n
)
}
T=\{(x_1,y_1),(x_2,y_2),……,(x_n,y_n)\}
T={(x1,y1),(x2,y2),……,(xn,yn)}
假设其回归函数为:
y
=
f
(
x
)
=
ω
T
(
x
)
+
b
y=f(x)={{\omega }^{T}}(x)+b
y=f(x)=ωT(x)+b
为了提高SVR算法的泛化能力, 引入核函数
K
(
x
i
,
x
j
)
K(x_i,x_j)
K(xi,xj),将低维回归问题转化为高维优化问题。
min
∑
i
,
j
=
1
n
(
α
i
−
α
i
∗
)
(
α
j
−
α
j
∗
)
K
(
x
i
,
x
j
)
+
ε
∑
i
=
1
n
(
α
i
+
α
i
∗
)
−
∑
i
=
1
n
y
i
(
α
i
−
α
i
∗
)
\min \sum\limits_{i,j=1}^{n}{({{\alpha }_{i}}-\alpha _{i}^{*})}({{\alpha }_{j}}-\alpha _{j}^{*})K({{x}_{i}},{{x}_{j}})+\varepsilon \sum\limits_{i=1}^{n}{({{\alpha }_{i}}+\alpha _{i}^{*})}-\sum\limits_{i=1}^{n}{{{y}_{i}}({{\alpha }_{i}}-\alpha _{i}^{*})}
mini,j=1∑n(αi−αi∗)(αj−αj∗)K(xi,xj)+εi=1∑n(αi+αi∗)−i=1∑nyi(αi−αi∗)
由此可以得到最优的非线性回归函数:
f
(
x
)
=
∑
i
=
1
n
(
α
i
−
α
i
∗
)
K
(
x
i
,
x
j
)
+
b
f(x)=\sum\limits_{i=1}^{n}{({{\alpha }_{i}}-\alpha _{i}^{*})}K({{x}_{i}},{{x}_{j}})+b
f(x)=i=1∑n(αi−αi∗)K(xi,xj)+b
选取径向基函数作为核函数:
K
(
x
i
,
x
j
)
=
exp
(
−
∥
x
i
−
x
j
∥
2
2
σ
2
)
K({{x}_{i}},{{x}_{j}})=\exp (-\frac{{{\left\| {{x}_{i}}-{{x}_{j}} \right\|}^{2}}}{2{{\sigma }^{2}}})
K(xi,xj)=exp(−2σ2∥xi−xj∥2)