-
2015-07-07 20:48:56
支持向量机(SVM)的matlab的实现
支持向量机是一种分类算法之一,matlab中也有相应的函数来对其进行求解;下面贴一个小例子,这个例子来源于我们实际的项目。
clc; clear; N=10; %下面的数据是我们实际项目中的训练样例(样例中有8个属性) correctData=[0,0.2,0.8,0,0,0,2,2]; errorData_ReversePharse=[1,0.8,0.2,1,0,0,2,2]; errorData_CountLoss=[0.2,0.4,0.6,0.2,0,0,1,1]; errorData_X=[0.5,0.5,0.5,1,1,0,0,0]; errorData_Lower=[0.2,0,1,0.2,0,0,0,0]; errorData_Local_X=[0.2,0.2,0.8,0.4,0.4,0,0,0]; errorData_Z=[0.53,0.55,0.45,1,0,1,0,0]; errorData_High=[0.8,1,0,0.8,0,0,0,0]; errorData_CountBefore=[0.4,0.2,0.8,0.4,0,0,2,2]; errorData_Local_X1=[0.3,0.3,0.7,0.4,0.2,0,1,0]; sampleData=[correctData;errorData_ReversePharse;errorData_CountLoss;errorData_X;errorData_Lower;errorData_Local_X;errorData_Z;errorData_High;errorData_CountBefore;errorData_Local_X1];%训练样例 type1=1;%正确的波形的类别,即我们的第一组波形是正确的波形,类别号用 1 表示 type2=-ones(1,N-2);%不正确的波形的类别,即第2~10组波形都是有故障的波形,类别号用-1表示 groups=[type1 ,type2]';%训练所需的类别号 j=1; %由于没有测试数据,因此我将错误的波形数据轮流从训练样例中取出作为测试样例 for i=2:10 tempData=sampleData; tempData(i,:)=[]; svmStruct = svmtrain(tempData,groups); species(j) = svmclassify(svmStruct,sampleData(i,:)); j=j+1; end species
输出结果如下:
-1 -1 -1 -1 -1 -1 -1 1 -1
从结果可以看出:只有第九个被误判,其它的都是正确的。
上面只是用于说明matlab中支持向量机中函数的用法,因为在训练集中我只用了一个正确的波形和九组有故障的波形作为训练集,因此这种超平面的选取可能不好。但是,在我们的实际的项目中,我们是用到了许多的训练集的。
上面是调用matlab中的函数实现多维属性中的支持向量机对其进行分类。
下面是自己实现此功能,不调用matlab中的支持向量机的函数。代码如下:
%主函数 clear all; clc; C = 10; kertype = 'linear'; %训练样本 n = 50; randn('state',6);%可以保证每次每次产生的随机数一样 x1 = randn(2,n); %2行N列矩阵 y1 = ones(1,n); %1*N个1 x2 = 5+randn(2,n); %2*N矩阵 y2 = -ones(1,n); %1*N个-1 figure; plot(x1(1,:),x1(2,:),'bx',x2(1,:),x2(2,:),'k.'); axis([-3 8 -3 8]); xlabel('x轴'); ylabel('y轴'); hold on; X = [x1,x2]; %训练样本d*n矩阵,n为样本个数,d为特征向量个数,在这里,X为一个2*100的数组 Y = [y1,y2]; %训练目标1*n矩阵,n为样本个数,值为+1或-1,在这里,Y为一个1*100的数组 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)]; Yt = ones(1,nt); result = svmTest(svm, Xt, Yt, kertype); Yd = reshape(result.Y,rows,cols); contour(x1,x2,Yd,'m');
训练集函数如下:
function svm = svmTrain(X,Y,kertype,C) options = optimset; % Options是用来控制算法的选项参数的向量 options.LargeScale = 'off';%LargeScale指大规模搜索,off表示在规模搜索模式关闭 options.Display = 'off';%这样设置意味着没有输出 n = length(Y);%数组Y的长度 H = (Y'*Y).*kernel(X,X,kertype);%调用kernel函数, 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); epsilon = 1e-8; sv_label = find(abs(a)>epsilon); %0<a<a(max)则认为x为支持向量 svm.a = a(sv_label); svm.Xsv = X(:,sv_label); svm.Ysv = Y(sv_label); svm.svnum = length(sv_label); %svm.label = sv_label;
核函数如下:
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);%sum(a,2)代码中参数2的意思是将a矩阵a中的按“行”为单位进行求和 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
测试函数如下
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(total_b); w = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,Xt,kertype); result.score = w + b; Y = sign(w+b); result.Y = Y; result.accuracy = size(find(Y==Yt))/size(Yt);
要说明的是,上面的代码是实现的关于我们样本只有2个属性的情况;当我们的样本用多个属性时,我们需要修改部分代码即可。
更多相关内容 -
支持向量机进行预测(SVM)Matlab版,svm支持向量机matlab代码,matlab
2019-05-14 11:13:51好用的matlab代码,可以使用,效果很好,希望能让您满意 -
支持向量机(SVM)matlab代码
2017-12-16 10:47:00支持向量机(SVM)matlab代码,用于二分类问题的模板。 -
支持向量机进行预测(SVM)Matlab版,svm支持向量机matlab代码,matlab源码.zip
2021-10-14 23:35:44支持向量机进行预测(SVM)Matlab版,svm支持向量机matlab代码,matlab源码.zip -
BP神经网络、ELM极限学习机、SVM支持向量机MATLAB代码,以及测试数据,用于回归预测
2019-03-22 10:40:19BP神经网络、ELM极限学习机、SVM支持向量机MATLAB代码,以及测试数据,用于回归预测,相关细节可以在下方评论,看到时一一解答。 -
基于SVM支持向量机算法的降水量预测模型代码_SVM_SVM预测_blues1l_基于SVM支持向量机对降水量的预测_降水、...
2021-09-11 16:00:14本文基于SVM支持向量机算法,来实现降水量预测。 -
SVM:支持向量机代码-matlab开发
2021-05-30 06:10:50这个 svm 代码是为了分类两个不同的类而编写的。 -
MATLAB源码集锦-基于SVM支持向量机算法的降水量预测模型代码
2021-02-16 17:15:39MATLAB源码集锦-基于SVM支持向量机算法的降水量预测模型代码 -
PSO-SVM 粒子算法优化支持向量机MATLAB代码.rar
2021-12-18 21:04:05参考学习 -
支持向量机进行预测(SVM)Matlab版.rar
2019-05-14 11:13:51基于matlab的svm预测 代码 -
MATLAB支持向量机(SVM)GUI
2018-08-16 16:17:53此SVM_GUI是基于libsvm-FarutoUltimate3.0,所以你需要实现安装该工具箱。操作简单,具体使用可参看内部说明文件。 -
svm支持向量机_MATLAB向量机_
2021-10-03 14:12:02MATLAB实验,实现svm向量机,内含程序代码和数据 -
PSO-SVM 粒子算法优化支持向量机MATLAB代码
2018-03-21 20:11:33用粒子群算法优化支持向量机的matlab程序,用于对股价、经济的预测作用,优化后预测精确 -
支持向量机SVM的matlab代码
2017-04-20 10:48:53支持向量机SVM的matlab代码 -
支持向量机进行预测SVM(Matlab版)
2021-11-12 14:24:45支持向量机进行预测SVM(Matlab版) 使用支持向量机进行预测。调用示例: in=load('testData.txt'); SVM(in(:,2:12),in(:,1),3) -
支持向量机matlab代码
2018-08-15 15:20:15支持向量机svm代码 matlab代码 用于分类的 比传统bp神经网络好 -
【SVM分类】基于支持向量机实现数据分类附matlab代码
2022-01-30 17:10:22支持向量机是利用已知数据类别的样本为训练样本,寻找同类数据的空间聚集特征,从而对测试样本进行分类验证,通过验证可将分类错误的数据进行更正。本文以体检数据为数据背景,首先通过利用因子分析将高维数据进行...1 简介
支持向量机是利用已知数据类别的样本为训练样本,寻找同类数据的空间聚集特征,从而对测试样本进行分类验证,通过验证可将分类错误的数据进行更正。本文以体检数据为数据背景,首先通过利用因子分析将高维数据进行降维,由此将所有指标整合成几个综合性指标;为降低指标之间的衡量标准所引起的误差,本文利用 MATLAB软件将数据进行归一化处理,结合聚类分析将数据分类;最后本文利用最小二乘支持向量机分类算法进行分类验证,从而计算出数据分类的准确率,并验证了数据分类的准确性和合理性。
2 部分代码
%% 清空环境变量
clc
clear;
close all;
%% 加载能量特征样本
data_123=xlsread('data.xlsx');
%% 构造训练样本和测试样本
sample_1=data_123(1:15,1:5); %
rowrank_1=randperm(size(sample_1,1)); %这里对数据的行进行随机排列;% 随机打乱矩阵的行数
data_1 = sample_1(rowrank_1, :); %data_1表示随机排列后的数据样本
sample_2=data_123(16:25,1:5); %
rowrank_2=randperm(size(sample_2,1)); %这里对数据的行进行随机排列;% 随机打乱矩阵的行数
data_2 = sample_2(rowrank_2, :); %data_2表示随机排列后的数据样本
sample_3=data_123(26:38,1:5); %
rowrank_3=randperm(size(sample_3,1)); %这里对数据的行进行随机排列;% 随机打乱矩阵的行数
data_3 = sample_3(rowrank_3, :); %data_3表示随机排列后的数据样本
sample_4=data_123(39:47,1:5); % 正常
rowrank_4=randperm(size(sample_4,1)); %这里对数据的行进行随机排列;% 随机打乱矩阵的行数
data_4 = sample_4(rowrank_4, :); %data_4表示随机排列后的数据样本
%定义一个变量m,表示选取每种故障训练样本的个数
m=6; %每种类型选取前 m 组作为训练样本。
train_values_1 =data_1(1:m,1:4);
% [train_values_1,settings1] = mapminmax(train_values_1);
train_labels_1=data_1(1:m,5);
train_values_2 =data_2(1:m,1:4);
% [train_values_2,settings2] = mapminmax(train_values_2);
train_labels_2=data_2(1:m,5);
train_values_3 =data_3(1:m,1:4);
% [train_values_3,settings3] = mapminmax(train_values_3);
train_labels_3=data_3(1:m,5);
train_values_4 =data_4(1:m,1:4);
train_labels_4=data_4(1:m,5);
train_values=[train_values_1;train_values_2;train_values_3;train_values_4];
train_labels=[train_labels_1;train_labels_2;train_labels_3;train_labels_4];
%%测试样本
test_values_1 =data_1(m+1:end,1:4);
test_labels_1=data_1(m+1:end,5);
test_values_2 =data_2(m+1:end,1:4);
test_labels_2=data_2(m+1:end,5);
test_values_3 =data_3(m+1:end,1:4);
test_labels_3=data_3(m+1:end,5);
test_values_4 =data_4(m+1:end,1:4);
test_labels_4=data_4(m+1:end,5);
test_values=[test_values_1;test_values_2;test_values_3;test_values_4];
test_labels=[test_labels_1;test_labels_2;test_labels_3;test_labels_4];
tic; %计时开始
%% SVM网络训练
%%参数寻优
[bestacc,bestc,bestg] = SVMcgForClass(train_labels,train_values); %%这里是寻找最优的惩罚系数和核参数
disp(['bestmse=',num2str(bestacc)]);
disp(['bestc=',num2str(bestc)]); %惩罚系数
disp(['bestg=',num2str(bestg)]); %核参数
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
%% 训练并对训练集分类
model = svmtrain(train_labels,train_values,cmd);
%% SVM测试样本分类
[predict_label,accuracy] = svmpredict(test_labels,test_values,model);
% 打印测试集分类准确率
total = length(test_labels); %% the number of label
right = sum(predict_label == test_labels); %% find the accurate number of labels;如果预测的标签和给定的标签是一致的,那么right计数加和;
disp('打印测试集分类准确率');
str = sprintf( 'Accuracy = %g%% (%d/%d)',accuracy(1),right,total);
disp(str);
disp(['bestc=',num2str(bestc)]); %惩罚系数
disp(['bestg=',num2str(bestg)]); %核参数
%% 结果分析
% 测试集的实际分类和预测分类图
figure;
hold on;
plot(test_labels,'o');
plot(predict_label,'r*');
xlabel('测试集样本','FontSize',12);
ylabel('类别标签','FontSize',12);
legend('实际测试集分类','预测测试集分类');
title('基于SVM模型的测试集的实际分类和预测分类图','FontSize',12);
grid on;
toc; %计时结束
3 仿真结果
4 参考文献
[1]王琳, 解婷婷. 基于支持向量机算法的数据分类验证研究[J]. 四川文理学院学报, 2016, 026(005):21-24.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
-
SVM支持向量机分类鸢尾花数据集iris及代码
2020-09-30 08:25:18SVM支持向量机分类鸢尾花数据集iris及代码,数据集有Excel、data、txt文件格式,代码有data、txt格式演示 -
SVM支持向量机,实现iris二分类问题
2021-06-16 20:50:06matlab程序+数据集(预处理完成的) -
matlab中rbf源代码-gbt-svm:粒度二叉树支持向量机的MATLAB工具箱
2021-05-27 11:56:00matlab中rbf源代码支持向量机 在该存储库中,提供了一个MATLAB工具箱,以针对不平衡和多类型分类问题训练和测试基于支持向量机(SVM)的模型。 附加了两个分类技巧,即granularization和binary-tree以形成GBT-SVM... -
利用支持向量机(SVM)进行分类的Matlab实现
2022-04-22 09:47:49看到目前博客上的支持向量机的matlab代码都是从底层原理开始编起,这对单纯想使用支持向量机实现一个简单的分类的人来说十分不友好,其实matlab内已有封装好的支持向量机代码,本文简单记录一下如何使用。...
前言
看到目前博客上的支持向量机的matlab代码都是从底层原理开始编起,这对单纯想使用支持向量机实现一个简单的分类的人来说十分不友好,其实matlab内已有封装好的支持向量机代码,本文简单记录一下如何使用。
一、支持向量机是什么?
对于一个二分类任务来说,支持向量机的目的是寻找一个最优超平面,使得样本在超平面的两侧,在边界(图中虚线)上的样本被叫做支持向量。
那么要想实现一个分类任务,支持向量机的输入和输出分别是什么呢?作为一种监督学习的算法,每个样本肯定要有标签,也就是该样本到底是哪一类;要进行分类,那每个样本都要有自己的特征,当然这个特征可以有很多个,所以SVM的输入是特征矩阵以及类标签。二、步骤
1.构建特征矩阵和类标签
这里以matlab中的鸢尾花数据集为例进行说明,load fisheriris导入鸢尾花数据集,导入的变量有meas和species两个,其中meas是150*4的矩阵,表示有150个样本,每个样本有4个特征;species是一个元胞数组,存放的是鸢尾花的类型,有’setosa’,'versicolor’和’virginica’三类鸢尾花, 由于本文实现二分类,故把第三类virginica删除。
load fisheriris %加载鸢尾花数据集 meas(101:150,:)=[]; %删除virginica类 species(101:150,:)=[];
2.使用fitcsvm函数训练svm
上一步中已经构造好了样本的特征矩阵和样本的标签,使用fitcsvm函数可以训练支持向量机模型。
SVMModel = fitcsvm(meas,species)
下图是训练好的支持向量机
3.使用predict函数验证svm
使用predict函数可以检验svm的准确性,选择90%的样本用于训练,10%的样本用于测试。
CVSVMModel = fitcsvm(meas,species,'Holdout',0.1); %随机选择10%的样本用于测试 CompactSVMModel = CVSVMModel.Trained{1}; testInds = test(CVSVMModel.Partition); % 提取那10%用于测试的部分的下标 dataTest = meas(testInds,:); % 提取那10%用于测试的部分的数据集 labelTest = species(testInds,:); % 提取那10%用于测试的部分的标签 label_predict = predict(CompactSVMModel,dataTest);
label_predict中存放的便是预测结果,可以与labelTest进行比较,检验预测结果的正确性。
可以用表格的方式进行可视化table(labelTest,label_predict,score(:,2),'VariableNames',... {'TrueLabel','PredictedLabel','Score'})
结果如下:
可以看到,对于测试集的所有样本,分类均是正确的。4.完整代码
clc clear load fisheriris meas(101:150,:)=[]; species(101:150,:)=[]; CVSVMModel = fitcsvm(meas,species,'Holdout',0.1); %随机选择10%的样本用于测试 CompactSVMModel = CVSVMModel.Trained{1}; testInds = test(CVSVMModel.Partition); % 提取那10%用于测试的部分的下标 dataTest = meas(testInds,:); % 提取那10%用于测试的部分的数据集 labelTest = species(testInds,:); % 提取那10%用于测试的部分的标签 label_predict = predict(CompactSVMModel,dataTest); table(labelTest,label_predict,'VariableNames',... {'TrueLabel','PredictedLabel'})
总结
本文利用matlab自带的函数实现了一个简单的SVM二分类问题,更多内容,可以在命令行中输入doc svm,打开帮助文档进行学习。
-
Python中的支持向量机SVM的使用(附实例代码)
2020-12-26 01:22:20除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类。因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm。 一、导入sklearn算法包 Scikit-Learn库已经实现了所有... -
matlab-SVM支持向量机数据分类-高精度
2021-11-15 09:58:03使用SVM对数据进行分类 -
最小二乘支持向量机LS-SVM的MAtlab代码
2019-09-08 01:27:24最小二乘支持向量机LS-SVM的Matlab代码,比利时鲁汶大学网站提供,在Matlab里直接添加路径,即可使用 LS-SVMlab1.5.rar 249.09 KB, 下载次数: 293 , 下载积分: 资产 -2 信元, 下载支出 2 信元 -
基于SVM(支持向量机) 的人脸识别 matlab 代码.zip
2019-08-20 14:57:07基于SVM(支持向量机) 的人脸识别 matlab 代码 -
支持向量机手写体识别matlab
2018-10-26 11:45:15SVM的手写体识别matlab程序,附带数据源,安装limSVM后可直接运行 -
【SVM预测】灰狼算法优化svm支持向量机预测matlab源码.md
2021-08-23 15:00:47【SVM预测】灰狼算法优化svm支持向量机预测matlab源码.md -
PSO SVM粒子算法优化的支持向量机,pso粒子群优化算法,matlab
2021-09-11 01:23:24使用PSO优化SVR支持向量机模型的代码,有详细的输出及输出,以及代码说明 -
svm_svm预测_svmmatlab_支持向量机_预测_
2021-10-01 05:52:53matlab支持向量机可以对模型进行预测,具有良好的预测效果