Steven Wang's Blog
C'est la vie
rss
email
twitter
新浪微博
  • Home
  • About
  • Google Profile
  • 新浪微博

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

2 Comments
Posted on 七月 30 2010

粒子群优化算法(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中的实现

clear;
clc;

p = 0 : 0.01 : 2;
t = sin(pi * p);
n = 3;   %隐含层神经元个数
net = newff(p, t, n, {'tansig','purelin'}, 'trainlm');

swarmCount = 20;   %粒子数
swarmLength = 10;   %粒子长度
vMax = 20;   %粒子运动最大速度
pMax = 2;   %粒子运动最大位置
swarm = rand(swarmCount, swarmLength);   %初始粒子群,即粒子的位置
v = rand(swarmCount, swarmLength);   %粒子的速度
swarmfitness = zeros(swarmCount, 1, 'double');   %粒子的适应度值
pBest = rand(swarmCount, swarmLength);   %个体最优值
pBestfitness = zeros(swarmCount, 1, 'double');   %个体最优适应度值
pBestfitness(:, :) = 100;
gBest = rand(1, swarmLength);   %全局最优值
gBestfitness = 100;   %全局最优适应度值
c1 = 2;
c2 = 2;
maxEpoch = 2000;   %最大训练次数
errGoal = 0.01;   %期望误差最小值
epoch = 1;
while (epoch < maxEpoch && gBestfitness > errGoal)
    for i = 1 : swarmCount
        %计算粒子的适应度值
        net.iw{1, 1} = swarm(i, 1 : 3)';
        net.b{1} = swarm(i, 4 : 6)';
        net.lw{2, 1} = swarm(i, 7 : 9);
        net.b{2} = swarm(i, 10 : 10);
        tout = sim(net, p);
        sse = sum((tout - t) .^ 2) / length(t);
        swarmfitness(i, 1) = sse;
        %更新个体最优值
        if (pBestfitness(i, 1) > sse)
            pBestfitness(i, 1) = sse;
            pBest(i, :) = swarm(i, :);
            
            %更新全局最优值
            if(gBestfitness > sse)
                gBestfitness = sse;
                gBest(1, :) = swarm(i, :);
            end
        end
    end

    %更新粒子的速度和位置
    for i = 1 : swarmCount
        v(i, :) = v(i, :) + c1 * rand(1, 1) * (pBest(i, :) - swarm(i, :)) + c2 * rand(1, 1) * (gBest(1, :) - swarm(i, :));
        tmp = find(v(i, :) > vMax);
        v(i, tmp) = vMax;

        swarm(i, :) = swarm(i, :) + v(i, :);
        tmp = find(swarm(i, :) > pMax);
        swarm(i, tmp) = pMax;
    end
    
    epoch = epoch + 1;
end

net.iw{1, 1} = gBest(1, 1 : 3)';
net.b{1} = gBest(1, 4 : 6)';
net.lw{2, 1} = gBest(1, 7 : 9);
net.b{2} = gBest(1, 10 : 10);
tout = sim(net, p);

figure, plot(p, t, 'k-');
hold on;
plot(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中的实现

Tags: PSO  BP网络  Matlab  
Categories: 人工神经网络  算法 

2 Comments

  1. 彭艳 says:
    八月 12 2010 at 19:11 Reply

    不知道lz有没有尝试用python写这些算法?虽然很多人讲用python进行科学计算,但感觉matlab优势还很明显,尤其是不介意用盗版的情况下.

  2. Steven Wang says:
    九月 29 2010 at 00:45 Reply

    @彭艳, 最近在博客上发了两个用Python写的算法实验程序,仅供参考。

Leave a Reply



About Me

    Steven Wang
    Student in Computer Software and Theory
    Life@Wuxi, Jiangsu
    Study@Jiangnan University
    more...

Feeds

  • Entries (RSS)
  • Comments (RSS)
  • 订阅到 Google Reader
  • 订阅到 抓虾
  • 订阅到 鲜果
  • 订阅到 QQ

Popular Posts

  • 围着脖子推GTalk机器人V1.0发布(26629)
  • 通过SSH + Chrome + Proxy Switchy!代理上网(19478)
  • 在GAE上部署Micolog博客系统(11098)
  • 围着脖子推V2.0 Beta1版发布 支持Twitter,新浪微博,人人网,嘀咕,做啥 同步更新(10660)
  • 围着脖子推GTalk机器人V1.0更新-增加接收Twitter更新等功能(10464)
  • 围着脖子推更新-增加同步更新网易微博、腾讯微博和搜狐微博(10092)
  • 在Matlab中实现Hough变换检测直线(8247)
  • Micolog主题(theme) —— translucence(7416)

Recent Posts

  • Steven Wang's 2011
  • 工作
  • T400升级Intel SSD
  • Java中的时区转换小结
  • 二值图像连通区标记之区域生长法
  • Steven Wang's 2010
  • 微博提醒应用上线
  • 双喜临门

Recent Comments

  • zhoudi:惊诧了,看来你应该和我是同门师兄弟。。。...
  • zhoudi:哇,校友。Wang Shitong的研究...
  • xiaozhang:第37这一行:int jMax = mi...
  • 小张:这一行:int jMax = min(w...
  • 小张:为什么运行出错呢...

Categories

  • Google App Engine(10)
  • 数字图像处理(11)
  • Micolog(7)
  • VPS(6)
  • 围着脖子推(15)
  • 人工神经网络(5)
  • 算法(11)
  • MyLife(16)
  • 媒体检索(4)
  • Others(8)
  • Python(2)

Archives

  • January 2012(1)
  • December 2011(2)
  • May 2011(1)
  • February 2011(1)
  • December 2010(3)
  • November 2010(1)
  • October 2010(1)
  • September 2010(4)
  • August 2010(2)
  • July 2010(5)
  • June 2010(4)
  • May 2010(7)

Blog roll

  • ~Issue
  • Fenng
  • 刘未鹏 | Mind Hacks
  • Grace Hopper
  • 林海听松
  • Yu Zheng
  • Johnny Han
  • xiang_闹闹
  • 静静的安静
  • Herei
  • Dbger
  • land of promise
  • 小龙的SEO学习之路
  • 星星
  • ISHENS|TECH
  • 天天软件园
  • joyone
  • leezhenchong's notes

  • Home
  • About
  • Google Profile
  • Twitter
  • 新浪微博
  • Login
Powered by Google App Engine  |   Designed by WebTreats  |   由 xuming 提供 Micolog程序