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/
2、下滑找到所需要软件的函数库进行下载
3、用matlab中支持向量机只需要预测库函数和训练库函数。复制加入代码文件即可。
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站搜索:' 不想学习的陈成 '