【预测模型】基于粒子群算法改进SVM实现期贷预测代码

1 简介

支持向量机 (Support Vector Machines, SVM) 是一种应用广泛的机器学习方法, 具有理论知识清晰完备,适应性和泛化能力良好的优点, 核心思想是在特征空间中寻找到一个最优超平面将两类样本尽可能大的分开, 能够较好的处理小样本、非线性和克服“维数灾难”问题, 并且表现出优秀的分类能力和泛化能力而被广泛应用于分类和回归等领域. 但是 SVM 对核函数的参数选取对分类效果影响很大, 不合适的参数可能使得分类器性能大大降低. 针对 SVM 核参数的选取问题, 目前尚没有统一有效的方法. 传统的参数选择方法如实验法、网格搜索法等由于耗时过长和不必要的验证流程等缺点, 更常用的方法是群智能算法如蚁群算法、遗传算法和粒子群算法等优化支持向量机核参数.粒子群算法由于算法结构简单、寻优能力相对较好, 近年来选择粒子群算法优化 SVM 参数成为研究热点之一.。

【预测模型】基于粒子群算法改进SVM实现期贷预测代码_第1张图片

【预测模型】基于粒子群算法改进SVM实现期贷预测代码_第2张图片

【预测模型】基于粒子群算法改进SVM实现期贷预测代码_第3张图片

【预测模型】基于粒子群算法改进SVM实现期贷预测代码_第4张图片

2 部分代码

