【MATLAB第59期】基于MATLAB的混沌退火粒子群CSAPSO-BP、SAPSO-BP、PSO-BP优化BP神经网络非线性函数拟合预测/回归预测对比

简介: 不同版本matlab 不同电脑 加上数据集随机,BP权值阈值随机,进化算法种群随机,所以运行结果不一定和我运行的一致。其次, 也会存在CSAPSO 比SAPSO / PSO差的情况。私信回复“59期”即可获取下载链接。获取细则详见主页置顶文章。

【MATLAB第59期】基于MATLAB的混沌退火粒子群CSAPSO-BP、SAPSO-BP、PSO-BP优化BP神经网络非线性函数拟合预测/回归预测对比

注意事项

不同版本matlab 不同电脑 加上数据集随机,BP权值阈值随机,进化算法种群随机,所以运行结果不一定和我运行的一致 。其次, 也会存在CSAPSO 比SAPSO / PSO差的情况。

一、效果展示

2023-07-23_221548.png
2023-07-23_221725.png
2023-07-23_221733.png

二、代码展示

%%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行

%%  导入数据
res = xlsread('数据集.xlsx');

%%  划分训练集和测试集
%temp =1:size(res,1);
temp =randperm(size(res,1));
save temp temp
P_train = res(temp(1: 80), 1: 7)';
T_train = res(temp(1: 80), 8)';
MM = size(P_train, 2);

P_test = res(temp(81: end), 1: 7)';
T_test = res(temp(81: end), 8)';
NN = size(P_test, 2);


%%  数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);

[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);

%节点个数
inputnum=size(p_train,1);       % 输入层神经元个数 
outputnum=size(t_train,1);     % 输出层神经元个数
hiddennum=10;
% 创建网络;
net1 = newff(p_train,t_train,hiddennum);
net2 = newff(p_train,t_train,hiddennum);
net3 = newff(p_train,t_train,hiddennum);
%节点总数 2*5 + 5 + 5 + 1 = 21 
numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;

%% 粒子群算法求权值和阈值
%粒子群算法参数设置
N = 20;
c1 = 2;
c2 = 2;
w = 0.6;
M = 100;
D = numsum;
x = zeros(1,D);

