文章目录

  • 前言
  • 一、粒子群算法学习过程
  • 二、特征选择实战
    • 1.数据集以及matlab源码
    • 2.参数说明
    • 3.实验结果
  • 总结

前言

PSO算法是一种群智能优化算法,特点是布置速度快,收敛性强。同时面对着两大问题,容易早熟和容易陷入局部最优。对于特征选择这类离散型问题,我们使用二进制版本的BPSO进行优化。在PSO的迭代过程中,每个粒子都会向种群历史最优解(Gbest)和粒子本身历史最优解(Pbest)进行学习,同时也会不断地更新Gbest与Pbest,最后会收敛在Gbest与Pbest之间的某个区域。
注意:(Gbest只有一个,所有粒子都会向它学习,而Pbest对于每个粒子都有一个,只属于它们自己,它们只会向自己的Pbest进行学习,这样说应该大家都能听懂了)

一、粒子群算法学习过程

对于特征选择问题是这样描述的,现实中由于采样不均匀导致某些采样偏离了真实的分布,所以这部分特征反而会对数据的利用造成负面影响,那么特征选择的目的就是找出这些错误的特征和冗余的特征。
那么我们定义一个1*N维的0-1向量,每一位都只能是0或者1,0代表不用这一维特征,1代表选用这一维
特征。
那么BPSO是怎么进行学习的呢?公式如下:

先看到第一个公式: 代表着粒子的速度更新公式,粒子在每一维都有一个速度值(前面我们已经提到了数据有很多维特征),那么每一维都要进行更新。其中ω(t)\omega(t)ω(t)代表着当前迭代次数的惯性系数,也就是说继承来自上次迭代速度的比重,写一篇博客好难啊啊啊啊,继续,另外加上的两项呢,分别是与Pbest和Gbest位置的差异,这里非常重要!!!,如果不好好理解,就弄不明白了。位置的差异通过两个系数c1,c2和两个[0,1]随机数r1,r2 相乘,学习系数的作用是加大向Pbest和Gbest靠拢的可能性,而随机数r1,r2的作用是也是一种精髓,启发式随机搜索的精髓,用它,肯定好,为什么?谁也说不清,不用它,鲁棒性真的会变差。


下面举个例子,
粒子 [0 0 1 1 0 1 0 1]
gbest [1 0 1 0 0 0 1 1]
pbest [0 0 1 0 0 1 0 1]

先看第1维,我们现在要更新速度,发现


这两个公式上面公式是0,下面公式是1,对吧,忽略前面的[0,1]随机数系数(期望值0.5)那么加起来对速度的提升我们就假设为 1
现在看第6维,变成了上面公式是-1,下面公式是0,对速度的提升是-1,
由此我们发现,对于一个粒子如果它的Pbest和Gbest的某个维度位置不一致,那么它获得速度的期望大概是-1。
好,再看第2维,上面公式是0,下面公式也是0,粒子没有获得速度提升,那么之后会怎么样呢?变成了这样

也就是说如果惯性系数小于1,那么速度值越来越小了,大于1则越来越大。

再看到第二个公式: 这就是一个sigmoid函数,没想到吧,这里也会碰见神经网络这哥们,为什么用它?其他函数行嘛?当然可以,S型函数大家族那么多,你挑一挑其他杀马特(非主流)函数也行。大家都用sigmoid,这里就照搬了。

再看到第三个公式:重点来了


如果sigmoid的返回值大于[0,1]随机数(期望0.5),就把这个维度置为1,否则为1.注意这里不是取反,而是单纯的大于随机数置1,小于随机数置0,千万不要记成取反了(我以前就这样做)
我们再来复习一下sigmoid

那么为什么公式3有效呢?速度大就置为1,速度小就置为0,合理吗?
我总结一下:
Pbest与Gbest为1,粒子为0,位置差异为正,那么速度就大,此时粒子变为1的概率也越大,即完成了学习行为(向Pbest与Gbest靠拢了)
Pbest与Gbest为0,粒子为1,位置差异为负,那么速度就小,此时粒子变为0的概率也越大,即完成了学习行为(向Pbest与Gbest靠拢了)

好好理解上述话语,即理解了BPSO粒子速度与位置更新的含义,网上有很多人说什么以概率表示巴拉巴拉,其实并不好理解,只是想当然得觉得很对。

二、特征选择实战

1.数据集以及matlab源码