% 支持向量机用于收盘价预测,首先是未优化的,其次是优化后的
%% 清空环境
tic;clc;clear;close all;format compact
%% 加载数据
data=xlsread('EUA五分钟.xlsx','G2:G30763'); save data data
load data
% 归一化
[a,inputns]=mapminmax(data',0,1);%归一化函数要求输入为行向量
data_trans=data_process(5,a);%% 对时间序列预测建立滚动序列,即用1到m个数据预测第m+1个数据,然后用2到m+1个数据预测第m+2个数据
input=data_trans(:,1:end-1);
output=data_trans(:,end);
%% 数据集 前75%训练 后25%预测
m=round(size(data_trans,1)*0.75);
Pn_train=input(1:m,:);
Tn_train=output(1:m,:);
Pn_test=input(m+1:end,:);
Tn_test=output(m+1:end,:);

%% 1.没有优化的SVM
bestc=0.001;bestg=10;%c和g随机赋值 表示没有优化的SVM
t=0;%t=0为线性核函数,1-多项式。2rbf核函数
cmd = ['-s 3 -t ',num2str(t),' -c ', num2str(bestc),' -g ',num2str(bestg),' -p 0.01 -d 1'];  
   
model = svmtrain(Tn_train,Pn_train,cmd);%训练
[predict,~]= svmpredict(Tn_test,Pn_test,model);%测试
% 反归一化,为后面的结果计算做准备
predict0=mapminmax('reverse',predict',inputns);%测试实际输出反归一化
T_test=mapminmax('reverse',Tn_test',inputns);%测试集期望输出反归一化
T_train=mapminmax('reverse',Tn_train',inputns);%训练集期望输出反归一化

figure
plot(predict0,'r-')
hold on;grid on
plot(T_test,'b-')
xlabel('样本编号')
ylabel('收盘价/元')
if t==0
   title('线性核SVM预测')
elseif t==1
   title('多项式核SVM预测')
else
   title('RBF核SVM预测')
end
legend('实际输出','期望输出')
figure
error_svm=abs(predict0-T_test)./T_test*100;%测试集每个样本的相对误差
plot(error_svm,'r-*')
xlabel('样本编号')
ylabel('收盘价相对误差/%')
if t==0
   title('线性核SVM预测的误差')
elseif t==1
   title('多项式核SVM预测的误差')
else
   title('RBF核SVM预测的误差')
end
grid on
img =gcf;  %获取当前画图的句柄
print(img, '-dpng', '-r600', './img6.png') 
figure
error_svm=abs(predict0-T_test)./T_test*100;%测试集每个样本的相对误差
plot(error_svm,'r-*')
xlabel('样本编号')
ylabel('收盘价相对误差/%')
if t==0
   title('线性核SVM预测的误差')
elseif t==1
   title('多项式核SVM预测的误差')
else
   title('RBF核SVM预测的误差')
end
grid on
img =gcf;  %获取当前画图的句柄
print(img, '-dpng', '-r600', './img5.png')   
figure
error_svm=abs(predict0-T_test)./T_test*100;%测试集每个样本的相对误差
plot(error_svm,'r-*')
xlabel('样本编号')
ylabel('收盘价相对误差/%')
if t==0
   title('线性核SVM预测的误差')
elseif t==1
   title('多项式核SVM预测的误差')
else
   title('RBF核SVM预测的误差')
end
grid on
img =gcf;  %获取当前画图的句柄
print(img, '-dpng', '-r600', './img4.png')           %即可得到对应格式和期望dpi的图像
figure
error_svm=abs(predict0-T_test)./T_test*100;%测试集每个样本的相对误差
plot(error_svm,'r-*')
xlabel('样本编号')
ylabel('收盘价相对误差/%')
if t==0
   title('线性核SVM预测的误差')
elseif t==1
   title('多项式核SVM预测的误差')
else
   title('RBF核SVM预测的误差')
end
grid on
img =gcf;  %获取当前画图的句柄
print(img, '-dpng', '-r600', './img.png')         %即可得到对应格式和期望dpi的图像
% figure 
% plot(log10(pso_trace(:,1)),'b-')
% hold on
% plot(log10(ga_trace(:,1)),'r-')
% plot(log10(de_trace(:,1)),'g-')
% 
% plot(log10(abc_trace(:,1)),'k-')
% plot(log10(deabc_trace(:,1)),'m-')
% 
% legend('PSO','GA','DE','ABC','DEABC')
% xlabel('迭代数')
% ylabel('适应度值/log10(函数值)')
% img =gcf; %获取当前画图的句柄
% print(img, '-dpng', '-r600', './img1.png')         %即可得到对应格式和期望dpi的图像

%% 2.设计PSO优化SVM,用于选择最佳的C和G
pso_option = struct('c1',1,'c2',1,'maxgen',20,'sizepop',5,'k',0.6,'wV',0.9,'wP',0.9, ...
   'popcmax',10^1,'popcmin',10^(-3),'popgmax',10^1,'popgmin',10^(-3),'popkernel',t);%参数的解释在psoSVMcgForRegress里面

[bestmse,bestc,bestg,trace] = psoSVMcgForRegress(Tn_train,Pn_train,Tn_test,Pn_test,pso_option);

% figure;
% plot(trace,'r-');
% xlabel('进化代数');
% ylabel('适应度值(均方差)');
% title('适应度曲线')
% grid on;

% 利用PSO优化得到的最优参数进行SVM 重新训练
cmd = ['-s 3 -t ',num2str(t)',' -c ', num2str(bestc), ' -g ', num2str(bestg),' -p 0.01 -d 1'];
model = svmtrain(Tn_train,Pn_train,cmd);%训练
[predict_train,~]= svmpredict(Tn_train,Pn_train,model);%训练集
[predict,fit]= svmpredict(Tn_test,Pn_test,model);%测试集
% 反归一化
predict_tr=mapminmax('reverse',predict_train',inputns);%训练集实际输出反归一化
predict1=mapminmax('reverse',predict',inputns);%测试集输出反归一化

figure
plot(predict1,'r-')
hold on;grid on
plot(T_test,'b-')
xlabel('测试集样本编号')
ylabel('收盘价/元')
if t==0
   title('PSO-线性核SVM预测')
elseif t==1
   title('PSO-多项式核SVM预测')
else
   title('PSO-RBF核SVM预测')
end
legend('实际输出','期望输出')
img =gcf;  %获取当前画图的句柄
print(img, '-dpng', '-r600', './img1.png')         %即可得到对应格式和期望dpi的图像
% figure 
% plot(log10(pso_trace(:,1)),'b-')
% hold on
% plot(log10(ga_trace(:,1)),'r-')
% plot(log10(de_trace(:,1)),'g-')
% 
% plot(log10(abc_trace(:,1)),'k-')
% plot(log10(deabc_trace(:,1)),'m-')
% 
% legend('PSO','GA','DE','ABC','DEABC')
% xlabel('迭代数')
% ylabel('适应度值/log10(函数值)')
% img =gcf; %获取当前画图的句柄
% print(img, '-dpng', '-r600', './img3.png')         %即可得到对应格式和期望dpi的图像

figure
error_pso_svm=abs(predict1-T_test)./T_test*100;%测试集每个样本的相对误差
plot(error_pso_svm,'r-*')
xlabel('测试集样本编号')
ylabel('收盘价相对误差/%')
if t==0
   title('PSO-线性核SVM预测的误差')
elseif t==1
   title('PSO-多项式核SVM预测的误差')
else
   title('PSO-RBF核SVM预测的误差')
end
grid on
img =gcf;  %获取当前画图的句柄
print(img, '-dpng', '-r600', './img2.png')         %即可得到对应格式和期望dpi的图像
% figure 
% plot(log10(pso_trace(:,1)),'b-')
% hold on
% plot(log10(ga_trace(:,1)),'r-')
% plot(log10(de_trace(:,1)),'g-')
% 
% plot(log10(abc_trace(:,1)),'k-')
% plot(log10(deabc_trace(:,1)),'m-')
% 
% legend('PSO','GA','DE','ABC','DEABC')
% xlabel('迭代数')
% ylabel('适应度值/log10(函数值)')
% img =gcf; %获取当前画图的句柄
% print(img, '-dpng', '-r600', './img4.png')         %即可得到对应格式和期望dpi的图像
% %% 结果分析

disp('最优惩罚参数与核参数为:')
bestc
bestg



disp('优化前的均方误差')
mse_svm=mse(predict0-T_test)
disp('优化前的平均相对误差')
mre_svm=sum(abs(predict0-T_test)./T_test)/length(T_test)
disp('优化前的平均绝对误差')
abs_svm=mean(abs(predict0-T_test))
disp('优化前的归一化均方误差')
a=sum((predict0-T_test).^2)/length(T_test);
b=sum((predict0-mean(predict0)).^2)/(length(T_test)-1);
one_svm=a/b

disp('优化后的训练集均方根误差')
rmse_svm0=sqrt(mse(predict_tr-T_train))
disp('优化后的测试集均方根误差')
rmse_svm=sqrt(mse(predict1-T_test))
disp('优化后的均方误差')
mse_pso_svm=mse(predict1-T_test)
disp('优化后的平均相对误差')
mre_pso_svm=sum(abs(predict1-T_test)./T_test)/length(T_test)
disp('优化后的平均绝对误差')
abs_pso_svm=mean(abs(predict1-T_test))
disp('优化后的归一化均方误差')
a1=sum((predict1-T_test).^2)/length(T_test);
b1=sum((predict1-mean(predict1)).^2)/(length(T_test)-1);
one_pso_svm=a1/b1


toc %结束计时

3 仿真结果

【预测模型】基于粒子群算法改进SVM实现期贷预测代码_第5张图片

【预测模型】基于粒子群算法改进SVM实现期贷预测代码_第6张图片

4 参考文献

[1]康操, and 刘洋. "基于改进的PSO算法LS—SVM模型的短期电力负荷预测模型的研究." 经济技术协作信息 12(2015):1.

 

你可能感兴趣的:(预测模型,支持向量机,算法,机器学习)