%% 把最优初始阀值权值赋予网络预测
% 用粒子群算法优化的BP网络进行值预测
w1_1=xm1(1:inputnum*hiddennum);
B1_1=xm1(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2_1=xm1(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2_1=xm1(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

net1.iw{
   
   1,1}=reshape(w1_1,hiddennum,inputnum);
net1.lw{
   
   2,1}=reshape(w2_1,outputnum,hiddennum);
net1.b{
   
   1}=reshape(B1_1,hiddennum,1);
net1.b{
   
   2}=reshape(B2_1,outputnum,1);

% % 用模拟退火粒子群算法优化的BP网络进行值预测
w1_2=xm2(1:inputnum*hiddennum);
B1_2=xm2(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2_2=xm2(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2_2=xm2(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

net2.iw{
   
   1,1}=reshape(w1_2,hiddennum,inputnum);
net2.lw{
   
   2,1}=reshape(w2_2,outputnum,hiddennum);
net2.b{
   
   1}=reshape(B1_2,hiddennum,1);
net2.b{
   
   2}=reshape(B2_2,outputnum,1);

% 用混沌模拟退火粒子群算法优化的BP网络进行值预测
w1_3=xm3(1:inputnum*hiddennum);
B1_3=xm3(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2_3=xm3(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2_3=xm3(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

net3.iw{
   
   1,1}=reshape(w1_3,hiddennum,inputnum);
net3.lw{
   
   2,1}=reshape(w2_3,outputnum,hiddennum);
net3.b{
   
   1}=reshape(B1_3,hiddennum,1);
net3.b{
   
   2}=reshape(B2_3,outputnum,1);

%% BP网络训练
%粒子群网络进化参数
net1.trainParam.epochs=100;
net1.trainParam.lr = 0.1;
net1.trainParam.goal=1e-3; % 训练目标误差
% 
%模拟退火粒子群网络进化参数
net2.trainParam.epochs=100;
net2.trainParam.lr=0.1;
net2.trainParam.goal=1e-6;

%混沌模拟退火粒子群网络进化参数
net3.trainParam.epochs=100;
net3.trainParam.lr=0.1;
net3.trainParam.goal=1e-3;

% 训练网络
net1 = train(net1,p_train,t_train); % 粒子群
net2 = train(net2,p_train,t_train); % 模拟退火粒子群
net3 = train(net3,p_train,t_train); % 混沌模拟退火粒子群

%% 仿真测试
%% 训练集
test_sim11 = sim(net1,p_train); % 粒子群
test_sim22 = sim(net2,p_train); % 模拟退火粒子群
test_sim33 = sim(net3,p_train); % 混沌模拟退火粒子群

% 输出数据反归一化,Test_sim为测试数据通过神经网络的预测输出值
Test_sim11 = mapminmax('reverse',test_sim11,ps_output); % 粒子群
Test_sim22 = mapminmax('reverse',test_sim22,ps_output); % 模拟退火粒子群
Test_sim33 = mapminmax('reverse',test_sim33,ps_output); % 混沌模拟退火粒子群
%% 测试集
test_sim1 = sim(net1,p_test); % 粒子群
test_sim2 = sim(net2,p_test); % 模拟退火粒子群
test_sim3 = sim(net3,p_test); % 混沌模拟退火粒子群

% 输出数据反归一化,Test_sim为测试数据通过神经网络的预测输出值
Test_sim1 = mapminmax('reverse',test_sim1,ps_output); % 粒子群
Test_sim2 = mapminmax('reverse',test_sim2,ps_output); % 模拟退火粒子群
Test_sim3 = mapminmax('reverse',test_sim3,ps_output); % 混沌模拟退火粒子群

%% 算法结果分析 
%%  均方根误差
%MM=size(T_train,2);
%NN=size(T_test,2);
error11 = sqrt(sum((Test_sim11 - T_train).^2) ./ MM);
error22 = sqrt(sum((Test_sim22 - T_train).^2) ./ MM);
error33 = sqrt(sum((Test_sim33 - T_train).^2) ./ MM);
error1 = sqrt(sum((Test_sim1 - T_test ).^2) ./ NN);
error2 = sqrt(sum((Test_sim2 - T_test ).^2) ./ NN);
error3 = sqrt(sum((Test_sim3 - T_test ).^2) ./ NN);
%%  查看网络结构
%analyzeNetwork(net)




%%  相关指标计算
%  R2
disp(['PSO-BP训练集数据的RMSE为:', num2str(error11)])
disp(['SAPSO-BP训练集数据的RMSE为:', num2str(error22)])
disp(['CSAPSO-BP训练集数据的RMSE为:', num2str(error33)])
disp(['PSO-BP测试集数据的RMSE为:', num2str(error1)])
disp(['SAPSO-BP测试集数据的RMSE为:', num2str(error2)])
disp(['CSAPSO-BP测试集数据的RMSE为:', num2str(error3)])

R11 = 1 - norm(T_train - Test_sim11)^2 / norm(T_train - mean(T_train))^2;
R22 = 1 - norm(T_train - Test_sim22)^2 / norm(T_train - mean(T_train))^2;
R33 = 1 - norm(T_train - Test_sim33)^2 / norm(T_train - mean(T_train))^2;
R1 = 1 - norm(T_test  - Test_sim1)^2 / norm(T_test  - mean(T_test ))^2;
R2 = 1 - norm(T_test  - Test_sim2)^2 / norm(T_test  - mean(T_test ))^2;
R3 = 1 - norm(T_test  - Test_sim3)^2 / norm(T_test  - mean(T_test ))^2;
disp(['PSO-BP训练集数据的R2为:', num2str(R11)])
disp(['SAPSO-BP训练集数据的R2为:', num2str(R22)])
disp(['CSAPSO-BP训练集数据的R2为:', num2str(R33)])
disp(['PSO-BP测试集数据的R2为:', num2str(R1)])
disp(['SAPSO-BP测试集数据的R2为:', num2str(R2)])
disp(['CSAPSO-BP测试集数据的R2为:', num2str(R3)])

%  MAE
mae11 = sum(abs(Test_sim11 - T_train)) ./ MM ;
mae22 = sum(abs(Test_sim22 - T_train)) ./ MM ;
mae33 = sum(abs(Test_sim33 - T_train)) ./ MM ;
mae1 = sum(abs(Test_sim1 - T_test )) ./ NN ;
mae2 = sum(abs(Test_sim2 - T_test )) ./ NN ;
mae3 = sum(abs(Test_sim3 - T_test )) ./ NN ;

disp(['PSO-BP训练集数据的MAE为:', num2str(mae11)])
disp(['SAPSO-BP训练集数据的MAE为:', num2str(mae22)])
disp(['CSAPSO-BP训练集数据的MAE为:', num2str(mae33)])
disp(['PSO-BP测试集数据的MAE为:', num2str(mae1)])
disp(['SAPSO-BP测试集数据的MAE为:', num2str(mae2)])
disp(['CSAPSO-BP测试集数据的MAE为:', num2str(mae3)])

%  MAPE   mape = mean(abs((YReal - YPred)./YReal));

mape11 = mean(abs((T_train - Test_sim11)./T_train));  
mape22 = mean(abs((T_train - Test_sim22)./T_train)); 
mape33 = mean(abs((T_train - Test_sim33)./T_train)); 
mape1 = mean(abs((T_test - Test_sim1 )./T_test));      
mape2 = mean(abs((T_test - Test_sim2 )./T_test)); 
mape3 = mean(abs((T_test - Test_sim3)./T_test)); 

disp(['PSO-BP训练集数据的MAPE为:', num2str(mape11)])
disp(['SAPSO-BP训练集数据的MAPE为:', num2str(mape22)])
disp(['CSAPSO-BP训练集数据的MAPE为:', num2str(mape33)])
disp(['PSO-BP测试集数据的MAPE为:', num2str(mape1)])
disp(['SAPSO-BP测试集数据的MAPE为:', num2str(mape2)])
disp(['CSAPSO-BP测试集数据的MAPE为:', num2str(mape3)])

save result





figure()
t = 1:M;
plot(t,Pbest1,'b',t,Pbest2,'g',t,Pbest3,'r');
title('算法收敛过程');
xlabel('进化代数');
ylabel('最小均方误差值(MSE值)');
legend('基本粒子群算法','模拟退火粒子群算法','混沌模拟退火粒子群算法');


%%  绘图
%[0.00,0.45,0.74] //蓝
%[0.85,0.33,0.10] //橙红
%[0.93,0.69,0.13] //橙黄
%[0.72,0.27,1]    //淡紫
%[0.47,0.67,0.19] //淡绿
figure()

plot( 1: MM, T_train, 'k-*', 'LineWidth', 1.5)
hold on
plot( 1: MM, Test_sim11, 'Color', [0.93,0.69,0.13],'LineWidth', 1.5)
hold on
plot( 1: MM, Test_sim22, 'Color',[0.85,0.33,0.10], 'LineWidth', 1.5)
hold on
plot( 1: MM, Test_sim33,'Color',[0.00,0.45,0.74], 'LineWidth', 1.5)
legend('真实值', 'PSO-BP预测值', 'SAPSO-BP预测值', 'CSAPSO-BP预测值')
xlabel('训练样本')
ylabel('预测结果')
string = {
   
   '训练集预测结果对比'};
title(string)
xlim([1, MM])
grid

figure()
plot( 1: NN, T_test, 'k-*', 'LineWidth', 1.5)
hold on
plot( 1: NN, Test_sim1, 'Color', [0.93,0.69,0.13],'LineWidth', 1.5)
hold on
plot( 1: NN, Test_sim2, 'Color',[0.85,0.33,0.10], 'LineWidth', 1.5)
hold on
plot( 1: NN, Test_sim3,'Color',[0.00,0.45,0.74], 'LineWidth', 1.5)
legend('真实值', 'PSO-BP预测值', 'SAPSO-BP预测值', 'CSAPSO-BP预测值')
xlabel('测试样本')
ylabel('预测结果')
string = {
   
   '测试集预测结果对比'};
title(string)
xlim([1, NN])
grid

save result

三、代码获取

获取细则详见主页置顶文章。

私信回复“59期”即可获取下载链接。

相关文章
|
2天前
|
机器学习/深度学习 算法 PyTorch
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
本文探讨了图神经网络(GNN)与大型语言模型(LLM)结合在知识图谱问答中的应用。研究首先基于G-Retriever构建了探索性模型,然后深入分析了GNN-RAG架构,通过敏感性研究和架构改进,显著提升了模型的推理能力和答案质量。实验结果表明,改进后的模型在多个评估指标上取得了显著提升,特别是在精确率和召回率方面。最后,文章提出了反思机制和教师网络的概念,进一步增强了模型的推理能力。
16 4
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
|
18天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
8天前
|
机器学习/深度学习 算法 Python
基于BP神经网络的金融序列预测matlab仿真
本项目基于BP神经网络实现金融序列预测,使用MATLAB2022A版本进行开发与测试。通过构建多层前馈神经网络模型,利用历史金融数据训练模型,实现对未来金融时间序列如股票价格、汇率等的预测,并展示了预测误差及训练曲线。
|
21天前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
44 8
|
25天前
|
机器学习/深度学习 算法 关系型数据库
基于PSO-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目展示了利用粒子群优化(PSO)算法优化支持向量机(SVM)参数的过程,提高了分类准确性和泛化能力。包括无水印的算法运行效果预览、Matlab2022a环境下的实现、核心代码及详细注释、操作视频,以及对PSO和SVM理论的概述。PSO-SVM结合了PSO的全局搜索能力和SVM的分类优势,特别适用于复杂数据集的分类任务,如乳腺癌诊断等。
|
4月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
215 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
4月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
139 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
4月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
105 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
7月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)