使用遗传算法优化BP神经网络实现非线性函数拟合

        大家好,我是带我去滑雪!

        非线性函数拟合是一种用于找到与给定数据点集合最好匹配的非线性函数的过程。非线性函数拟合通常用于以下情况:

  • 数据趋势不是线性的:当数据点之间的关系不能用线性方程来表示时,需要使用非线性函数来更好地拟合数据。
  • 复杂的数据模式:当数据包含复杂的非线性模式或曲线时,非线性函数拟合可以提供更准确的拟合结果。
  • 物理、生物、经济或其他领域的实验数据:许多自然现象和实验数据无法用简单的线性模型来解释,因此需要使用非线性模型。

        下面使用遗传算法优化的BP神经网络实现非线性函数拟合: 

目录

一、预备知识 

(1)什么是遗传算法

(2)拟合函数

二、模型建立

(1)遗传算法优化BP神经网络算法流程

(2)适应度函数

(3)选择操作

 (4)交叉

(5) 变异

(6) 遗传算法主函数

(7) 将遗传算法的到的最优个体赋值进BP神经网络

 (8)结果分析


一、预备知识 

(1)什么是遗传算法

        遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。

  • 选择操作:从旧群体中以一定的概率选择个体到新群体中,个体被选中的概率跟适应度值有关,个体适应度值越好,被选择的概率越大。 
  • 交叉操作:从个体中选择两个个体,通过染色体的交换组合,来产生新的优秀个体。交叉过程为从群体中任选两个染色体,随机选择一点或多点染色体位置进行交换。
  • 变异操作:从群体中选择一个个体,选择染色体中的一点进行变异以产生更优秀的个体。

       运行参数主要包括群体大小、遗传代数、交叉概率、变异概率 。

(2)拟合函数

      本次需要拟合的非线性函数为:

y=x_{1}^{2}+x_{2}^{2}

clc,clear,close all
x=-6:0.1:6;
[X,Y]=meshgrid(x);
Z=X.^2+Y.^2;
mesh(X,Y,Z)

   绘制函数图像为:

二、模型建立

(1)遗传算法优化BP神经网络算法流程

         流程分为:BP神经网络结构确定、遗传算法优化、BP神经网络预测。由于拟合函数中有两个输入参数,1个输出参数,所以设置BP神经网络结构为2-5-1,即输入层节点为2,隐含层节点为5,输出层节点为1,总共有2x5+5x1=15个权重,5+1=6个阈值,使用遗传算法个体的编码长度为15+6=21个。从非线性函数中随机得到2000组输入输出数据,随机选择其中1900组作为训练数据,100组作为测试数据。将训练数据预测误差绝对值和作为个体适应度值,个体适应度值越小,该个体越优。

       遗传算法参数设置为:种群规模为10,进化次数为50次,交叉概率为0.4,变异概率为0.2。

(2)适应度函数

        将训练数据预测误差作为个体适应度值。 

function error = 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));

(3)选择操作

       选择操作采用轮盘赌法从种群中选择适应度好的个体组成新种群。

function ret=select(individuals,sizepop)
fitness1=10./individuals.fitness;
sumfitness=sum(fitness1);
sumf=fitness1./sumfitness;
index=[]; 
for i=1:sizepop   %转sizepop次轮盘pick=rand;while pick==0    pick=rand;        endfor j=1:sizepop    pick=pick-sumf(i);        if pick<0        index=[index j];            break;endend
end
individuals.chrom=individuals.chrom(index,:);
individuals.fitness=individuals.fitness(index);
ret=individuals;

 (4)交叉

function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)for i=1:sizepop pick=rand(1,2);while prod(pick)==0pick=rand(1,2);endindex=ceil(pick.*sizepop);pick=rand;while pick==0pick=rand;endif pick>pcrosscontinue;endflag=0;while flag==0pick=rand;while pick==0pick=rand;endpos=ceil(pick.*sum(lenchrom));pick=rand;v1=chrom(index(1),pos);v2=chrom(index(2),pos);chrom(index(1),pos)=pick*v2+(1-pick)*v1;chrom(index(2),pos)=pick*v1+(1-pick)*v2; flag1=test(lenchrom,bound,chrom(index(1),:));  flag2=test(lenchrom,bound,chrom(index(2),:)); if   flag1*flag2==0flag=0;else flag=1;end    endend
ret=chrom;

(5) 变异

