svm matlab 画图,SVM简单代码实现MATLAB
一、前言
在推导出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相关推荐
- matlab分类器设计,简单分类器的MATLAB实现.doc
简单分类器的MATLAB实现.doc 简单分类器的MATLAB实现 摘要:本实验运用最小距离法.Fisher线形判别法.朴素贝叶斯法.K近邻法四种模式识别中最简单的方法处理两维两类别的识别问题,最后对 ...
- 初级Matlab画图经验简单记录以及错误使用plot矢量长度必须相同问题解决
matlab画图简单方便.美观可编辑,是把实验数据用来画图的很好的选择工具,这里简单记一下我的使用, 以及使用过程中遇到的问题和解决.其实也是小问题,只是用的少所以不熟练,遇到的问题也是很普遍的问题, ...
- 用matlab仿真杨氏干涉代码,基于MATLAB杨氏干涉仿真实验
基于MATLAB杨氏干涉仿真实验 张防震 朱亚琼 (河南财政税务高等专科学校 河南 郑州 450002) 摘 要: 利用MATLAB高性能的数值计算和可视化软件特点,对光学中的杨氏干涉实验进行仿真.单 ...
- matlab中codegen是什么,从 MATLAB 代码生成 C/C++ 代码。 - MATLAB codegen
- MathWorks 中国...
-c生成 C/C++ 代码,但不调用 make 命令. -config:dll使用默认配置参数生成动态 C/C++ 库. -config:exe使用默认配置参数生成静态 C/C++ 可执行文件. -c ...
- matlab各种潮流计算代码,基于MATLAB的潮流计算源程序代码
<基于MATLAB的潮流计算源程序代码>由会员分享,可在线阅读,更多相关<基于MATLAB的潮流计算源程序代码(7页珍藏版)>请在人人文库网上搜索. 1.*电力系统直角坐标系下 ...
- matlab求阶乘函数的代码,用matlab编写阶乘函数,调用该函数生成1!,……10!的阶乘表...
由热心网友 zzfg511bhk 提供的答案1: for i=1:10 A(i,:)=[i fac(i)] end 其中 fac(n)为求阶乘的函数保存在fac.m文件中 答:Matlab 2015R ...
- matlab中加入C代码:matlab中安装C语言编译器TDM-GCC,编译、运行及mexFunction接口设置
通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度.Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Watcom C中的一种. 如果你在安装Matlab ...
- matlab 实现dtmf 信号检测代码,基于matlab的连续DTMF信号检测的程序实现
2009 年第 4 期福 建 电 脑基于 matlab 的连续 DTMF 信号检测的程序实现 张 昊 ( 河南师范大学 计算机与信息技术学院 通信工程专业 2006 级 河南 新乡 453007 ) ...
- matlab画图并倒转纵坐标,在MATLAB中将y轴上下颠倒
Is there a way to turn the y axis upside down in matlab plots, so that the positive direction of the ...
最新文章
- App分享之微信微博等各个社交平台的分享授权规则和常见问题
- android 从底部网上的平移动画_Android属性动画,看完这篇够用了吧
- Oracle 表空间信息
- 用 chown 和 chmod 修改目录所属用户及权限
- Oracle中大批量删除数据的方法
- 查看linux服务器的系统信息
- 计算机二级c语言2021年重点内容,2021年5月计算机二级C语言试题(总)
- shell检查硬盘分区空间
- Vonage再度入围IDC CPaaS“领导者”
- 读芯术python讲的怎么样_Python这么火,为什么说它不是未来的编程语言?
- 30天自制操作系统-Hello OS
- 【正点原子FPGA连载】第三十三章环境光传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
- 删了手机里的一个html文件,手机操作篇:手机上怎么删除pdf其中一页
- c语言if语句教学设计,if语句教学设计
- 面试记录-美团提前批(AI 专场)【已拿offer】
- 【应用随机过程】04. 马尔可夫链的平稳分布
- 『分享』水平集算法简介(Level Set)
- 支持+86的手机和电话号码验证正则表达式
- Linux云服务-Mysql卸载篇
- 浪潮服务器系统raid5,浪潮服务器RAID配置及系统引导.doc
热门文章
- python的unittest面试题_unittest 知识问答题-也许面试会有用-欢迎补充
- 电脑音箱里有杂音的另种原因
- Android构建出现的问题?You must specify a URL for a Maven repository.
- 报错 XACONNECTIONFACTORY: FAILED TO CREATE POOLED CONNECTION - DBMS DOWN OR UNREACHABLE?
- 安卓 Spinner的用法
- SequoiaDB和mysql_Mysql的JSON与SequoiaDB的比较
- 查看计算机远程端口,CMD下查3389远程端口
- numpy中的meshgrid函数
- checkbox不显示,试试去掉-webkit-appearance这个样式
- 实践:动手搭建神经机器翻译模型