一、前言

在推导出SVM公式的基础上,就可以考虑动手实现了。SVM解决分类问题,这里用MATLAB来实现,具体就不多说了,所以首先给出两种标记不同的点,然后分别标记为+1,-1。先训练,再测试,最后画图展示出来。代码也是主演参考的别人的,有加上自己的理解注释。

二、流程及实现

1.流程图

2.大家对二次规划可能有点陌生,可以查看帮助文档或者百度,讲解得都很详细,下面是我简单记录一下,其实就是一一对应起来:

3.得到大致流程之后,下面直接贴代码,复制之后就可直接运行。

主函数代码如下:

%------------主函数----------------

clear all;

close all;

C = 10;  %成本约束参数

kertype = 'linear';  %线性核

%①------数据准备

n = 30;

%randn('state',6);   %指定状态,一般可以不用

x1 = randn(2,n);    %2行N列矩阵,元素服从正态分布

y1 = ones(1,n);       %1*N个1

x2 = 4+randn(2,n);   %2*N矩阵,元素服从正态分布且均值为5,测试高斯核可x2 = 3+randn(2,n);

y2 = -ones(1,n);      %1*N个-1

figure;  %创建一个用来显示图形输出的一个窗口对象

plot(x1(1,:),x1(2,:),'bs',x2(1,:),x2(2,:),'k+');  %画图,两堆点

axis([-3 8 -3 8]);  %设置坐标轴范围

hold on;    %在同一个figure中画几幅图时,用此句

%②-------------训练样本

X = [x1,x2];        %训练样本2*n矩阵,n为样本个数,d为特征向量个数

Y = [y1,y2];        %训练目标1*n矩阵,n为样本个数,值为+1或-1

svm = svmTrain(X,Y,kertype,C);  %训练样本

plot(svm.Xsv(1,:),svm.Xsv(2,:),'ro');   %把支持向量标出来

%③-------------测试

[x1,x2] = meshgrid(-2:0.05:7,-2:0.05:7);  %x1和x2都是181*181的矩阵

[rows,cols] = size(x1);

nt = rows*cols;

Xt = [reshape(x1,1,nt);reshape(x2,1,nt)];

%前半句reshape(x1,1,nt)是将x1转成1*(181*181)的矩阵,所以xt是2*(181*181)的矩阵

%reshape函数重新调整矩阵的行、列、维数

Yt = ones(1,nt);

result = svmTest(svm, Xt, Yt, kertype);

%④--------------画曲线的等高线图

Yd = reshape(result.Y,rows,cols);

contour(x1,x2,Yd,[0,0],'ShowText','on');%画等高线

title('svm分类结果图');

x1=xlabel('X轴');

x2=ylabel('Y轴');

训练样本函数svmTrain:

%-----------训练样本的函数---------

function svm = svmTrain(X,Y,kertype,C)

% Options是用来控制算法的选项参数的向量,optimset无参时,创建一个选项结构所有字段为默认值的选项

options = optimset;

options.LargeScale = 'off';%LargeScale指大规模搜索,off表示在规模搜索模式关闭

options.Display = 'off';    %表示无输出

%二次规划来求解问题,可输入命令help quadprog查看详情

n = length(Y);  %返回Y最长维数

H = (Y'*Y).*kernel(X,X,kertype);

f = -ones(n,1); %f为1*n个-1,f相当于Quadprog函数中的c

A = [];

b = [];

Aeq = Y; %相当于Quadprog函数中的A1,b1

beq = 0;

lb = zeros(n,1); %相当于Quadprog函数中的LB,UB

ub = C*ones(n,1);

a0 = zeros(n,1);  % a0是解的初始近似值

[a,fval,eXitflag,output,lambda]  = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);

%a是输出变量,问题的解

%fval是目标函数在解a处的值

%eXitflag>0,则程序收敛于解x;=0则函数的计算达到了最大次数;<0则问题无可行解,或程序运行失败

%output输出程序运行的某些信息

%lambda为在解a处的值Lagrange乘子

epsilon = 1e-8;

%0

sv_label = find(abs(a)>epsilon);

svm.a = a(sv_label);

svm.Xsv = X(:,sv_label);

svm.Ysv = Y(sv_label);

svm.svnum = length(sv_label);

%svm.label = sv_label;

end

%---------------测试的函数-------------

function result = svmTest(svm, Xt, Yt, kertype)

temp = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,svm.Xsv,kertype);

%total_b = svm.Ysv-temp;

b = mean(svm.Ysv-temp);  %b取均值

w = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,Xt,kertype);

result.score = w + b;

Y = sign(w+b);  %f(x)

result.Y = Y;

result.accuracy = size(find(Y==Yt))/size(Yt);

end

%---------------核函数---------------

function K = kernel(X,Y,type)

%X 维数*个数

switch type

case 'linear'   %此时代表线性核

K = X'*Y;

case 'rbf'      %此时代表高斯核

delta = 5;

delta = delta*delta;

XX = sum(X'.*X',2);%2表示将矩阵中的按行为单位进行求和

YY = sum(Y'.*Y',2);

XY = X'*Y;