function ret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound)for i=1:sizepop  pick=rand;while pick==0pick=rand;endindex=ceil(pick*sizepop);pick=rand;if pick>pmutationcontinue;endflag=0;while flag==0pick=rand;while pick==0      pick=rand;endpos=ceil(pick*sum(lenchrom)); pick=rand;fg=(rand*(1-num/maxgen))^2;if pick>0.5chrom(i,pos)=chrom(i,pos)+(bound(pos,2)-chrom(i,pos))*fg;elsechrom(i,pos)=chrom(i,pos)-(chrom(i,pos)-bound(pos,1))*fg;end  flag=test(lenchrom,bound,chrom(i,:)); end
end
ret=chrom;

(6) 遗传算法主函数

clc
clear
load data input outputinputnum=2;
hiddennum=5;
outputnum=1;input_train=input(1:1900,:)';
input_test=input(1901:2000,:)';
output_train=output(1:1900)';
output_test=output(1901:2000)';[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);net=newff(inputn,outputn,hiddennum);maxgen=20;  
pcross=[0.2];
pmutation=[0.1];numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;lenchrom=ones(1,numsum);        
bound=[-3*ones(numsum,1) 3*ones(numsum,1)]; individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);
avgfitness=[];
bestfitness=[];
bestchrom=[];for i=1:sizepopindividuals.chrom(i,:)=Code(lenchrom,bound); x=individuals.chrom(i,:);individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn); 
end
FitRecord=[];[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); 
avgfitness=sum(individuals.fitness)/sizepop; 
trace=[avgfitness bestfitness]; for i=1:maxgeniindividuals=Select(individuals,sizepop); avgfitness=sum(individuals.fitness)/sizepop;individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);for j=1:sizepopx=individuals.chrom(j,:); individuals.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);   end[newbestfitness,newbestindex]=min(individuals.fitness);[worestfitness,worestindex]=max(individuals.fitness);if bestfitness>newbestfitnessbestfitness=newbestfitness;bestchrom=individuals.chrom(newbestindex,:);endindividuals.chrom(worestindex,:)=bestchrom;individuals.fitness(worestindex)=bestfitness;avgfitness=sum(individuals.fitness)/sizepop;trace=[trace;avgfitness bestfitness];FitRecord=[FitRecord;individuals.fitness];
end

(7) 将遗传算法的到的最优个体赋值进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;net.trainParam.epochs=100;
net.trainParam.lr=0.1;[net,per2]=train(net,inputn,outputn);inputn_test=mapminmax('apply',input_test,inputps);
an=sim(net,inputn_test);
test_simu=mapminmax('reverse',an,outputps);
error=test_simu-output_test;

 (8)结果分析

      绘制遗传算法优化过程中最优个体适应度值变化图:

