支持向量机原理及matlab代码讲解(分类SVM和回归SVR)

0  引言

支持向量机(support vector machine,SVM)是20世纪90年代基于统计学习理论和结构风险最小化原理提出机器学习分类器,该模型在解决小样本数据集和高维问题表现出特有的优势。后期发展过程在Vapnik等[37]研究学者扩展下建立回归技术模型(support vector regression,SVR)。

1  原理

其基本原理是在特征空间中找到一个最优超平面,使得两个类别的样本点之间的间隔最大化。有兴趣朋友可以通过以下链接观看其原理:

https://www.bilibili.com/video/BV16T4y1y7qj/?vd_source=bc22599c6ab6c0ae1086f19f81210469

2  代码详解

2.1 函数libsvm库的下载

在进行支持向量机matlab代码讲解之前,我们需要对支持向量机训练和预测的函数库进行下载。以下下载教程:

1、下载地址:https://www.csie.ntu.edu.tw/~cjlin/libsvm/

dd37e6436a3e495b9953f15e643cb55a.png

2、下滑找到所需要软件的函数库进行下载

a237c8cbbf8b4d3e9623430863018955.png

3、用matlab中支持向量机只需要预测库函数和训练库函数。复制加入代码文件即可。

4496bfdabbba478bb70f580565c2fe35.png

2.2 回归代码(内有详细注释)

%%回归模型
%% 清空环境变量
warning all
clear all
close all
clc


%%  导入数值
data = xlsread('excel表格');

%% 随机打乱次序
temp = randperm(length(data));%提高数据之间独立性

%% 区分输入层和输出层,此次转置为了满足归一化的向量类型
input=data(temp(1:length(data)),1:x)';
output=data(temp(1:length(data)),x+1)';

%%  区分训练集和验证集 
L=length(output);
num=round(0.7*L);% 划分比例

input_train=input(:,1:num);
output_train=output(:,1:num);
input_test=input(:,num+1:end);
output_test=output(:,num+1:end);


%%  归一化处理
[inputn,inputps] = mapminmax(input_train,0,1);
[outputn,outputps] = mapminmax(output_train,0,1);

inputn_test = mapminmax('apply',input_test,inputps);
outputn_test = mapminmax('apply',output_test,outputps);

%%  参数长度
inputnum=size(input_train,1);
outputnum=size(output_train,1);
M = size(input_train, 2);
N = size(input_test, 2);

%% 转置为满足支持向量机模型形式
inputn = inputn';
outputn = outputn';
inputn_test = inputn_test';
outputn_test = outputn_test';

%%  构建模型
c=8;%越大代表惩罚力度越大,训练会变慢
g=2;

% 模型构建
net = [ ' -t 2',' -c ',num2str(c),' -g ',num2str(g),' -s 3 -p 0.01'];

%%构建模型超参数选取参考
%        -s  svm类型: SVM设置类型(默认0)
%             0 -- c-svc    % 常见分类
%             1 --nu-svc    % nu上下界限的分类模型
%             2 -one-class-SVM   % 异常值检测的分类模型
%             3 -- epsilon -svR  % 常规的回归模型
%             4 -- nu-sVR   % nu上下界限的回归模型
%        -t  核函数类型:核函数设置类型(默认2)
%             0-线性: u'v
%             1 -多项式:(r*u 'v + coef0)^degree
%             2- RBF函数: exp(-r|u-v|^2)
%             3 -sigmoid: tanh(r*u'v + coef0)
%       -d degree:核函数中的degree设置(针对多项式核函数)(默认3)
%       -g gama:核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k)
%       -r coefe:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认e)
%       -c cost:设置c-svc. epsilon -SVR和v-SVR的参数(损失函数)(默认1)
%       -n nu:设置nu-Svc,one-class-SVM和nu- SVR的参数(默认0.5)
%       -p p:设置epsilon -sVR中损失函数p的值(默认0.1)
%       -m cachesize:设置cache内存大小,以MB为单位(默认4日)
%       -e eps:设置允许的终止判据(默认e.ee1)
%       -h shrinking:是否使用启发式,0或1(默认1)
%       -wi weight:设置第几类的参数c为weight*c(c-svc中的C)(默认1)
%       -v n: n-fold交互检验模式,n为fold的个数,必须大于等于2

%% 模型训练
model = svmtrain(outputn,inputn,net);

%% 模型仿真
[an, error] = svmpredict(outputn_test, inputn_test, model);

%% 反归一化
test_sim = mapminmax('reverse',an,outputps);

%%  评价指标

