matlab实现的一个简易的svm用于演示四个点的两类分类问题

%
%简单的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;

学习笔记,记录一下方便以后查看!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值