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

简介: 【Matlab智能算法】PSO优化(双隐层)BP神经网络算法


1.优化思路

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

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

双隐层神经网络相比于单隐层神经网络不仅增多了一个隐含层,权重和偏置的数量也增多,确定权重和偏置的数量尤为重要。关于权重和偏置的设定,可以参考:MATLAB中多层网络的net.lw{i,j}和net.b{k}的含义

先假设神经网络结构,{ 9 [80 50 20] 1 };9为输入层,[80 50 20]为隐层,1为输出层。

net.iw{1,1} 表示 输入层 到 第1层隐层 的权重,为80*9的矩阵;
net.lw{2,1} 表示 第1层隐层 到 第2层隐层 的权重,为50*80的矩阵;
net.lw{3,2} 表示 第2层隐层 到 第3层隐层 的权重,为20*50的矩阵;
net.lw{4,3} 表示 第3层隐层 到 输出层 的权重,为1*20的矩阵;
net.b{1} 表示 第1层隐层 的偏置,为80*1的矩阵;
net.b{2} 表示 第2层隐层 的偏置,为50*1的矩阵;
net.b{3} 表示 第3层隐层 的偏置,为20*1的矩阵;
net.b{4} 表示 输出层 的偏置,为1*1的矩阵;

2.测试函数

y = x 1 2 + x 2 2 y = x_1^2+x_2^2y=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

H55PSOBP_fun.m

function error = H55PSOBP_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*hiddennum1);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+1: ...
    inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1);
w3=x(inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1+1: ...
    inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1+hiddennum1*outputnum);
B3=x(inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1+hiddennum1*outputnum+1: ...
    inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1+hiddennum1*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,hiddennum1,hiddennum);
net.lw{3,2}=reshape(w3,outputnum,hiddennum1);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,hiddennum1,1);
net.b{3}=B3;
%网络训练
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(abs(an-outputn));

H55PSOBP.m

BP神经网络结构为 2-5-5-1

%% 清空环境
clc
tic
%读取数据
load data input output
%节点个数
inputnum=2;
hiddennum=5;
hiddennum1=5;
outputnum=1;
opnum=inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1+hiddennum1*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, hiddennum1]);
% 参数初始化
%粒子群算法中的两个参数
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)=H55PSOBP_fun(pop(i,:),inputnum,hiddennum,hiddennum1,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)=H55PSOBP_fun(pop(j,:),inputnum,hiddennum,hiddennum1,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*hiddennum1);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+1: ...
    inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1);
w3=x(inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1+1: ...
    inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1+hiddennum1*outputnum);
B3=x(inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1+hiddennum1*outputnum+1: ...
    inputnum*hiddennum+hiddennum+hiddennum*hiddennum1+hiddennum1+hiddennum1*outputnum+outputnum);
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,hiddennum1,hiddennum);
net.lw{3,2}=reshape(w3,outputnum,hiddennum1);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,hiddennum1,1);
net.b{3}=B3;
%% PSO-BP网络训练
%网络进化参数
net.trainParam.epochs=120;
net.trainParam.lr=0.005;
net.trainParam.goal=4e-8;
%网络训练
[net,per2]=train(net,inputn,outputn);
%% BP网络训练
% %初始化网络结构
net1=newff(inputn,outputn,[hiddennum,hiddennum1]); % BP网络
net1.trainParam.epochs=120;
net1.trainParam.lr=0.005;
net1.trainParam.goal=4e-8;
%网络训练
net1=train(net1,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);
%% BP网络预测
%网络预测输出
an2=sim(net1,inputn_test);
an3=sim(net1,inputn_train);
test_BP=mapminmax('reverse',an2,outputps);
train_BP=mapminmax('reverse',an3,outputps);
%% PSO-BP误差输出
error_PSOBP=test_PSOBP-output_test;
disp('PSO-BP results:');
errorsum_PSOBP=sum(abs(error_PSOBP))
%% PSO-BP结果绘图
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);
%% BP误差输出
error_BP=test_BP-output_test;
disp('BP results:');
errorsum_BP=sum(abs(error_BP))
%% BP结果绘图
figure(5);
plot(test_BP,':og');
hold on
plot(output_test,'-*');
legend('Predictive output','Expected output','fontsize',10.8);
title('BP network output','fontsize',12);
xlabel("samples",'fontsize',12);
figure(6);
plot(error_BP,'-*');
title('BP Neural network prediction error');
xlabel("samples",'fontsize',12);
figure(7);
plot(100*(output_test-test_BP)./output_test,'-*');
title('BP Neural network prediction error percentage (%)');
xlabel("samples",'fontsize',12);
figure(8);
plot(100*(output_train-train_BP)./output_train,'-*');
title('BP Neural network training error percentage (%)');
xlabel("samples",'fontsize',12);
toc

4.运行效果

输出:

PSO-BP results:
errorsum_PSOBP =
    0.5269
BP results:
errorsum_BP =
    2.6417
历时 217.421716 秒。

资源下载

下载链接

相关文章
|
16天前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
46 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
14天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
15天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
65 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
15天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
60 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
15天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
44 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
11天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
23 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
3天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习还不如浅层网络?RL教父Sutton持续反向传播算法登Nature
【9月更文挑战第24天】近年来,深度学习在人工智能领域取得巨大成功,但在连续学习任务中面临“损失可塑性”问题,尤其在深度强化学习中更为突出。加拿大阿尔伯塔大学的研究人员提出了一种名为“持续反向传播”的算法,通过选择性地重新初始化网络中的低效用单元,保持模型的可塑性。该算法通过评估每个连接和权重的贡献效用来决定是否重新初始化隐藏单元,并引入成熟度阈值保护新单元。实验表明,该算法能显著提升连续学习任务的表现,尤其在深度强化学习领域效果明显。然而,算法也存在计算复杂性和成熟度阈值设置等问题。
25 2
|
11天前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
30 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
WK
|
17天前
|
机器学习/深度学习 算法 数据挖掘
PSO算法的应用场景有哪些
粒子群优化算法(PSO)因其实现简单、高效灵活,在众多领域广泛应用。其主要场景包括:神经网络训练、工程设计、电力系统经济调度与配电网络重构、数据挖掘中的聚类与分类、控制工程中的参数整定、机器人路径规划、图像处理、生物信息学及物流配送和交通管理等。PSO能处理复杂优化问题,快速找到全局最优解或近似解,展现出强大的应用潜力。
WK
20 1
下一篇
无影云桌面