用一个数据集Wine(178instance,13features and 3 classes,数据集下载链接和分类器ELM(没别的就是快,下载链接)进行实验。

先把BPSO源码贴出来再对BPSO算法参数进行一下说明:

代码如下(示例):

%% BinaryPSO
function [globalbest_x,globalbest_faval] = PSO(gN)
E0=0.999;                        %允许误差
MaxNum=160;                      %粒子最大迭代次数
particlesize=30;                 %粒子群规模
c1=2;                            %每个粒子的个体学习因子,也称为加速常数
c2=2;                            %每个粒子的社会学习因子,也称为加速常数
w=0.6;                           %惯性因子
vmax=2;                          %粒子的最大飞翔速度
vmin=-vmax;x = round(rand(particlesize,gN));% 初始化粒子位置
v = 4*rand(particlesize,gN)-2;   % 初始化粒子速度f = zeros(particlesize,1);       % 初始化适应度函数
for i=1:particlesizef(i) = ELMResult(gN);
endpersonalbest_x=x;%记录粒子最佳位置
personalbest_faval=f;%记录粒子最佳适应度函数值
[globalbest_faval,i]=max(personalbest_faval);%记录种群最佳适应度函数值
globalbest_x=personalbest_x(i,:);%记录种群最佳位置k=1;  %开始迭代
while k<=MaxNumparfor i=1:particlesizef(i) = ELMResult(x(i,:));if f(i)>personalbest_faval(i) %判断当前位置是否是历史上最佳位置personalbest_faval(i)=f(i);personalbest_x(i,:)=x(i,:);endendif max(personalbest_faval)>globalbest_faval[globalbest_faval,i]=max(personalbest_faval);globalbest_x=personalbest_x(i,:);end% 更新方法,这部分也可以用矩阵完成,我故意贴一个很笨的更新方法,自己动手完成吧!for i=1:particlesize %更新粒子群里每个个体的最新位置v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))...+c2*rand*(globalbest_x-x(i,:));for j=1:gN    %速度阈值判断及更新粒子的位置if v(i,j)>vmaxv(i,j)=vmax;elseif v(i,j)<vminv(i,j)=vmin;endif Sigmoid(v(i,j))>rand()x(i,j) = 1;elsex(i,j) = 0;endendend  if abs(globalbest_faval)>E0,break,endk=k+1;
end
end

2.参数说明

MaxNum=160; %粒子最大迭代次数
代表粒子群算法的迭代次数,迭代次数越多当然效果越好啦,就是计算时间就上去了。

particlesize=30; %粒子群规模
种群规模一般不取太大了,30-100都可以把,个人调试一般取30或者40,其实特征维度稍微大一点比如100维,你多少个粒子塞进去,都影响不大了,还是要更快的看见种群之间的迭代差异以方便调参,把种群调小一点。

重点来了!!!!!

c1=2; %每个粒子的个体学习因子,也称为加速常数
c2=2; %每个粒子的社会学习因子,也称为加速常数

这两个参数分别决定着粒子想Gbest和Pbest的学习概率,一般来说设成c1=2,c2=2,建议不要乱改,改下面两个参数。

w=0.6; %惯性因子
很多说惯性因子,当然重要啊,重要极了,惯性因子越大,向Pbest与Gbest收敛的速度就越慢。当然,还有一种随着迭代次数慢慢减小的惯性因子:

wmax = 2;  wmin = 0.1;
w = wmax - (wmax-wmin)*k/MaxNum;

k为当前迭代次数,MaxNum为最大迭代次数, respectively.

vmax=2; %粒子的最大速度
vmin=-vmax;

速度最好要对称呀!,关于0对称,当然不对称也是可以的,反正你拿着速度值域去看看sigmoid函数输出是多少你大概就懂了,比如你取[0,2]就很容易向Pbest与Gbest学习靠拢,很快啊,没有防出去,陷入局部最优了。比如你取[-2,0],那么粒子就会向按位取反的Gbest与Pbest中间取收敛。实际上,V就可以看成奔向Pbest与Gbest的速度嘛,太大了,容易很快陷入局部最优,建议极小值[-3,-1],极大值[1,3]。一定要进行速度限制,不然惯性系数大于1或者小于1的话,分别就会垂直起飞与垂直降落,直接玩完。

3.实验结果

为了验证特征选择的有效性,我们先用ELM分类器对Wine数据集采用10-fold直接分类10000次(不要问为什么这么嚣张,问就是ELM快,i7-10700八核全开),ELM两个参数为(100隐藏层神经元,sig激活函数),你猜猜一万次运行多久?如图:

平均运行时间:27/10000 = 0.0027秒,千分之三秒就分类完一次了,我们分别获得了BestResult=98.24%accuracy,和AvgResult=95.64%acc.
那么我们开启特征选择!
好家伙,就在我摁下去运行按钮的一瞬间代码已经终止了…

因为实际上我还有一个自动调整隐藏层神经元数量的模块防止过拟合,那么迭代两代就找到了一个100%acc的解,它并没有做特征选择,只是把隐藏层神经元数量改为了从100改为131,之前应该是神经元数量太少欠拟合了。那么我们将神经元数量改为131,再来10000次ELM分类看看这个调整是否有效:

因为ELM带有一定的随机性,所以选出来的解运行一次的话不一定更好,但是多次运行肯定是更好的,也就是平均结果。
如上图,万次结果最佳的为100%,与之前一致,平均结果98.82%>95.64%,也有了很大的提升。