figure(1)
[r c]=size(trace);
plot([1:r]',trace(:,2),'b--');
title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');
legend('平均适应度','最佳适应度');

输出结果:

 

      模型的均方误差为2.2628x10的负7次方,什么模型的效果还可以。


更多优质内容持续发布中,请移步主页查看。

   点赞+关注,下次不迷路!

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

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

相关文章

快速解决mfc140u.dll丢失问题,找不到mfc140u.dll修复方法分享

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是某些dll文件丢失。最近&#xff0c;我就遇到了一个关于mfc140u.dll丢失的问题。mfc140u.dll是Microsoft Foundation Class&#xff08;MFC&#xff09;库中的一个动态链接库文件&#xff0c;它包…

JSP通用材料收集归档系统eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 通用材料收集归档系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c…

接口---默认方法

用户操作界面 package Default;public class Dome02interface {public static void main(String[] args) {// 创建实现类对象 // MyInterfaceDefaultA A new MyInterfaceDefaultA(); // A.method01(); // System.out.println("--------------"); // 调用默认方…

【C++】多态(重写)的实现过程及其原理【核心知识点精讲】(22)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.基础知识介绍1&#xff09;虚函数&a…

SpringBoot整合Mybatis+人大金仓(kingbase8)

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-人大金仓&#xff08;kingbase8&#xff09;&#xff08;主要讲一些人大金仓数据库相关的内容&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下Mybatis框架整合…

Centos7下搭建H3C log服务器

rsyslogH3C 安装rsyslog服务器 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld关闭selinux sed -i s/enforcing/disabled/ /etc/selinux/config && setenforce 0centos7服务器&#xff0c;通过yum安装rsyslog yum -y install rsysl…

Swift语言配合HTTP写的一个爬虫程序

下段代码使用Embassy库编写一个Swift爬虫程序来爬取jshk的内容。我会使用proxy_host为duoip&#xff0c;proxy_port为8000的爬虫IP服务器。 使用Embassy库编写一个Swift爬虫程序可以实现从网页上抓取数据的功能。下面是一个简单的步骤&#xff1a; 1、首先&#xff0c;需要在X…

vue使用websocket与springboot通信

WebSocket是HTML5下一种新的协议&#xff0c;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的 在很多项目中&#xff0c;都要用到websocket&#xff0c;使得前端页面与后端页进行实时通信&#xff0c;例如&#xff0c;实时查询…

Vue3:自定义图标选择器(包含 SVG 图标封装)

文章目录 一、准备工作&#xff08;在 Vue3 中使用 SVG&#xff09;二、封装 SVG三、封装图标选择器四、Demo 效果预览&#xff1a; 一、准备工作&#xff08;在 Vue3 中使用 SVG&#xff09; 本文参考&#xff1a;https://blog.csdn.net/houtengyang/article/details/1290431…

Tcl语言:SDC约束命令create_generated_clock详解(下)

相关阅读 Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm1001.2014.3001.5482 设定生成时钟特性 前文的末尾提到&#xff0c;当使用-divide by或-multiply_by选项创建生成时钟时&#xff0c;会根据master clock的时钟周期派生出生成时钟的周期&am…

yum工具的使用

yum工具的使用 rpm的弊端 前面我们讲了下rpm&#xff0c;那么rpm有什么弊端呢&#xff1f;其弊端是显而易见的&#xff0c;当用rpm安装软件时&#xff0c;若遇到有依赖关系的软件&#xff0c;必须先安装依赖的软件才能继续安装我们要安装的软件&#xff0c;当依赖关系很复杂的…

[CISCN 2023 初赛]go_session

文章目录 考点代码审计main.goroute.goIndex函数Admin函数Flask函数 解题过程伪造session获取server.py构造payload覆盖server.py命令执行 考点 session伪造&#xff0c;pongo2模板注入&#xff0c;debug模式覆盖源文件 代码审计 main.go package mainimport ("github.c…

汇编-变量

.386 .model flat,stdcall option casemap:none.data sum DWORD 0 ;创建一个全局变量&#xff0c;取名sum,初始化0 sum1 DWORD ? ;创建一个全局变量sum1,无初始化 ;问号(?)初始化值使得变量未被初始化&#xff0c;这意味着在运行时才会为该变量分配一个值 ;变量名…

【Node.js入门】1.3 开始开发Node.js应用程序

1.3 开始开发Node.js应用程序 学习目标 &#xff08;1&#xff09;熟悉开发工具Visual Studio Code的基本使用&#xff1b; &#xff08;2&#xff09;掌握Node.js应用程序的编写、运行和调试的基本方法。 构建第一个 Node.js应用程序 代码 const http require("htt…

【小技巧】WPS统计纯汉字(不计标点符号)

【小技巧】WPS统计纯汉字&#xff08;不计标点符号&#xff09; 首先&#xff0c;CtrlF打开查找页面&#xff1a; 选择“高级搜索”&#xff0c;然后勾选“使用通配符”&#xff0c;然后在“查找内容”后面输入&#xff1a;[一-﨩]。注意&#xff1a;一定要带“[]”和“-”且…

web前端——HTML+CSS实现九宫格

web前端——HTMLCSS实现九宫格 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

10道高频Vuex面试题快问快答

※其他的快问快答&#xff0c;看这里&#xff01; 10道高频Qiankun微前端面试题快问快答 10道高频webpack面试题快问快答 20道高频CSS面试题快问快答 20道高频JavaScript面试题快问快答 30道高频Vue面试题快问快答 面试中的快问快答 快问快答的情景在面试中非常常见。 在面试过…

07 # 手写 find 方法

find 的使用 find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。 ele&#xff1a;表示数组中的每一个元素index&#xff1a;表示数据中元素的索引array&#xff1a;表示数组 <script>var arr [1, 3, 5, 7, 9];var result arr.find(fun…

Chatgpt人工智能对话源码系统分享 带完整搭建教程

ChatGPT的开发基于大规模预训练模型技术。预训练模型是一种在大量文本数据上进行训练的模型&#xff0c;可以学习到各种语言模式和知识。在ChatGPT中&#xff0c;预训练模型被用于学习如何生成文本&#xff0c;并且可以用于各种不同的任务&#xff0c;如对话生成、问答、摘要等…

SpringBoot整合Kafka (二)

&#x1f4d1;前言 本文主要讲了SpringBoot整合Kafka文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ 上文链接&#xff1a;SpringBoot整合Kafka (一) &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页…