原理:
           PSO(粒子群群算法):可以在全局范围内进行大致搜索,得到一个初始解,以便BP接力
           BP(神经网络):梯度搜素,细化能力强,可以进行更仔细的搜索。
数据:对该函数((2.1*(1-x+2*x.^2).*exp(-x.^2/2))+sin(x)+x','x')[-5,5]进行采样,得到30组训练数据,拟合该网络。

     神经网络结构设置:   该网络结构为,1-7-1结构,即输入1个神经元,中间神经元7个,输出1个神经元

程序步骤:

第一步:先采用抽取30组数据,包括输入和输出

第一步:运行粒子群算法,进行随机搜索,选择一个最优的解,该解的维数为22维。

第二步:在;粒子群的解基础上进行细化搜索

程序代码:

clc
clear
tic
SamNum=30; HiddenNum=7;
InDim=1;
OutDim=1; load train_x
load train_f a=train_x';
d=train_f'; p=[a];
t=[d];
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); NoiseVar=0.01;
Noise=NoiseVar*randn(1,SamNum);
SamOut=tn + Noise; SamIn=SamIn';
SamOut=SamOut'; MaxEpochs=60000;
lr=0.025;
E0=0.65*10^(-6); %%
%the begin of PSO E0=0.001;
Max_num=500;
particlesize=200;
c1=1;
c2=1;
w=2;
vc=2;
vmax=5;
dims=InDim*HiddenNum+HiddenNum+HiddenNum*OutDim+OutDim;
x=-4+7*rand(particlesize,dims);
v=-4+5*rand(particlesize,dims);
f=zeros(particlesize,1);
%%
for jjj=1:particlesize
trans_x=x(jjj,:);
W1=zeros(InDim,HiddenNum);
B1=zeros(HiddenNum,1);
W2=zeros(HiddenNum,OutDim);
B2=zeros(OutDim,1); W1=trans_x(1,1:HiddenNum);
B1=trans_x(1,HiddenNum+1:2*HiddenNum)';
W2=trans_x(1,2*HiddenNum+1:3*HiddenNum)';
B2=trans_x(1,3*HiddenNum+1);
Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));
Networkout=Hiddenout*W2+repmat(B2',SamNum,1);
Error=Networkout-SamOut;
SSE=sumsqr(Error) f(jjj)=SSE;
end
personalbest_x=x;
personalbest_f=f;
[groupbest_f i]=min(personalbest_f);
groupbest_x=x(i,:);
for j_Num=1:Max_num
vc=(5/3*Max_num-j_Num)/Max_num;
%%
v=w*v+c1*rand*(personalbest_x-x)+c2*rand*(repmat(groupbest_x,particlesize,1)-x);
for kk=1:particlesize
for kk0=1:dims
if v(kk,kk0)>vmax
v(kk,kk0)=vmax;
else if v(kk,kk0)<-vmax
v(kk,kk0)=-vmax;
end
end
end
end
x=x+vc*v;
%%
for jjj=1:particlesize
trans_x=x(jjj,:);
W1=zeros(InDim,HiddenNum);
B1=zeros(HiddenNum,1);
W2=zeros(HiddenNum,OutDim);
B2=zeros(OutDim,1); W1=trans_x(1,1:HiddenNum);
B1=trans_x(1,HiddenNum+1:2*HiddenNum)';
W2=trans_x(1,2*HiddenNum+1:3*HiddenNum)';
B2=trans_x(1,3*HiddenNum+1);
Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));
Networkout=Hiddenout*W2+repmat(B2',SamNum,1);
Error=Networkout-SamOut;
SSE=sumsqr(Error); f(jjj)=SSE; end
%%
for kk=1:particlesize
if f(kk)<personalbest_f(kk)
personalbest_f(kk)=f(kk);
personalbest_x(kk)=x(kk);
end
end
[groupbest_f0 i]=min(personalbest_f); if groupbest_f0<groupbest_f
groupbest_x=x(i,:);
groupbest_f=groupbest_f0;
end
ddd(j_Num)=groupbest_f
end
str=num2str(groupbest_f);
trans_x=groupbest_x;
W1=trans_x(1,1:HiddenNum);
B1=trans_x(1,HiddenNum+1:2*HiddenNum)';
W2=trans_x(1,2*HiddenNum+1:3*HiddenNum)';
B2=trans_x(1,3*HiddenNum+1);
%the end of PSO
%% for i=1:MaxEpochs
%%
Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));
Networkout=Hiddenout*W2+repmat(B2',SamNum,1);
Error=Networkout-SamOut;
SSE=sumsqr(Error) ErrHistory=[ SSE]; if SSE<E0,break, end
dB2=zeros(OutDim,1);
dW2=zeros(HiddenNum,OutDim);
for jj=1:HiddenNum
for k=1:SamNum
dW2(jj,OutDim)=dW2(jj,OutDim)+Error(k)*Hiddenout(k,jj);
end
end
for k=1:SamNum
dB2(OutDim,1)=dB2(OutDim,1)+Error(k);
end
dW1=zeros(InDim,HiddenNum);
dB1=zeros(HiddenNum,1);
for ii=1:InDim
for jj=1:HiddenNum for k=1:SamNum
dW1(ii,jj)=dW1(ii,jj)+Error(k)*W2(jj,OutDim)*Hiddenout(k,jj)*(1-Hiddenout(k,jj))*(SamIn(k,ii));
dB1(jj,1)=dB1(jj,1)+Error(k)*W2(jj,OutDim)*Hiddenout(k,jj)*(1-Hiddenout(k,jj)); end
end
end W2=W2-lr*dW2;
B2=B2-lr*dB2; W1=W1-lr*dW1;
B1=B1-lr*dB1;
end Hiddenout=logsig(SamIn*W1+repmat(B1',SamNum,1));
Networkout=Hiddenout*W2+repmat(B2',SamNum,1); aa=postmnmx(Networkout,mint,maxt);
x=a;
newk=aa;
figure
plot(x,d,'r-o',x,newk,'b--+')
legend('原始数据','训练后的数据');
xlabel('x');ylabel('y');
toc

注:在(i5,8G,win7,64位)PC上的运行时间为30s左右。鉴于PSO带有概率性,可以多跑几次,看最佳的一次效果。

转载于:https://www.cnblogs.com/jacksin/p/8835907.html

(PSO-BP)结合粒子群的神经网络算法以及matlab实现的更多相关文章

  1. 群智能优化算法-测试函数matlab源码

    群智能优化算法测试函数matlab源代码 global M; creatematrix(2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %画ackley图. %%%% ...

  2. 粒子群算法(PSO)算法解析(简略版)

    粒子群算法(PSO) 1.粒子群算法(PSO)是一种基于群体的随机优化技术: 初始化为一组随机解,通过迭代搜寻最优解. PSO算法流程如图所示(此图是从PPT做好,复制过来的,有些模糊) 2.PSO模 ...

  3. 粒子群算法优化BP生物能神经网络

    定义: 粒子群中每个粒子的位置表示BP神经网络当前迭代中权值的集合,每个粒子的维数由网络中起连接作用的权值的数量和阈值个数决定,以给定训练样本集的神经网络输出误差作为神经网络训练问题的适应度函数,适应 ...

  4. 粒子群优化算法对BP神经网络优化 Matlab实现

    1.粒子群优化算法 粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,该算法模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作 ...

  5. 算法(三)粒子群算法PSO的介绍

    一.引言 在讲算法之前,先看两个例子: 例子一:背包问题,一个书包,一堆物品,每个物品都有自己的价值和体积,装满书包,使得装的物品价值最大. 例子二:投资问题,n个项目,第i个项目投资为ci 收益为p ...

  6. ARIMA模型--粒子群优化算法(PSO)和遗传算法(GA)

    ARIMA模型(完整的Word文件可以去我的博客里面下载) ARIMA模型(英语:AutoregressiveIntegratedMovingAverage model),差分整合移动平均自回归模型, ...

  7. 计算智能(CI)之粒子群优化算法(PSO)(一)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 计算智能(Computational Intelligence , ...

  8. 【比较】粒子群算法PSO 和 遗传算法GA 的相同点和不同点

    目录 PSO和GA的相同点 PSO和GA不同点 粒子群算法(PSO)和遗传算法(GA)都是优化算法,都力图在自然特性的基础上模拟个体种群的适应性,它们都采用一定的变换规则通过搜索空间求解. PSO和G ...

  9. C语言实现粒子群算法(PSO)二

    上一回说了基本粒子群算法的实现,并且给出了C语言代码.这一篇主要讲解影响粒子群算法的一个重要参数---w.我们已经说过粒子群算法的核心的两个公式为: Vid(k+1)=w*Vid(k)+c1*r1*( ...

随机推荐

  1. JAVA中使用使Math 类操作数据

    转自:https://www.imooc.com/code/2342 侵删! Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用 ...

  2. Redis cluster集群配置教程

    这里建议大家安装4.0.9版本的 1.打开Centos虚拟机,登陆. 2.通过WinSCP把Redis集群tar包上传到虚拟机里的目录里,我的目录是 /usr/local 这里我已经上传过了并解压了, ...

  3. Golang源码分析之目录详解

    开源项目「go home」聚焦Go语言技术栈与面试题,以协助Gopher登上更大的舞台,欢迎go home~ 导读 学习Go语言源码的第一步就是了解先了解它的目录结构,你对它的源码目录了解多少呢? 目 ...

  4. AJ学IOS(07)UI之UITextField代理事件_类似QQ登陆窗口的简单实现

    AJ分享,必须精品 先看效果图: 学习代码 // // NYViewController.m // 05-UITextField事件_UIKit复习 // // Created by apple on ...

  5. G++编译链接的那些事

    语言 CPP 前言   虽然 VSCodeC++ 编辑器非常受大家的欢迎,无论是大佬还是小白都说对其爱不释手...   我...用了一段时间后发现实在是麻烦,配置往往花费我大量时间.可以说真的是吃力不 ...

  6. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(五)之Controlling Execution

    In Java, the keywords include if-else,while,do-while,for,return,break, and a selection statement cal ...

  7. Newtonsoft.Json.Linq 序列化 反序列化等知识

    1.反序列化实体类 //使用JObject读写字符串:JObject j = JObject.Parse(data);IEnumerable<JProperty> properties = ...

  8. JS 中的自定义事件和模拟事件

    在 JS 中模拟事件指的是模拟 JS 中定义的一些事件,例如点击事件,键盘事件等. 自定义事件指的是创建一个自定义的,JS 中之前没有的事件. 接下来分别说一下创建这两种事件的方法. 创建自定义事件 ...

  9. 牛客练习赛61 相似的子串(二分+Hash)

    题面在此 题解:将字符串分成k部分,然后求最长前缀,所以我们只关注前缀部分就好了,公共前缀后边的是啥不用管,那么问题就转化成了是否存在k个不相交的字符串的最长公共前缀问题.首先用Hash来记录一下字符 ...

  10. mybatis一级缓存让我憔悴

    Mybatis对缓存提供支持,是默认开启一级缓存. 来一段代码,这边使用的是mybatis-plus框架,通过构建 QueryWrapper 查询类来实现的. @Transactional publi ...