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

上一篇博客介绍了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:4000input(i,:)=10*rand(1,2)-5;output(i)=input(i,1)^2+input(i,2)^2;
end

3.完整代码

data.m

for i=1:4000input(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:sizepoppop(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:maxgeni;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.95pop(j,pos)=5*rands(1,1);end%适应度值fitness(j)=PSO_BP_fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);endfor j=1:sizepop%个体最优更新if fitness(j) < fitnessgbest(j)gbest(j,:) = pop(j,:);fitnessgbest(j) = fitness(j);end%群体最优更新 if fitness(j) < fitnesszbestzbest = pop(j,:);fitnesszbest = fitness(j);endendyy(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://xiahunao.cn/news/1383273.html

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

相关文章

无情被裁的后续来了

关注、星标公众号&#xff0c;直达精彩内容 来源&#xff1a;技术让梦想更伟大作者&#xff1a;不生气 大家好&#xff0c;给大家分享一个案例&#xff0c;收集好证据&#xff0c;劳动仲裁吧 &#xff0c;裁员时候老板打感情牌&#xff0c;员工呢坚持付出就得回报按照程序来。…

java教程配置通达信,通达信公式转换JAVA,通达信20个经典公式

内容导航&#xff1a; Q1&#xff1a;用Excel公式实现文本转Java输出文本的问题 public class Excel { private jxl.Workbook rwb null; /** * 得到当前工作薄的总列数 * * parma sheetIndex 工作薄号 * return int */ public int getColCount(int sheetIndex) { int colCnt …

通达信接口官网-TcApi的工作机制

通达信接口官网-TcApi的工作机制&#xff0c;小编总结了以下几点&#xff1a; 1、初始化&#xff0c;创建通达信实例&#xff1b; 2、和驻留进程的通讯。 以上就是关于通达信接口官网-TcApi的工作机制的介绍。 下面&#xff0c;给大家分享一下&#xff0c;关于通达信接口官…

腾讯云服务器轻量和CVM有什么区别?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

Cmder:从此告别记事本记命令的日子

前言 平时开发中遇到这样那样的命令需要记下来&#xff0c;一般做法是这样。 新建记事本将需要记下的关键命令保存。每次需要使用时&#xff0c;粘贴复制即可。 好像没什么毛病&#xff01;直到遇到了 Cmder。。。 当看到同事分析问题时在 Cmder 里命令快捷键刷刷一顿操作&…

Lombok的使用及注解含义

文章目录 一、简介二、如何使用2.1、在IDEA中安装Lombok插件2.2、添加maven依赖 三、常用注解3.1、Getter / Setter3.2、ToString3.3、NoArgsConstructor / AllArgsConstructor3.4、EqualsAndHashCode3.5、Data3.6、Value3.7、Accessors3.7.1、Accessors(chain true)3.7.2、Ac…

PHP证券交易员学习网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP证券交易员学习网站 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址https://download.csdn.net/download/qq_41221322/88205549 PHP证券交易员…

Similarities:精准相似度计算与语义匹配搜索工具包,多维度实现多种算法,覆盖文本、图像等领域,支持文搜、图搜文、图搜图匹配搜索

Similarities&#xff1a;精准相似度计算与语义匹配搜索工具包&#xff0c;多维度实现多种算法&#xff0c;覆盖文本、图像等领域&#xff0c;支持文搜、图搜文、图搜图匹配搜索 Similarities 相似度计算、语义匹配搜索工具包&#xff0c;实现了多种相似度计算、匹配搜索算法&…

JAVA面向对象基础 对象 类 方法学习笔记

面向对象基础 类 构造 对象 使用对象 对象.方法&#xff08;&#xff09; 类&#xff1a;[访问控制符] class 类名{ } 属性&#xff1a;[访问控制符] 数据类型 变量名; 方法&#xff1a;[访问控制符] void|返回值类型 方法名; 类名 对象new 类名(); 练习景区门…

【C++杂货铺】初识类和对象

文章目录 前言一、类的引入二、类的定义三、类的访问限定符及封装四、类的作用域五、类的实例化六、类对象模型七、this指针 前言 &#x1f4d6;面向过程 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。以…

[XJTUSE]面向对象考试复习指南

文章目录 面向对象考试复习指南1、语言基础(1) Java语言的历史和Java程序的执行机制1&#xff09;Java成员2&#xff09;Java历史3&#xff09;JDK、JRE、JVM、API、GC4&#xff09;Java程序执行机制 (2) 标识符与保留字1&#xff09;标识符2&#xff09;保留字 (3) 初始化1&am…

Python面向对象:闭包

闭包 一、定义类二、创建和调用对象成员三、使用属性1、添加新属性2、获取属性值3、修改新属性4、删除属性5、判断属性是否存在或者属性是否有值6、查看对象或类的所有属性和方法 四、定义和调用方法五、self六、编程练习 一、定义类 Python中的数据类型都是类&#xff0c;类是…

CH3-面向对象上 (4个案例实现)

【案例3-1】基于控制台的购书系统 【案例介绍】 案例描述 ​ 伴随互联网的蓬勃发展&#xff0c;网络购书系统作为电子商务的一种形式&#xff0c;正以其高效、低成本的优势逐步成为新兴的经营模式&#xff0c;人们已经不再满足互联网的用途仅仅局限于信息的浏览和发布&#…

Java面向对象程序设计(OOP)

1、面向对象程序设计(OOP) 1.1、面向过程&面向对象 面向过程编程&#xff08;Procedure Oriented Programming&#xff0c;POP&#xff09; 步骤清晰简单&#xff0c;第一步做什么&#xff0c;第二步做什么…&#xff08;线性思维&#xff09;是以功能&#xff08;函数&a…

C++面向对象程序设计之字符串类的相关操作

C面向对象程序设计之字符串类的相关操作 1.实验任务与要求&#xff1a; 1&#xff09;编写一个表示字符串的类String。 2&#xff09;改写默认构造函数&#xff0c;生成一个空串&#xff0c;&#xff08;不分配内存&#xff09;。 3&#xff09;添加一个带参数的构造函数&…

CH4-面向对象下 (8个案例实现)

【案例4-1】打印不同的图形 【案例介绍】 1. 案例描述 ​ 本案例要求编写一个程序&#xff0c;可以根据用户要求在控制台打印出不同的图形。例如&#xff0c;用户自定义半径的圆形和用户自定义边长的正方形。 2. 运行结果 【案例目标】 学会“抽象类实现不同图形的打印程序…

22、Java面向对象——String类

目录 课前先导 一、String类 1、string类 2、字符串的特点 3、String类中的构造方法 4、String类对象的特点 5、字符串的比较 6、获取字符串中的字符 7、获取字符串的长度 二、字符串对象的练习 1、遍历字符串 2、统计字符串中的字符 3、拼接字符串 4、字符串反…

Java实验四 深入面向对象

实验四 深入面向对象 一、实验目的与要求 1、深刻理解面向对象的三大特征&#xff1b; 2、熟练掌握关键super、final的含义及用法&#xff1b; 3、理解什么是抽象类、抽象方法&#xff0c;以及两者间的关系&#xff1b; 4、深刻理解接口的概念、作用&#xff0c;以及与抽…

java面向对象编程实例讲解_Java面向对象编程实例详解

Java是一种面向对象的语言&#xff0c;是实现面向对象编程的强大工具。但如何在编程中实际运用并发挥其最大效能呢&#xff1f;本文通过一个实际Java程序的开发过程&#xff0c;详细说明了如何使用面向对象实现Java编程。 我们要实现的Java应用程序是&#xff1a;当用户输入一个…

高端百度地图开发2:自定义水滴头像(鼠标事件、API封装对接)

高端百度地图开发系列 高端百度地图开发1&#xff1a;自定义水滴头像&#xff08;自定义标注覆盖物、Overlay覆盖类&#xff09; 自定义水滴头像之鼠标事件、API封装对接 高端百度地图开发系列一、添加自定义覆盖物的方法二、对接API数据1.获取API数据(模拟)2.遍历数据3.添加自…