%  R2
R2 = 1 - norm(output_test -  test_sim')^2 / norm(output_test -  mean(output_test))^2;
disp(['测试集数据的R2为:', num2str(R2)])

%  MAE
MAE= sum(abs(output_test - test_sim' )) ./ N ;
disp(['测试集数据的MAE为:', num2str(MAE)])

%  MSE
MSE=sum((output_test - test_sim').^2) ./ N ;
disp(['测试集数据的MSE为:', num2str(MSE)])

% RMSE
RMSE = sqrt(sum((output_test - test_sim' ).^2) ./ N);
disp(['测试集数据的RMSE为:', num2str(RMSE)])

%  MAPE
MAPE=mean(abs(output_test - test_sim')./output_test) ;
disp(['测试集数据的MAPE为:', num2str(MAPE)])

%%  可视化
figure
plot(output_test,'bo-','linewidth',1.2)
hold on
plot(test_sim','r*-','linewidth',1.2)
legend('真实值','预测值')
xlabel('测试集样本编号')
ylabel('强度/MPA')
xlim([1,N])
title('SVR回归机的测试集真实值和预测值的对比')
set(gca,'fontsize',12)

2.3 分类代码(内有详细注释)

%%分类代码
%% 清空环境变量
warning all
clear all
close all
clc


%%  导入数值
data = xlsread('excel表格');

%% 随机打乱次序
temp = randperm(length(data));%提高数据之间独立性

%% 区分输入层和输出层,此次转置为了满足归一化的向量类型
input=data(temp(1:length(data)),1:x)';
output=data(temp(1:length(data)),x+1)';

%%  区分训练集和验证集 
L=length(output);
num=round(0.7*L);% 划分比例

input_train=input(:,1:num);
output_train=output(:,1:num);
input_test=input(:,num+1:end);
output_test=output(:,num+1:end);


%%  归一化处理
[inputn,inputps] = mapminmax(input_train,0,1);
inputn_test = mapminmax('apply',input_test,inputps);

outputn = output_train;
outputn_test = output_test;

%%  参数长度
inputnum=size(input_train,1);
outputnum=size(output_train,1);
M = size(input_train, 2);
N = size(input_test, 2);

%% 转置为满足支持向量机模型形式
inputn = inputn';
outputn = outputn';
inputn_test = inputn_test';
outputn_test = outputn_test';

%%  构建模型
c=8;%越大代表惩罚力度越大,训练会变慢
g=2;

% 模型构建
net = ['-t 2', '-c', num2str(c), '-g', num2str(g)];

%%构建模型超参数选取参考
%        -s  svm类型: SVM设置类型(默认0)
%             0 -- c-svc    % 常见分类
%             1 --nu-svc    % nu上下界限的分类模型
%             2 -one-class-SVM   % 异常值检测的分类模型
%             3 -- epsilon -svR  % 常规的回归模型
%             4 -- nu-sVR   % nu上下界限的回归模型
%        -t  核函数类型:核函数设置类型(默认2)
%             0-线性: u'v
%             1 -多项式:(r*u 'v + coef0)^degree
%             2- RBF函数: exp(-r|u-v|^2)
%             3 -sigmoid: tanh(r*u'v + coef0)
%       -d degree:核函数中的degree设置(针对多项式核函数)(默认3)
%       -g gama:核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k)
%       -r coefe:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认e)
%       -c cost:设置c-svc. epsilon -SVR和v-SVR的参数(损失函数)(默认1)
%       -n nu:设置nu-Svc,one-class-SVM和nu- SVR的参数(默认0.5)
%       -p p:设置epsilon -sVR中损失函数p的值(默认0.1)
%       -m cachesize:设置cache内存大小,以MB为单位(默认4日)
%       -e eps:设置允许的终止判据(默认e.ee1)
%       -h shrinking:是否使用启发式,0或1(默认1)
%       -wi weight:设置第几类的参数c为weight*c(c-svc中的C)(默认1)
%       -v n: n-fold交互检验模式,n为fold的个数,必须大于等于2

%% 模型训练
model = svmtrain(outputn, inputn, net);

%% 模型仿真
[test_sim, error0] = svmpredict(outputn_test, inputn_test, model);

% 性能评价 
error = sum((test_sim == outputn_test )) / N * 100;%也可表达error = error0(1);

%%  数据排序
[outputn_test , index] = sort(outputn_test );

test_sim = test_sim(index);

%%  绘图
figure
plot(1: N, outputn_test, 'r-*', 1: N, test_sim, 'b-o', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比'; ['准确率=' num2str(error) '%']};
title(string)
grid

%%  混淆矩阵   
figure
cm = confusionchart(outputn_test, test_sim);
cm.Title = 'Confusion Matrix for Test Data';
cm.ColumnSummary = 'column-normalized';
cm.RowSummary = 'row-normalized';

%%  ROC曲线
[x, y, ~, AUC] = perfcurve(outputn_test, test_sim,2);

figure
plot(x ,y,'r-*', 'LineWidth', 1.5)
hold on 
xlabel('假阳性率')
ylabel('真阳性率')
title('ROC曲线')
string = {['AUC=' num2str(AUC)]};
legend(string,'FontSize',12)

3  视频讲解

b站搜索:' 不想学习的陈成 ' 

 

 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值