啊这,不是说好的特征选择,怎么变成调参了,好我们重新来一次:

可以看到第3次迭代acc已经为1了,选出了两个没用的特征,那么我们将这个特征向量再去做万次ELM,看看平均性能如何。。。。

可以看到,实验了一个很基础,简单的UCI(写这篇的时候服务器抽筋了进不去,所以给了KEEl网址) dataset使用BPSO求解的特征向量选择特征去做ELM分类,万次最优acc为1,Avgacc为99.14%,远高于之前的95.64%。
Wine 完结,撒花!


总结

提示:由于源码涉及到机器学习内容,从数据导入,划分数据集,定义K-fold,定义适应度函数等多个文件,所以没有一一贴出来,需要完整源码可以私聊。

Binary Particle Swarm Optimization(BPSO) for Feature Selection(二进制粒子群求解特征选择)相关推荐

  1. 2018/8/30-31 A social learning particle swarm optimization for scalable optimization.

    信息:  2015年    Informatica science 题目: A social learning particle swarm optimization for  scalable op ...

  2. 【控制】粒子群优化(PSO,Particle Swarm Optimization)算法及 Matlab 仿真实现

    文章目录 定义 对比模拟捕食 通俗解释 粒子抽象 关于速度和位置 速度和位置的更新 标准PSO算法流程 标准PSO算法的流程 PSO流程图解 学习因子 c1.c2c_1.c_2c1​.c2​ 分析 仿 ...

  3. 文献记录(part37)--A two-stage hybrid ant colony optimization for high-dimensional feature selection

    学习笔记,仅供参考,有错必纠 关键词:特征选择:蚁群优化:高维数据:分类:最佳特征子集大小 随便看看 文章目录 A two-stage hybrid ant colony optimization f ...

  4. 粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解

    01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 ...

  5. 粒子群算法 PSO(Particle Swarm Optimization)——原理及实现

    文章目录 1. 粒子群算法的概念 2. 粒子群算法分析 3. PSO算法的流程和伪代码 4. PSO算法举例 5. PSO算法的matlab实现 1. 粒子群算法的概念 粒子群优化算法(PSO:Par ...

  6. Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战

    Particle Swarm Optimization 粒子群算法(PSO算法) 定义 粒子群算法,又称粒子群优化算法(Particle Swarm Optimization),缩写为 PSO, 是近 ...

  7. 【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解...

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由E ...

  8. Robot path planning in uncertain environment using multi-objective particle swarm optimization

    这是一篇2013年的文章,不确定环境下的多目标粒子群路径规划 10.1016/j.neucom.2012.09.019 Keywords:Robot path planning. Particle s ...

  9. 一文搞懂什么是粒子群优化算法(Particle Swarm Optimization,PSO)【附应用举例】

    Python代码链接放文末. 本文参考了很多张军老师<计算智能>的第六章知识. 本文来源:https://blog.csdn.net/qq_44186838/article/details ...

最新文章

  1. python中数据类型为list_python_数据类型_list
  2. 2018.09.24-2018.09.30
  3. 4计算准确率_PyTorch实现,GitHub 4000星:这是微软开源的计算机视觉库
  4. ivar layout 相关知识点
  5. Angular 自动编译部署 Tomcat Jboss
  6. h5侠客行服务器维护有更新什么,《侠客行》1月22日版本更新说明
  7. mac / Ubuntu 终端下添加tree命令显示文件目录结构
  8. log4j 配置文件路径问题
  9. git gui 中文乱码解决方法
  10. [每日一氵]Latex 的通讯作者怎么搞
  11. 网络性能应用检测系统
  12. GitHub上的AutoML
  13. python word,ppt,excel转pdf(word转html),转图片
  14. [2015 Springer] Local Image Descriptor: Modern Approaches——3 Intensity Order-Based Local Descriptors
  15. 好看的桑基图是如何炼成的!
  16. 数字角频率和模拟角频率和物理频率和归一化角频率的关系,及FFT频率和实际物理频率的关系分析
  17. 生活污水磷超标,磷化工行业磷超标,各种磷超标的深度治理
  18. android 自动恢复,Android的状态保存和恢复
  19. 【今日头条】【实习】放出一大波职位
  20. ubuntu安装gitlab

热门文章

  1. Python 生成个性二维码
  2. null和空字符串('')的区别
  3. python 连通区域_二值图像连通区域标记
  4. 中国全谱系动车组图解
  5. 大数据时代如何使用数据分析来找女朋友?
  6. 连接Oracle时报错ora-01034与ORA-27101
  7. Python CSV Reader/Writer
  8. 建设“智慧城市”、“智慧社区”远程控制开关智能微型断路器哪家好?——安科瑞 严新亚
  9. 根据血象化验单判断感冒类型
  10. html5手机拍照上传