K = abs(repmat(XX,[1 size(YY,1)]) + repmat(YY',[size(XX,1) 1]) - 2*XY);

K = exp(-K./delta);

end

end

4.结果

svm matlab 画图,SVM简单代码实现MATLAB相关推荐

  1. matlab分类器设计,简单分类器的MATLAB实现.doc

    简单分类器的MATLAB实现.doc 简单分类器的MATLAB实现 摘要:本实验运用最小距离法.Fisher线形判别法.朴素贝叶斯法.K近邻法四种模式识别中最简单的方法处理两维两类别的识别问题,最后对 ...

  2. 初级Matlab画图经验简单记录以及错误使用plot矢量长度必须相同问题解决

    matlab画图简单方便.美观可编辑,是把实验数据用来画图的很好的选择工具,这里简单记一下我的使用, 以及使用过程中遇到的问题和解决.其实也是小问题,只是用的少所以不熟练,遇到的问题也是很普遍的问题, ...

  3. 用matlab仿真杨氏干涉代码,基于MATLAB杨氏干涉仿真实验

    基于MATLAB杨氏干涉仿真实验 张防震 朱亚琼 (河南财政税务高等专科学校 河南 郑州 450002) 摘 要: 利用MATLAB高性能的数值计算和可视化软件特点,对光学中的杨氏干涉实验进行仿真.单 ...

  4. matlab中codegen是什么,从 MATLAB 代码生成 C/C++ 代码。 - MATLAB codegen - MathWorks 中国...

    -c生成 C/C++ 代码,但不调用 make 命令. -config:dll使用默认配置参数生成动态 C/C++ 库. -config:exe使用默认配置参数生成静态 C/C++ 可执行文件. -c ...

  5. matlab各种潮流计算代码,基于MATLAB的潮流计算源程序代码

    <基于MATLAB的潮流计算源程序代码>由会员分享,可在线阅读,更多相关<基于MATLAB的潮流计算源程序代码(7页珍藏版)>请在人人文库网上搜索. 1.*电力系统直角坐标系下 ...

  6. matlab求阶乘函数的代码,用matlab编写阶乘函数,调用该函数生成1!,……10!的阶乘表...

    由热心网友 zzfg511bhk 提供的答案1: for i=1:10 A(i,:)=[i fac(i)] end 其中 fac(n)为求阶乘的函数保存在fac.m文件中 答:Matlab 2015R ...

  7. matlab中加入C代码:matlab中安装C语言编译器TDM-GCC,编译、运行及mexFunction接口设置

    通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度.Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Watcom C中的一种. 如果你在安装Matlab ...

  8. matlab 实现dtmf 信号检测代码,基于matlab的连续DTMF信号检测的程序实现

    2009 年第 4 期福 建 电 脑基于 matlab 的连续 DTMF 信号检测的程序实现 张 昊 ( 河南师范大学 计算机与信息技术学院 通信工程专业 2006 级 河南 新乡 453007 ) ...

  9. matlab画图并倒转纵坐标,在MATLAB中将y轴上下颠倒

    Is there a way to turn the y axis upside down in matlab plots, so that the positive direction of the ...

最新文章

  1. App分享之微信微博等各个社交平台的分享授权规则和常见问题
  2. android 从底部网上的平移动画_Android属性动画,看完这篇够用了吧
  3. Oracle 表空间信息
  4. 用 chown 和 chmod 修改目录所属用户及权限
  5. Oracle中大批量删除数据的方法
  6. 查看linux服务器的系统信息
  7. 计算机二级c语言2021年重点内容,2021年5月计算机二级C语言试题(总)
  8. shell检查硬盘分区空间
  9. Vonage再度入围IDC CPaaS“领导者”
  10. 读芯术python讲的怎么样_Python这么火,为什么说它不是未来的编程语言?
  11. 30天自制操作系统-Hello OS
  12. 【正点原子FPGA连载】第三十三章环境光传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
  13. 删了手机里的一个html文件,手机操作篇:手机上怎么删除pdf其中一页
  14. c语言if语句教学设计,if语句教学设计
  15. 面试记录-美团提前批(AI 专场)【已拿offer】
  16. 【应用随机过程】04. 马尔可夫链的平稳分布
  17. 『分享』水平集算法简介(Level Set)
  18. 支持+86的手机和电话号码验证正则表达式
  19. Linux云服务-Mysql卸载篇
  20. 浪潮服务器系统raid5,浪潮服务器RAID配置及系统引导.doc

热门文章

  1. python的unittest面试题_unittest 知识问答题-也许面试会有用-欢迎补充
  2. 电脑音箱里有杂音的另种原因
  3. Android构建出现的问题?You must specify a URL for a Maven repository.
  4. 报错 XACONNECTIONFACTORY: FAILED TO CREATE POOLED CONNECTION - DBMS DOWN OR UNREACHABLE?
  5. 安卓 Spinner的用法
  6. SequoiaDB和mysql_Mysql的JSON与SequoiaDB的比较
  7. 查看计算机远程端口,CMD下查3389远程端口
  8. numpy中的meshgrid函数
  9. checkbox不显示,试试去掉-webkit-appearance这个样式
  10. 实践:动手搭建神经机器翻译模型