SVM简单代码实现MATLAB

2024-06-09 07:58
文章标签 svm matlab 代码 简单 实现

本文主要是介绍SVM简单代码实现MATLAB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

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

二、流程及实现

1.流程图



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



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

主函数代码如下:

[plain]  view plain copy
  1. %------------主函数----------------  
  2. clear all;  
  3. close all;  
  4. C = 10;  %成本约束参数  
  5. kertype = 'linear';  %线性核  
  6.   
  7. %①------数据准备  
  8. n = 30;  
  9. %randn('state',6);   %指定状态,一般可以不用  
  10. x1 = randn(2,n);    %2行N列矩阵,元素服从正态分布  
  11. y1 = ones(1,n);       %1*N个1  
  12. x2 = 4+randn(2,n);   %2*N矩阵,元素服从正态分布且均值为5,测试高斯核可x2 = 3+randn(2,n);   
  13. y2 = -ones(1,n);      %1*N个-1  
  14.    
  15. figure;  %创建一个用来显示图形输出的一个窗口对象  
  16. plot(x1(1,:),x1(2,:),'bs',x2(1,:),x2(2,:),'k+');  %画图,两堆点  
  17. axis([-3 8 -3 8]);  %设置坐标轴范围  
  18. hold on;    %在同一个figure中画几幅图时,用此句  
  19.   
  20. %②-------------训练样本  
  21. X = [x1,x2];        %训练样本2*n矩阵,n为样本个数,d为特征向量个数  
  22. Y = [y1,y2];        %训练目标1*n矩阵,n为样本个数,值为+1或-1  
  23. svm = svmTrain(X,Y,kertype,C);  %训练样本  
  24. plot(svm.Xsv(1,:),svm.Xsv(2,:),'ro');   %把支持向量标出来  
  25.   
  26. %③-------------测试  
  27. [x1,x2] = meshgrid(-2:0.05:7,-2:0.05:7);  %x1和x2都是181*181的矩阵  
  28. [rows,cols] = size(x1);    
  29. nt = rows*cols;                    
  30. Xt = [reshape(x1,1,nt);reshape(x2,1,nt)];  
  31. %前半句reshape(x1,1,nt)是将x1转成1*(181*181)的矩阵,所以xt是2*(181*181)的矩阵  
  32. %reshape函数重新调整矩阵的行、列、维数  
  33. Yt = ones(1,nt);  
  34.   
  35. result = svmTest(svm, Xt, Yt, kertype);  
  36.   
  37. %④--------------画曲线的等高线图  
  38. Yd = reshape(result.Y,rows,cols);  
  39. contour(x1,x2,Yd,[0,0],'ShowText','on');%画等高线  
  40. title('svm分类结果图');     
  41. x1=xlabel('X轴');    
  42. x2=ylabel('Y轴');   

训练样本函数svmTrain:

[plain]  view plain copy
  1. %-----------训练样本的函数---------  
  2. function svm = svmTrain(X,Y,kertype,C)  
  3.   
  4. % Options是用来控制算法的选项参数的向量,optimset无参时,创建一个选项结构所有字段为默认值的选项  
  5. options = optimset;      
  6. options.LargeScale = 'off';%LargeScale指大规模搜索,off表示在规模搜索模式关闭  
  7. options.Display = 'off';    %表示无输出  
  8.   
  9. %二次规划来求解问题,可输入命令help quadprog查看详情  
  10. n = length(Y);  %返回Y最长维数  
  11. H = (Y'*Y).*kernel(X,X,kertype);      
  12. f = -ones(n,1); %f为1*n个-1,f相当于Quadprog函数中的c  
  13. A = [];  
  14. b = [];  
  15. Aeq = Y; %相当于Quadprog函数中的A1,b1  
  16. beq = 0;  
  17. lb = zeros(n,1); %相当于Quadprog函数中的LB,UB  
  18. ub = C*ones(n,1);  
  19. a0 = zeros(n,1);  % a0是解的初始近似值  
  20. [a,fval,eXitflag,output,lambda]  = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);  
  21. %a是输出变量,问题的解  
  22. %fval是目标函数在解a处的值  
  23. %eXitflag>0,则程序收敛于解x;=0则函数的计算达到了最大次数;<0则问题无可行解,或程序运行失败  
  24. %output输出程序运行的某些信息  
  25. %lambda为在解a处的值Lagrange乘子  
  26.   
  27. epsilon = 1e-8;    
  28.  %0<a<a(max)则认为x为支持向量,find返回一个包含数组X中每个非零元素的线性索引的向量。   
  29. sv_label = find(abs(a)>epsilon);       
  30. svm.a = a(sv_label);  
  31. svm.Xsv = X(:,sv_label);  
  32. svm.Ysv = Y(sv_label);  
  33. svm.svnum = length(sv_label);  
  34. %svm.label = sv_label;  
  35. end  

测试函数svmTest:

[plain]  view plain copy
  1. %---------------测试的函数-------------  
  2. function result = svmTest(svm, Xt, Yt, kertype)  
  3. temp = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,svm.Xsv,kertype);  
  4. %total_b = svm.Ysv-temp;  
  5. b = mean(svm.Ysv-temp);  %b取均值  
  6. w = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,Xt,kertype);  
  7. result.score = w + b;  
  8. Y = sign(w+b);  %f(x)  
  9. result.Y = Y;  
  10. result.accuracy = size(find(Y==Yt))/size(Yt);  
  11. end  

核函数kernel:

[plain]  view plain copy
  1. %---------------核函数---------------  
  2. function K = kernel(X,Y,type)  
  3. %X 维数*个数  
  4. switch type  
  5. case 'linear'   %此时代表线性核  
  6.     K = X'*Y;  
  7. case 'rbf'      %此时代表高斯核  
  8.     delta = 5;  
  9.     delta = delta*delta;  
  10.     XX = sum(X'.*X',2);%2表示将矩阵中的按行为单位进行求和  
  11.     YY = sum(Y'.*Y',2);  
  12.     XY = X'*Y;  
  13.     K = abs(repmat(XX,[1 size(YY,1)]) + repmat(YY',[size(XX,1) 1]) - 2*XY);  
  14.     K = exp(-K./delta);  
  15. end  
  16. end  

4. 结果

这篇关于SVM简单代码实现MATLAB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044610

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现