数据建模及MATLAB实现(三)
随着信息技术的发展和成熟,各行业积累的数据越来越多,因此需要通过数据建模的方法,从看似杂乱的海量数据中找到有用的信息。
支持向量机(SVM)
支持向量机(Support Vector Machine,SVM)是新一代的基于统计理论的学习系统。SVM按照监督学习的方式,将训练集按照类别分开,或者是预测新的训练点所对应的类别。
SVM基本思想
SVM目的是构建一个分割两类的超平面,并且令这个超平面使得两类的分割达到最大化。以一个很大的边缘分隔两个类可以使得期望泛化误差最小化——即当出现新的样本时分类错误的概率尽可能得小。
一般来说,两类之间最中间的一个隔板分类错误概率最小,因此,在SVM中,我们也用两类之间的超平面 ω T x i + b = 0 \omega^Tx_i+b=0 ωTxi+b=0作为两类的隔板,而 ω T x i + b = α \omega^Tx_i+b=\alpha ωTxi+b=α与 ω T x i + b = − α \omega^Tx_i+b=-\alpha ωTxi+b=−α分别是两类的平行的边界平面。边界平面,即与分类器平面平行且穿过数据集中的至少一个点的超平面。但边界平面的选择有许多种,要让超平面分割的准确,需要让两个边界平面的距离最大化,也就是边缘最大化。“通过SVM学习”的含义就是找到最大化边缘的超平面。
SVM理论基础
首先,假设存在一个容量为 n n n的训练集样本 { ( x i , y i ) , i = 1 , 2 , ⋯ , n } \{(x_i,y_i),i=1,2,\cdots,n\} {(xi,yi),i=1,2,⋯,n}由两个类别组成,若 x i x_i xi属于第一类,则记 y i = 1 y_i=1 yi=1;若 x i x_i xi属于第二类,则记 y i = − 1 y_i=-1 yi=−1。
若存在分类超平面:
ω
T
x
i
+
b
=
0
\omega^Tx_i+b=0
ωTxi+b=0
则能够将样本正确的分为两类,即相同类别的样本都都落在分类超平面的同一侧。即满足
{
ω
T
x
i
+
b
≥
α
y
i
=
1
ω
T
x
i
+
b
≤
−
α
y
i
=
−
1
α
>
0
\left\{ \begin{aligned} \omega^Tx_i+b&\ge\alpha \ \ \ y_i=1\\ \omega^Tx_i+b&\le-\alpha \ \ \ y_i=-1\\ \alpha&>0 \end{aligned} \right.
⎩
⎨
⎧ωTxi+bωTxi+bα≥α yi=1≤−α yi=−1>0
两边同除以
α
\alpha
α则可表示为
{
ω
T
x
i
+
b
≥
1
y
i
=
1
ω
T
x
i
+
b
≤
−
1
y
i
=
−
1
\left\{ \begin{aligned} \omega^Tx_i+b&\ge1 \ \ \ y_i=1\\ \omega^Tx_i+b&\le-1 \ \ \ y_i=-1 \end{aligned} \right.
{ωTxi+bωTxi+b≥1 yi=1≤−1 yi=−1
可以综合表达为
y
i
(
ω
T
x
i
+
b
)
≥
1
y_i(\omega^Tx_i+b)\ge1
yi(ωTxi+b)≥1
而超平面之间的距离,即边缘可表示为
2
∣
∣
ω
T
∣
∣
\frac{2}{||\omega^T||}
∣∣ωT∣∣2
则规划问题可表示为
m
a
x
:
2
∣
∣
ω
∣
∣
max:\frac{2}{||\omega||}
max:∣∣ω∣∣2
取倒数得
m
i
n
:
∣
∣
ω
∣
∣
2
min:\frac{||\omega||}{2}
min:2∣∣ω∣∣
得到最终目标规划问题:
m
i
n
:
∣
∣
ω
∣
∣
2
s
.
t
.
y
i
(
ω
T
x
i
+
b
)
≥
1
min:||\omega||^2\\ s.t.\ \ \ \ y_i(\omega^Tx_i+b)\ge1
min:∣∣ω∣∣2s.t. yi(ωTxi+b)≥1
最后利用拉格朗日对偶理论,将该问题转化为对偶问题,使用二次规划方法求解,求得最优的
ω
∗
\omega^*
ω∗和
b
∗
b^*
b∗,构造最优分类函数
f
(
x
)
f(x)
f(x)。
在输入空间中,若数据不是线性可分的,支持向量机通过非线性映射 ∅ : R n → F \varnothing:R^n\rightarrow F ∅:Rn→F将数据映射到某个点积空间 F F F,然后在点积空间中执行上述线性算法。在文献中,这一函数称为“核函数”。
支持向量机MATLAB程序设计
支持向量机MATLAB程序设计——SVM.m如下:
function [x,W,R]=SVM(X0)
for i=1:3
X(:,i)=(X0(:,i)-mean(X0(:,i)))/std(X0(:,i));
end
[m,n]=size(X);
e=ones(m,1);
D=[X0(:,4)];
B=zeros(m,m);
C=zeros(m,m);
for i =1:m
B(i,i)=1;
C(i,i)=D(i,1);
end
A=[-X(:,1).*D,-X(:,2).*D,-X(:,3).*D,D,-B];
b=-e;
f=[0,0,0,0,ones(1,m)];
lb=[-inf,-inf,-inf,-inf,zeros(1,m)]';
x=linprog(f,A,b,[],[],lb);
W=[x(1,1),x(2,1),x(3,1)];
CC=x(4,1);
R1=X*W'-CC;
R2=sign(R1);
R=[R1,R2];