【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期”即可获取下载链接。

相关文章
|
7天前
|
负载均衡 网络协议 网络性能优化
动态IP代理技术详解及网络性能优化
动态IP代理技术通过灵活更换IP地址,广泛应用于数据采集、网络安全测试等领域。本文详细解析其工作原理,涵盖HTTP、SOCKS代理及代理池的实现方法,并提供代码示例。同时探讨配置动态代理IP后如何通过智能调度、负载均衡、优化协议选择等方式提升网络性能,确保高效稳定的网络访问。
52 2
|
13天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
1天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
21天前
|
机器学习/深度学习 算法 PyTorch
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
本文探讨了图神经网络(GNN)与大型语言模型(LLM)结合在知识图谱问答中的应用。研究首先基于G-Retriever构建了探索性模型,然后深入分析了GNN-RAG架构,通过敏感性研究和架构改进,显著提升了模型的推理能力和答案质量。实验结果表明,改进后的模型在多个评估指标上取得了显著提升,特别是在精确率和召回率方面。最后,文章提出了反思机制和教师网络的概念,进一步增强了模型的推理能力。
50 4
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
|
6天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
9天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
12天前
|
编解码 算法 数据安全/隐私保护
基于BP译码的LDPC误码率matlab仿真,分析不同码长,码率,迭代次数以及信道类型对译码性能的影响
本内容介绍基于MATLAB 2022a的低密度奇偶校验码(LDPC)仿真,展示了完整的无水印仿真结果。LDPC是一种逼近香农限的信道编码技术,广泛应用于现代通信系统。BP译码算法通过Tanner图上的消息传递实现高效译码。仿真程序涵盖了不同Eb/N0下的误码率计算,并分析了码长、码率、迭代次数和信道类型对译码性能的影响。核心代码实现了LDPC编码、BPSK调制、高斯信道传输及BP译码过程,最终绘制误码率曲线并保存数据。 字符数:239
56 5
|
19天前
|
域名解析 缓存 网络协议
优化Lua-cURL:减少网络请求延迟的实用方法
优化Lua-cURL:减少网络请求延迟的实用方法
|
18天前
|
数据采集 监控 安全
公司网络监控软件:Zig 语言底层优化保障系统高性能运行
在数字化时代,Zig 语言凭借出色的底层控制能力和高性能特性,为公司网络监控软件的优化提供了有力支持。从数据采集、连接管理到数据分析,Zig 语言确保系统高效稳定运行,精准处理海量网络数据,保障企业信息安全与业务连续性。
39 4
|
3天前
|
传感器 算法
基于GA遗传优化的WSN网络最优节点部署算法matlab仿真
本项目基于遗传算法(GA)优化无线传感器网络(WSN)的节点部署,旨在通过最少的节点数量实现最大覆盖。使用MATLAB2022A进行仿真,展示了不同初始节点数量(15、25、40)下的优化结果。核心程序实现了最佳解获取、节点部署绘制及适应度变化曲线展示。遗传算法通过初始化、选择、交叉和变异步骤,逐步优化节点位置配置,最终达到最优覆盖率。