【Matlab智能算法】PSO优化(单隐层)BP神经网络算法

news2024/11/26 23:27:51

上一篇博客介绍了BP-GA:BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值,本篇博客将介绍用PSO(粒子群优化算法)优化BP神经网络。

1.优化思路

BP神经网络的隐藏节点通常由重复的前向传递和反向传播的方式来决定,通过修改或构造训练方式改隐藏的节点数,相应的初始权重和阈值也会随之变化,从而影响网络的收敛和学习效率。为了减少权重和阈值对模型的影响,采用粒子群算法对BP神经网络模型的权重和阈值进行优化,从而加快网络的收敛速度和提高网络的学习效率。

优化的重点在于如何构造关于模型权重和阈值的目标函数。将PSO(粒子群优化算法)的适应度函数设为预测效果和测试输出的误差绝对值,通过BP神经网络训练得到不同权重和阈值对应的适应度,当寻找的权重和阈值使得适应度最小,即误差最小时,则为最优权值和阈值,再将最优值返回用于构建BP神经网络。

2.测试函数

y = x 1 2 + x 2 2 y = x_1^2+x_2^2 y=x12+x22
要求:拟合未知模型(预测)。
条件:已知模型的一些输入输出数据。

已知一些输入输出数据(用rand函数生成输入,然后代入表达式生成输出):

for i=1:4000
    input(i,:)=10*rand(1,2)-5;
    output(i)=input(i,1)^2+input(i,2)^2;
end

3.完整代码

data.m

for i=1:4000
    input(i,:)=10*rand(1,2)-5;
    output(i)=input(i,1)^2+input(i,2)^2;
end
output=output';

save data input output

PSO_BP_fun.m

function error = PSO_BP_fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)

%提取
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

%网络进化参数
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
 
%网络权值赋值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;

%网络训练
net=train(net,inputn,outputn);

an=sim(net,inputn);

error=sum(abs(an-outputn));

PSO_BP.m

%% 清空环境
clc
tic

%读取数据
load data input output

%节点个数
inputnum=2;
hiddennum=4;
outputnum=1;
opnum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
% 需要优化的参数个数

%% 训练数据预测数据提取及归一化
%从1到4000间随机排序
k=rand(1,4000);
[m,n]=sort(k);

%划分训练数据和预测数据
input_train=input(n(1:3900),:)';
output_train=output(n(1:3900),:)';
input_test=input(n(3901:4000),:)';
output_test=output(n(3901:4000),:)';

[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);

%构建网络
net=newff(inputn,outputn,hiddennum);

% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;

maxgen=100;   % 进化次数  
sizepop=30;   %种群规模

%个体和速度最大最小值
Vmax=1;
Vmin=-1;
popmax=5;
popmin=-5;

for i=1:sizepop
    pop(i,:)=5*rands(1,opnum);
    V(i,:)=rands(1,opnum);
    fitness(i)=PSO_BP_fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
end

% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:);   %全局最佳
gbest=pop;    %个体最佳
fitnessgbest=fitness;   %个体最佳适应度值
fitnesszbest=bestfitness;   %全局最佳适应度值

%% 迭代寻优
for i=1:maxgen
    i;
    
    for j=1:sizepop
        
        %速度更新
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
        V(j,find(V(j,:)>Vmax))=Vmax;
        V(j,find(V(j,:)<Vmin))=Vmin;
        
        %种群更新
        pop(j,:)=pop(j,:)+0.2*V(j,:);
        pop(j,find(pop(j,:)>popmax))=popmax;
        pop(j,find(pop(j,:)<popmin))=popmin;
        
        %自适应变异
        pos=unidrnd(opnum);
        if rand>0.95
            pop(j,pos)=5*rands(1,1);
        end
      
        %适应度值
        fitness(j)=PSO_BP_fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
    end
    
    for j=1:sizepop
    %个体最优更新
    if fitness(j) < fitnessgbest(j)
        gbest(j,:) = pop(j,:);
        fitnessgbest(j) = fitness(j);
    end
    
    %群体最优更新 
    if fitness(j) < fitnesszbest
        zbest = pop(j,:);
        fitnesszbest = fitness(j);
    end
    
    end
    
    yy(i)=fitnesszbest;    
        
end

%% PSO结果分析
plot(yy)
title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');

x=zbest;

%% 把最优初始阈值权值赋予网络预测
% %用PSO优化的BP网络进行值预测
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;

%% PSO-BP网络训练
%网络进化参数
net.trainParam.epochs=120;
net.trainParam.lr=0.005;
net.trainParam.goal=4e-8;

