PSO优化BP神经网络在Matlab中的实现

来源:互联网 发布:ppt圆环图编辑数据 编辑:程序博客网 时间:2024/05/17 06:17

粒子群优化算法(Particle Swarm Optimization, PSO)是在1995年由美国社会心理学家James Kennedy和电气工程师Russell Eberhart共同提出的,其基本思想是受他们早期对鸟类群体行为研究结果的启发,并利用了生物学家Frank Heppner的生物群体模型。PSO算法与遗传算法类似,是一种基于迭代的优化算法,但无交叉变异等操作,其搜索过程是通过粒子在解空间中不断更新自己的速度和位置,以追随最优粒子而进行的。

PSO算法首先随机的初始化一个粒子群体,通过迭代寻找最优解,在每一次迭代过程中,每个粒子目前所找到的最优解为pBest,整个种群目前所找到的最优解为gBest,每个粒子通过这两极值来更新自己的速度和位置,相应的公式为:

v = v + c1 * rand() * (pbest - present) + c2 * rand() * (gbest - present)
present = persent + v

其中,v为粒子的速度,present为粒子的位置(在具体应用中pBest, gBest, v, present为向量),rand()产生0到1之间的随机数,c1和c2为学习因子。在进化迭代过程中,须根据实际需要为v和present指定范围。

PSO算法可用于BP神经网络的网络权值优化中,传统的BP神经网络采用误差反向传播来调整网络连接权值,该方法容易陷入局部最优解,而PSO算法可以在更大的空间内搜索,在一定程度上避免了以上问题。

将神经网络各层的连接权值编码成粒子,适应度值则为使用该组权值时的网络输出均方误差,利用之前描述的粒子群算法,在预设的迭代次数内搜索最优的网络权值。

以下的Matlab程序演示了PSO优化BP网络的过程,程序的目的是使用BP神经网络进行正弦函数逼近,使用3层神经网络,隐含层由3个神经元组成,粒子群共包含20个粒子,每个粒子的长度为10。其中BP网络使用Matlab自带的工具箱,非工具箱的实现可参考:BP网络的函数逼近在Matlab中的实现

01clear;
02clc;
03 
04p = 0 : 0.01 : 2;
05t = sin(pi * p);
06n = 3;   %隐含层神经元个数
07net = newff(p, t, n, {'tansig','purelin'},'trainlm');
08 
09swarmCount = 20;   %粒子数
10swarmLength = 10;   %粒子长度
11vMax = 20;   %粒子运动最大速度
12pMax = 2;   %粒子运动最大位置
13swarm = rand(swarmCount, swarmLength);   %初始粒子群,即粒子的位置
14v = rand(swarmCount, swarmLength);   %粒子的速度
15swarmfitness = zeros(swarmCount, 1, 'double');   %粒子的适应度值
16pBest = rand(swarmCount, swarmLength);   %个体最优值
17pBestfitness = zeros(swarmCount, 1, 'double');   %个体最优适应度值
18pBestfitness(:, :) = 100;
19gBest = rand(1, swarmLength);   %全局最优值
20gBestfitness = 100;   %全局最优适应度值
21c1 = 2;
22c2 = 2;
23maxEpoch = 2000;   %最大训练次数
24errGoal = 0.01;   %期望误差最小值
25epoch = 1;
26while (epoch < maxEpoch && gBestfitness > errGoal)
27    fori = 1 : swarmCount
28        %计算粒子的适应度值
29        net.iw{1, 1} = swarm(i, 1 : 3)';
30        net.b{1} = swarm(i, 4 : 6)';
31        net.lw{2, 1} = swarm(i, 7 : 9);
32        net.b{2} = swarm(i, 10 : 10);
33        tout = sim(net, p);
34        sse = sum((tout - t) .^ 2) / length(t);
35        swarmfitness(i, 1) = sse;
36        %更新个体最优值
37        if(pBestfitness(i, 1) > sse)
38            pBestfitness(i, 1) = sse;
39            pBest(i, :) = swarm(i, :);
40             
41            %更新全局最优值
42            if(gBestfitness > sse)
43                gBestfitness = sse;
44                gBest(1, :) = swarm(i, :);
45            end
46        end
47    end
48 
49    %更新粒子的速度和位置
50    fori = 1 : swarmCount
51        v(i, :) = v(i, :) + c1 *rand(1, 1) * (pBest(i, :) - swarm(i, :)) + c2 *rand(1, 1) * (gBest(1, :) - swarm(i, :));
52        tmp = find(v(i, :) > vMax);
53        v(i, tmp) = vMax;
54 
55        swarm(i, :) = swarm(i, :) + v(i, :);
56        tmp = find(swarm(i, :) > pMax);
57        swarm(i, tmp) = pMax;
58    end
59     
60    epoch = epoch + 1;
61end
62 
63net.iw{1, 1} = gBest(1, 1 : 3)';
64net.b{1} = gBest(1, 4 : 6)';
65net.lw{2, 1} = gBest(1, 7 : 9);
66net.b{2} = gBest(1, 10 : 10);
67tout = sim(net, p);
68 
69figure, plot(p, t, 'k-');
70hold on;
71plot(p, tout, 'b-');

针对粒子群算法的改进研究也非常多,如我们江南大学的孙俊老师提出的量子粒子群算法(Quantum-behaved Particle Swarm Optimization)在学术圈内就具有较大影响,在量子空间中,粒子可以在整个可行解空间中进行搜索,因而QPSO算法的全局搜索性能远远优于标准PSO算法。最近的研究中使用了自适应神经模糊系统(Adaptive Neuro-Fuzzy System),后续计划使用QPSO算法对模糊系统进行优化。

--End--
作者:Steven Wang | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://blog.stevenwang.name/pso-bp-matlab-295001.html

Relate Posts:

  • 利用QPSO算法解学生选导师分配问题
  • BP网络的函数逼近在Matlab中的实现
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾照扣了100分怎么办 驾照扣40多分怎么办 驾照被扣69分怎么办 驾照被扣200多分怎么办 b2驾照扣了分怎么办 驾驶证在外地被冒用怎么办 身份证被冒用办驾照怎么办 外国人在中国境内死了怎么办 台风来临时航船应该怎么办 越南攻占太平岛台湾怎么办 厨房下水pvc管三通漏水怎么办 pvc下水管道接口漏水怎么办 马航机场转机行李怎么办 习惯了光脚开车怎么办 遇到暴恐分子时该怎么办视频 中国人在菲律宾失踪了怎么办 高跟凉鞋前面磨脚怎么办 小孩子偷邻居家的钱怎么办 碰见美国人说叙利亚诈骗团伙怎么办 日服的火焰纹章闪退怎么办 冒险岛没潜能的怎么办 冒险岛法师运气不够怎么办 cad文件打开老是闪退白屏怎么办 上古卷轴5坏档怎么办 冒险岛2 65级后怎么办 第二次起诉离婚对方不同意怎么办 起诉离婚对方不同意离婚怎么办 我12爸妈离婚该怎么办 苹果迅雷下载的链接打不开怎么办 苹果上装的迅雷打不开怎么办 mp4进水水干了后打不开怎么办 迅雷闪退ios10.3怎么办 用辣椒辣到眼睛怎么办 辣椒辣到眼皮了怎么办 眼被辣椒辣了怎么办 老公欠银行的钱怎么办 离婚老公欠的钱怎么办 欠了几十万债怎么办 执行死刑时已怀孕怎么办 执行死刑世已经怀孕怎么办 孩子被爸爸打该怎么办