例 7.2 训练数据与 例 7.1 相同。如图 7.4 所示,正实例点是 x1=(3,3)Tx_1=(3,3)^Tx1=(3,3)T,x2=(4,3)Tx_2=(4,3)^Tx2=(4,3)T,负例点是x3=(1,1)Tx_3=(1,1)^Tx3=(1,1)T,试用 算法 7.2 求线性可分支持向量机。
算法 7.2 (线性可分支持向量机学习算法)
输入:线性可分训练集
T=(x1,y1),(x2,y2),⋯ ,(xN,yN)T={(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)}T=(x1,y1),(x2,y2),⋯,(xN,yN),其中xi∈χ=Rnx_i \in \chi = \R^nxi∈χ=Rn,yi∈Y=−1,+1y_i \in Y = {-1,+1}yi∈Y=−1,+1,i=1,2,⋯ ,Ni = 1,2,\cdots,Ni=1,2,⋯,N;
输出:分离超平面和分类决策函数。
(1)构造并求解约束最优化问题
minα12∑i=1N∑j=1Nαiαjyiyj(xi⋅xj)−∑i=1Nαi s.t.∑i=1Naiyj=0 ai⩾0,i=1,2,⋯ ,N
\begin{aligned}
&\min_{\alpha} \dfrac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_i\alpha_jy_iy_j(x_i\cdot x_j) - \sum_{i=1}^{N}\alpha_i \\
&~ s.t. \quad \sum_{i=1}^{N}a_iy_j=0 \\
&\quad \quad ~~a_i \geqslant 0, i=1,2,\cdots,N
\end{aligned}
αmin21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαi s.t.i=1∑Naiyj=0 ai⩾0,i=1,2,⋯,N
求解最优解α∗=(α1∗,α2∗,⋯ ,αN∗)T\alpha^*=(\alpha_1^*,\alpha_2^*,\cdots,\alpha_N^*)^Tα∗=(α1∗,α2∗,⋯,αN∗)T。
(2)计算
ω∗=∑i=1Nαi∗yixi(1)\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\omega^* = \sum_{i=1}^N \alpha_i^*y_i x_i \quad \quad\quad\quad\quad\quad(1)ω∗=∑i=1Nαi∗yixi(1)
并选择α∗\alpha^*α∗的一个正分量αj∗>0\alpha_j^* >0αj∗>0,计算
b∗=yj−∑i=1Nαi∗yj(xi⋅xj) (2)\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad \quad \quad \quad \quad \quad \quad \quad b^* = y_j - \sum_{i=1}^N \alpha_i^* y_j(x_i \cdot x_j) \quad ~~ (2)b∗=yj−∑i=1Nαi∗yj(xi⋅xj) (2)
(3)求得分离超平面
ω∗⋅x+b∗=0 \omega^* \cdot x + b^* = 0 ω∗⋅x+b∗=0
分类决策函数:
f(x)=sign(ω∗⋅x+b∗) f(x) = sign(\omega^* \cdot x + b^*)f(x)=sign(ω∗⋅x+b∗)
在线性可分支持向量机中, 由式(1)、式(2)可知,w∗w^*w∗和b∗b^*b∗只依赖于训练数据中对应与αi∗>0\alpha_i^* > 0αi∗>0 的样本点(xi,yi)(x_i,y_i)(xi,yi),而其他样本点对w∗w^*w∗和b∗b^*b∗没有影响。我们将训练数据中对应于 αi∗>0\alpha_i^* >0αi∗>0 的实例点xi∈Rnx_i \in \R^nxi∈Rn 称为支持向量。
解
minα12∑i=1N∑j=1Nαiαjyiyj(xi⋅xj)−∑i=1Nαi=12(18α12+25α22+2α32+42α1α2−12α1α3−14α2α3)−α1−α2−α3 s.t. α1+α2−α3=0 αi⩾0,i=1,2,3
\begin{aligned}
&\min_{\alpha} \dfrac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_i\alpha_jy_iy_j(x_i\cdot x_j) - \sum_{i=1}^{N}\alpha_i \\
&\quad\quad= \dfrac{1}{2}(18\alpha_1^2+25\alpha_2^2+2\alpha_3^2+42\alpha_1\alpha_2 -12\alpha_1\alpha_3-14\alpha_2\alpha_3) -\alpha_1-\alpha_2-\alpha_3 \\
& ~s.t. ~~ \alpha_1 + \alpha_2 - \alpha_3 = 0 \\
& ~\quad\quad \alpha_i \geqslant 0, i=1,2,3\\
\end{aligned}
αmin21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαi=21(18α12+25α22+2α32+42α1α2−12α1α3−14α2α3)−α1−α2−α3 s.t. α1+α2−α3=0 αi⩾0,i=1,2,3
解这一最优化问题,将α3=α1+α2\alpha_3 = \alpha_1 + \alpha_2α3=α1+α2 代入木变函数并记为
s(α1,α2)=4α12+132α22+10α1α2−2α1−2α2 s(\alpha_1, \alpha_2) = 4\alpha_1^2 + \dfrac{13}{2}\alpha_2^2 + 10\alpha_1\alpha_2-2\alpha_1-2\alpha_2s(α1,α2)=4α12+213α22+10α1α2−2α1−2α2
对α1,α2\alpha_1,\alpha_2α1,α2求偏导数并令其为0,易知s(α1,α2)s(\alpha_1,\alpha_2)s(α1,α2) 在点(32,−1)T(\dfrac{3}{2},-1)^T(23,−1)T 取极值,但该点不满足约束条件α2⩾0\alpha_2 \geqslant 0α2⩾0,所以最小值应该在边界上达到。
当α1=0\alpha_1 = 0α1=0 时,最小值s(0,213)=−213s(0,\dfrac{2}{13}) = -\dfrac{2}{13}s(0,132)=−132;当α2=0\alpha_2=0α2=0时,最小值s(14,0)=−14s(\dfrac{1}{4},0)=-\dfrac{1}{4}s(41,0)=−41,于是s(α1,α2)s(\alpha_1,\alpha_2)s(α1,α2) 在α1=14,α2=0\alpha_1=\dfrac{1}{4},\alpha_2=0α1=41,α2=0达到最小,此时α3=α1+α2=14\alpha_3= \alpha_1+\alpha_2=\dfrac{1}{4}α3=α1+α2=41。
此处使用MATLAB画出目标函数的曲面以及最小值点,如下图所示:
可以看出红色的点对应的α2\alpha_2α2值不满足αi⩾0\alpha_i \geqslant 0αi⩾0的约束条件,两个黑色的点分别为α1=0,α2=0\alpha_1=0,\alpha_2=0α1=0,α2=0 时与目标函数对于的曲面s(α1,α2)s(\alpha_1, \alpha_2)s(α1,α2)相交的点。
可以得出α1∗=α3∗=14\alpha_1^*=\alpha_3^* =\dfrac{1}{4}α1∗=α3∗=41对应的实例点x1,x3x_1,x_3x1,x3是支持向量,根据式(1),式(2)计算可得
ω1∗=ω2∗=12 \omega_1^* = \omega_2^* = \dfrac{1}{2}ω1∗=ω2∗=21
b∗=−2b^*=-2b∗=−2
分离超平面为
12x(1)+12x(2)−2=0 \dfrac{1}{2}x^{(1)} + \dfrac{1}{2}x^(2)-2=021x(1)+21x(2)−2=0
分类决策函数为
f(X)=sign(12x(1)+12x(2)−2) f(X) =sign(\dfrac{1}{2}x^{(1)}+\dfrac{1}{2}x^{(2)}-2)f(X)=sign(21x(1)+21x(2)−2)
MATLAB可视化代码如下:
clc,clear
% 绘制曲面
x=linspace(-2,2,25);
y=linspace(-2,2,25);
[alpha1,alpha2]=meshgrid(x,y);
s=4*alpha1.^2+13/2*alpha2.^2+10*alpha1.*alpha2-2*alpha1-2*alpha2;
surf(alpha1,alpha2,s);
hold on
% 添加平面
% 添加竖线
[s,alpha2]=meshgrid(-20:0.1:100,-0.01:0.001:0.01);
alpha1=zeros(size(s))+2;
mesh(alpha1,alpha2,s,'FaceAlpha','0.9','EdgeColor',[0.9290 0.6940 0.1250]);
hold on
[s,alpha2]=meshgrid(-20:0.1:100,-0.01:0.001:0.01);
alpha1=zeros(size(s))-2;
mesh(alpha1,alpha2,s,'FaceAlpha','0.9','EdgeColor',[0.9290 0.6940 0.1250]);
hold on
[s,alpha1]=meshgrid(-20:0.1:100,-0.01:0.001:0.01);
alpha2=zeros(size(s))+2;
mesh(alpha1,alpha2,s,'FaceAlpha','0.9','EdgeColor',[0.4940 0.1840 0.5560]);
hold on
[s,alpha1]=meshgrid(-20:0.1:100,-0.01:0.001:0.01);
alpha2=zeros(size(s))-2;
mesh(alpha1,alpha2,s,'FaceAlpha','0.9','EdgeColor',[0.4940 0.1840 0.5560]);
hold on
% 添加横线
[alpha1,alpha2]=meshgrid(-2:0.1:2,-0.01:0.001:0.01);
s=zeros(size(alpha1))-20;
mesh(alpha1,alpha2,s,'FaceAlpha','0.9','EdgeColor',[0.9290 0.6940 0.1250]);
hold on
[alpha1,alpha2]=meshgrid(-2:0.1:2,-0.01:0.001:0.01);
s=zeros(size(alpha1))+100;
mesh(alpha1,alpha2,s,'FaceAlpha','0.9','EdgeColor',[0.9290 0.6940 0.1250]);
hold on
[alpha2,alpha1]=meshgrid(-2:0.1:2,-0.01:0.001:0.01);
s=zeros(size(alpha2))-20;
mesh(alpha1,alpha2,s,'FaceAlpha','0.01','EdgeColor',[0.4940 0.1840 0.5560]);
hold on
[alpha2,alpha1]=meshgrid(-2:0.1:2,-0.01:0.001:0.01);
s=zeros(size(alpha2))+100;
mesh(alpha1,alpha2,s,'FaceAlpha','0.01','EdgeColor',[0.4940 0.1840 0.5560]);
hold on
% 绘制点
Attribute_Set = {'LineWidth',1.5};
plot3(0,2/13,0,'.','MarkerSize',40,'Color','black');
plot3(1/4,0,0,'.','MarkerSize',40,'Color','black');
plot3(3/2,-1,0,'.','MarkerSize',40,'Color','red');
% 添加函数文本
text(-1.5,-0.25,120,'$s(\alpha_1,\alpha_2)=4\alpha_1^2+\frac{13}{2}\alpha_2^2+10\alpha_1\alpha_2-2\alpha_1-2\alpha_2$','interpreter','latex','FontSize',18);
% 添加坐标文本
text(-0.5,2/13,6,'$s(0,\frac{2}{13})=-\frac{2}{13}$','interpreter','latex','FontSize',18,'Color','black');
text(1/4,0,6,'$s(\frac{1}{4},0)=-\frac{1}{4}$','interpreter','latex','FontSize',18,'Color','black');
text(3/2,-1,6,'$s(\frac{3}{2},-1)=-\frac{1}{2}$','interpreter','latex','FontSize',18,'Color','red');
% 添加坐标轴标签
x1=xlabel('$\alpha_1$','interpreter','latex','FontSize',18); %x轴标题
x2=ylabel('$\alpha_2$','interpreter','latex','FontSize',18); %y轴标题
x3=zlabel('$s$','interpreter','latex','FontSize',18); %z轴标题
set(x1,'Position',[0.75,-3.5,0])
set(x2,'Position',[3,-1,0])
set(x3,'Position',[-2.3,-2,75])
set(x3,'Rotation',-8); %z轴名称旋转

2109

被折叠的 条评论
为什么被折叠?