%网络训练
[net,per2]=train(net,inputn,outputn);

%% PSO-BP网络预测
%数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
inputn_train=mapminmax('apply',input_train,inputps);
an=sim(net,inputn_test);
an1=sim(net,inputn_train);
test_PSOBP=mapminmax('reverse',an,outputps);
train_PSOBP=mapminmax('reverse',an1,outputps);

%% PSO-BP误差
error_PSOBP=test_PSOBP-output_test;
disp('PSO-BP results:');
errorsum_PSOBP=sum(abs(error_PSOBP))

figure(1);
plot(test_PSOBP,':og');
hold on
plot(output_test,'-*');
legend('Predictive output','Expected output','fontsize',10.8);
title('PSO-BP network output','fontsize',12);
xlabel("samples",'fontsize',12);

figure(2);
plot(error_PSOBP,'-*');
title('PSO-BP Neural network prediction error');
xlabel("samples",'fontsize',12);

figure(3);
plot(100*(output_test-test_PSOBP)./output_test,'-*');
title('PSO-BP Neural network prediction error percentage (%)');
xlabel("samples",'fontsize',12);

figure(4);
plot(100*(output_train-train_PSOBP)./output_train,'-*');
title('PSO-BP Neural network training error percentage (%)');
xlabel("samples",'fontsize',12);

toc

4.运行效果

hiddennum = 4:

输出:

PSO-BP results:

errorsum_PSOBP =

    1.2443

历时 109.578562 秒。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

hiddennum = 5:

输出:

PSO-BP results:

errorsum_PSOBP =

    0.3804

历时 303.508080 秒。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/867429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(统计学习方法|李航)第四章 朴素贝叶斯算法——贝叶斯估计

贝叶斯估计方法&#xff1a; 计算男女时只有两个值&#xff0c;所以K2 贝叶斯估计就是拉普拉斯平滑 估计方法&#xff1a;为什么叫做贝叶斯估计呢&#xff1f; 例题&#xff1a; 重新回顾以下朴素贝叶斯&#xff1a; 对他求导&#xff0c;求出最大值 得到了色i他的估计值&…

第三章:前端UI框架介绍

文章目录 一、Bootstrap1.1 Bootstrap简介及版本1.2 Bootstrap使用 二、AntDesign2.1 简介2.2 基本使用2.3 antd pro 三、ElementUI3.1 简介3.2 基本使用 四、Vant4.1 简介4.2 基本使用 一、Bootstrap 1.1 Bootstrap简介及版本 1、 简介 Bootstrap&#xff0c;来白 Twitter&a…

服务管理和计划任务

文章目录 服务管理计划任务 服务管理 systemctl 命令字 服务名 //配置服务与systemctl有关的命令字&#xff1a; 计划任务 一次性计划 at 时间 at now 5 min //当前时间五分钟后执行 at -l //列出计划任务 atrm 任务号 //删除计划任务执行完命令后Ctrld生效 周期性计…

LiveNVR监控流媒体Onvif/RTSP功能-视频流水印如何叠加视频水印叠加动态图片叠加视频流时间示例

LiveNVR视频流水印如何叠加视频水印叠加动态图片叠加视频流时间示例 1、介绍2、摄像头OSD设置水印3、前端页面叠加4、视频流水印4.1、图片水印示例4.2、时间戳水印示例 5、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、介绍 监控视频平台播放视频监控的时候&#xff0c;除了满足正…

提升效率!云原生生态从业人员不可或缺的工具集合!

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

shell脚本安装nginx

文章目录 shell脚本原理变量脚本安装nginx shell脚本原理 以删除桌面文件的脚本为例&#xff0c;执行脚本后&#xff0c;shell脚本将代码给内核&#xff0c;内核读取后执行命令&#xff0c;如果shell脚本也在桌面上&#xff0c;执行后这个脚本文件也会被删除。 变量 echo $SH…

Java程序控制结构,一文带你彻底拿下~

—— 程序的运行流程控制会解决程序是如何执行的 三大程序流程控制结构 1&#xff09;顺序结构&#xff1a;程序从上到下逐行逐行的执行&#xff0c;中间没有任何的判断和跳转 2&#xff09;分支结构&#xff1a;程序具有选择性的进入某一段代码 3&#xff09;循环结构&#xf…

SQL Developer中的Data Redaction

SQL Developer中的Data Redaction用起来比命令行方便多了。可以选定表或视图&#xff0c;右键点击“遮盖保护”菜单。 但赋权方面有需要注意的地方。 假设Redact Admin是SYS&#xff0c;Redact User是HR。虽然SYS具备所有权限&#xff0c;但还是报以下错误。其实这个错误是针…

