%
%简单的SVM程序,用于演示四个点的两类分类情况
%此例子为线性可分情况
%课上PPT例程
%
clc; %关闭所有的变量和窗口
clear all;
close all;
%定义各个点
t=[0 0;0 1;1 0;1 1]; %输入
y=[1 1 -1 -1]; %点的分类
[m,n]=size(t);
x=zeros(m,1);
%解释quadprog(H,f,A,b,Aeq,beq),原型为 min 1/2*x'*H*x+f'*x
%限制条件为:A*x<=b Aeq*x=beq
%所求的函数为min 1/2*x'*A*x-f'*x
%限制条件为:xi>=0,y'*x=0;x为所求,f=(1 1...1)',
%y=(y1,y2...yn);Aij=yi*yj(xi.xj)
%所以H=A,f=-b,A=-eye(n),;b=zeros(6,1)
for i=1:m
for j=1:m
A(i,j)=y(i)*y(j)*(t(i,1)*t(j,1)+t(i,2)*t(j,2)); %误差函数去掉常数项之后的二次项的矩阵
end
end
f=-ones(m,1); %误差函数去掉常数项之后一次项的矩阵
%-----------------------------------------------------------------------------------------------------------------------
b=zeros(m,1); %要求每一个ai在这里是xi大于零是约束条件(不等式约束)
m_2=-eye(m,m); %不等式约束,ai在这里叫xi的系数矩阵(不等式约束)
%----------------------------------------------------------------------------------------------------------------------------------
%是因为有时候在寻优的时候 H 阵是一个行列式为0的矩阵,
%这样函数就没办法工作,所以要加一个极小值
A=A+1.0e-10*eye(size(A));
%beq=zeros(m,m); %等式约束,要求yiai即yixi的合等于零,(等式约束)
Aeq=y; %等式约束,yi的系数矩阵因为yiai即yixi的合等于零,(等式约束)
beq=0; %等式约束,要求yiai即yixi的合等于零,(等式约束)
%---------------------------------------------------------------------------------------------------------------------------
x=quadprog(A,f,m_2,b,Aeq,beq); %利用quadprog函数解决二维的规划问题,求解出ai这里叫xi
%---------------------------------------------------------------------------------------------------------------------------------
%计算w和b,其中w=(x与y以及各点坐标的和)。当是支持向量时(x(i)不等零时),
%利用x(i)(y(i)(w*x+b)-1)=0计算出b。
w=zeros(1,2);
for i=1:m
w=t(i,:)*y(i)*x(i)+w; %利用w等于ai*yi*xi的合在这里是ti*yi*xi的合求出wi
end
%----------------------------------------------------------------------------------------------------------------------
j=1;
while x(j)<1.0e-5 %这里是对ai即xi进行了修减
j=j+1;
end
w1=w*t(j,:)'; %更新w
b1=1/y(j)-w1; %更新b1
%------------------------------------------------------------------------------------------------------------
%----------------------------------------------------------------------------------------------------------------------------
%画图,绘制曲线
title('线性可分SVM');
hold on;
axis([-1 2 -1 2]); %%不规范
hold on;
xlabel('X1');
hold on;
ylabel('X2');
hold on;
plot(t(1:2,1),t(1:2,2),'R+',t(3:4,1),t(3:4,2),'bp');%不规范,要重写
hold on;
f2=[num2str(w(1,1)) '*x1+(' num2str(w(1,2)) ')*x2+(' num2str(b1) ')'] ;%%生成函数字符串,不是简练。
h=ezplot(f2,[-1,2]);
grid;
学习笔记,记录一下方便以后查看!