jvm——垃圾回收机制(GC)详解

开始之前有几个GC的基本问题 什么是GC&#xff1f; GC 是 garbage collection 的缩写&#xff0c;意思是垃圾回收——把内存&#xff08;特别是堆内存&#xff09;中不再使用的空间释放掉&#xff1b;清理不再使用的对象。 为什么要GC&#xff1f; 堆内存是各个线程共享的空间…

spring常用注解标签总结

1&#xff1a;Component等 名称Component/Controller/Service/Repository类型类注解位置类定义上方作用设置该类为spring管理的bean属性value&#xff08;默认&#xff09;&#xff1a;定义bean的id 说明: Component注解如果不起名称&#xff0c;会有一个默认值就是当前类名首…

IDEA提示:StringBuffer xxx‘ may be declared as ‘StringBuilde

如图所示&#xff0c;编写代码时遇见了如下IDEA警告&#xff1a; 原因&#xff1a;StringBuilder是线程不安全的&#xff0c;但是其效率高&#xff0c;而StringBuffer则相反&#xff0c;虽然其线程安全&#xff0c;但是效率低下。 由于 StringBuilder 相较于 StringBuffer 有速…

Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】

一、创建一个apicases.xlsx放入到eclipse的resource里面&#xff0c;然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的对应目录下放入features和plugins&#xff0c;重启eclipse就可以看到testNG了 <!--poi excel解析 --><d…

音视频研发分享:关键帧截图+wasm快照--我又做了一件有益于社会的事情

音视频研发分享&#xff1a;关键帧截图wasm快照--我又做了一件有益于社会的事情 简单的一个视频设备快照功能到底有多费事多费电&#xff1f;新的方法有方法&#xff01; 省了多少电&#xff1f; 简单的一个视频设备快照功能到底有多费事多费电&#xff1f; 以前&#xff0c;我…

【C# 基础精讲】构造函数和析构函数

构造函数&#xff08;Constructor&#xff09;和析构函数&#xff08;Destructor&#xff09;是面向对象编程中的两个重要概念&#xff0c;它们分别用于在对象创建和销毁的时候执行特定的操作。这两个函数在C#以及其他面向对象编程语言中都具有重要的作用&#xff0c;用于初始化…

机器学习笔记:李宏毅chatgpt 大模型 大资料

1 大模型 1.1 大模型的顿悟时刻 Emergent Abilities of Large Language Models&#xff0c;Transactions on Machine Learning Research 2022 模型的效果不是随着模型参数量变多而慢慢变好&#xff0c;而是在某一个瞬间&#xff0c;模型“顿悟”了 这边举的一个例子是&#…

剪映:制作特效的常用方法

在创作短视频时&#xff0c;常常需要为一些镜头添加或制作特效&#xff0c;以增加趣味性、提升影片的艺术渲染力。本文介绍几种在剪映专业版中快速添加或制作特效的常用方法。 一、使用特效库 在“特效”库中提供了大量的特效供下载使用。找到自己中意的特效&#xff0c;直接拖…

alphassl便宜通配符SSL证书推荐

AlphaSSL是一家提供SSL证书的CA认证机构&#xff0c;其证书可以保护网站的安全性&#xff0c;防止黑客攻击和信息泄露。AlphaSSL的证书价格实惠&#xff0c;安全性高&#xff0c;AlphaSSL的证书还可以与各种服务器和网站平台兼容&#xff0c;包括Apache、IIS、Tomcat和Nginx等。…

【C# 基础精讲】类和对象的概念

在面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;中&#xff0c;类和对象是两个核心概念&#xff0c;用于描述和实现现实世界中的实体和关系。OOP 是一种编程范式&#xff0c;通过将数据和操作封装为对象来组织和管理代码&#xff0c;使得代…

大模型时代,如何重塑AI人才的培养?知名高校专家为您解答

当下&#xff0c;随着人工智能技术的快速发展&#xff0c;大模型已经成为了人工智能发展的新方向&#xff0c;同时也对新时代AI人才的需求和培养带来了新的思考与挑战&#xff0c;需要结合当下社会对复合型AI人才的需求进行新思考&#xff0c;创新AI人才培养模式&#xff0c;以…

基于frida检测demo来学习frida检测及anti

原文地址:https://www.zhuoyue360.com/crack/108.html 前言 随着逆向的攻防强度不断的提升,目前主流的移动安全厂商的加固服务基本上都已包含了常见Hook框架的反调试,我们最常见的hook工具如下: fridaxposed 为了更好的提升自己相关的经验,我们可以拿这类demo来进行原理的学…