这一篇是Xue Bing在一区cybernetics发的论文,里面提出了两个多目标PSO特征选择算法,一个是NSPSO另一个是CMDPSO。其中NSPSO是参考了NSGA2的框架和思想。
该算法简介请转到:
伪代码
具体流程
- ①划分数据集为测试集和训练集
- ②初始化PSO算法
- ③迭代开始
- ④计算两个目标值(论文中是特征数和错误率)
- ⑤非支配排序
- ⑥拥挤距离度量并排序
- ⑥对每个粒子从第一前沿面选择一个粒子作为gbest,更新当前粒子
- ⑦调整粒子群
- ⑧迭代结束返回
MATLAB实现:
NSPSO:
注意其中FSKNN是我的问题的评价函数,包含两个目标值,都存入到pfitness中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
function [solution,time,pop,pfitness,site,LeaderAVE] = NSPSO(train_F,train_L) tic global maxFES dim = size(train_F,2); FES = 1; sizep = 30; pop = rand(sizep,dim); popv = rand(sizep,dim); pfitness = zeros(sizep,2); LeaderAVE = zeros(1,2); while FES <maxFES Off_P = zeros(sizep,dim); Off_V = zeros(sizep,dim); ofitness = zeros(sizep,2); for i=1:sizep [pfitness(i,1),pfitness(i,2)] = FSKNN(pop(i,:),i,train_F,train_L); end Front = NDSort(pfitness(:,1:2),sizep); [~,rank] = sortrows([Front',-CrowdingDistance(pfitness,Front)']); LeaderSet = rank(1:10); solution = pfitness(LeaderSet,:); LeaderAVE(1) = mean(solution(:,1)); LeaderAVE(2) = mean(solution(:,2)); for i = 1:sizep good = LeaderSet(randperm(length(LeaderSet),1)); r1 = rand(1,dim); r2 = rand(1,dim); Off_V(i,:) = r1.*popv(i,:) + r2.*(pop(good,:)-pop(i,:)); Off_P(i,:) = pop(i,:) + Off_V(i,:); end for i=1:sizep [ofitness(i,1),ofitness(i,2)] = FSKNN(Off_P(i,:),i,train_F,train_L); end temppop = [pop;Off_P]; tempv = [popv;Off_V]; tempfiness = [pfitness;ofitness]; [FrontNO,MaxFNO] = NDSort(tempfiness(:,1:2),sizep); Next = false(1,length(FrontNO)); Next(FrontNO<MaxFNO) = true; PopObj = tempfiness; fmax = max(PopObj(FrontNO==1,:),[],1); fmin = min(PopObj(FrontNO==1,:),[],1); PopObj = (PopObj-repmat(fmin,size(PopObj,1),1))./repmat(fmax-fmin,size(PopObj,1),1); % Select the solutions in the last front Last = find(FrontNO==MaxFNO); del = Truncation(PopObj(Last,:),length(Last)-sizep+sum(Next)); Next(Last(~del)) = true; % Population for next generation pop = temppop(Next,:); popv = tempv(Next,:); pfitness = tempfiness(Next,:); fprintf('GEN: %2d Error: %.4f F:%.2f\n',FES,LeaderAVE(1),LeaderAVE(2)); FES = FES + 1; end [FrontNO,~] = NDSort(pfitness(:,1:2),sizep); site = find(FrontNO==1); solution = pfitness(site,:); LeaderAVE(1) = mean(solution(:,1)); LeaderAVE(2) = mean(solution(:,2)); toc time = toc; end |
NDSort.m为非支配排序代码,请转到
拥挤距离代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
function CrowdDis = CrowdingDistance(PopObj,FrontNO) % Calculate the crowding distance of each solution front by front % Copyright 2015-2016 Ye Tian [N,M] = size(PopObj); CrowdDis = zeros(1,N); Fronts = setdiff(unique(FrontNO),inf); for f = 1 : length(Fronts) Front = find(FrontNO==Fronts(f)); Fmax = max(PopObj(Front,:),[],1); Fmin = min(PopObj(Front,:),[],1); for i = 1 : M [~,Rank] = sortrows(PopObj(Front,i)); CrowdDis(Front(Rank(1))) = inf; CrowdDis(Front(Rank(end))) = inf; for j = 2 : length(Front)-1 CrowdDis(Front(Rank(j))) = CrowdDis(Front(Rank(j)))+(PopObj(Front(Rank(j+1)),i)-PopObj(Front(Rank(j-1)),i))/(Fmax(i)-Fmin(i)); end end end end |
Truncation.m代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function Del = Truncation(PopObj,K) % Select part of the solutions by truncation N = size(PopObj,1); %% Truncation Distance = pdist2(PopObj,PopObj); Distance(logical(eye(length(Distance)))) = inf; Del = false(1,N); while sum(Del) < K Remain = find(~Del); Temp = sort(Distance(Remain,Remain),2); [~,Rank] = sortrows(Temp); Del(Remain(Rank(1))) = true; end end |
楼主你好,正在研读薛冰的这篇文章,请问可以发下源码吗感激不尽1261541459@qq.com
你好,由于年代久远,目前这个代码只有当前页面部分了。您可以自学一下MATLAB,写一个main函数就行。
学长,请问NSPSOF和CMDPSO的代码可以发我一份吗?感激不尽!3390751402@qq.com
你好博主,请问NSPSOF和CMDPSO的代码可以发我一份吗?感激不尽!243752644@qq.com
有朋友有NSPSO和CMDPSO代码吗?求!1602863883@qq.com
博主您好,请问可以把NSPSOFS和CMDPSO的代码分享一份给我吗?zhanglx01290122@163.com
博主您好,看了您的文章感觉非常棒。想问能否分享一份NSPSO的代码用于参考学习呢?
邮箱:1393238773@QQ.com,不胜感激
我的文章列表中应该有相关代码
感谢博主的讲解,请问您可以把NSPSOFS和CMDPSO的matlab代码发一份给我吗?非常感谢您 2862627790@qq.com
朋友,你现在有NSPSOF和CMDPSO的代码了吗,有的话可以请你发一份给我吗,不甚感激!3178234375@qq.com
请问如果数据就是一维时间序列,如何确定特征和标签?
博主您好!经常研读您的文章,请问您可以发我一份NSPSOFS和CMDPSO的matlab代码吗?万分感谢!!邮箱是1294416095@qq.com
万分感谢
您好,请问可以发一份代码给我吗谢谢呀
邮箱是809272077@qq.com
博主您好!感谢博主的讲解,请问您可以把NSPSOFS和CMDPSO的代码发一份给我吗?万分感谢1357194677@qq.com
楼主,可以分享一下CMDPSO算法吗?我的邮箱是648092066@qq.com.谢谢了!
你好,请询问1244683773@qq.com
因为时间久远,1244683773@qq.com用户并未保留该代码,谢谢!
初学者冒昧问一下,在运行时都会出现需要输入更多参数,要输入那些参数呢,求指教。
划分好的训练集特征、标签,测试集特征、标签。
请问如果数据就是一维时间序列,如何确定特征和标签?
楼主您好,请问您也可以给我发一份用matlab编写的CMDPSO的算法吗?非常感谢!我的邮箱是1538313116@qq.com。
非常感谢您的慷慨帮助,但是冒昧地请问您有“非支配排序的多目标PSO算法”的另一个算法CMDPSO吗?再次打扰,万分抱歉!
楼主您好,请问您也可以帮我发一份用matlab编写的CMDPSO的算法吗?非常感谢,麻烦你了
邮箱1244683773@qq.com 谢谢
已发送
非常感谢楼主,看到了这篇感到收益匪浅,我想运行一下代码再仔细学习一下,能发一下吗?我的邮箱1442476218@qq.com,保证只做自己学习使用,不做他用,谢谢您了
已发送。
抱歉深夜还来请教您问题。我把评价函数换成ZDT1后,GEN到了4时,Truncation函数发生出错,
错误使用 pdist2 (line 224)
PDIST2 does not accept complex data for built-in distances.
请问为什么会这样呢?
开更号遇到了复数,计算距离的时候要用绝对值。
你好,请问train_F,train_L分别是代表什么?训练集和测试集吗?
train_F:训练集的值
train_L:训练集的标签(类别)
你可以参考这篇:https://www.omegaxyz.com/2019/06/26/divide-dataset/
抱歉深夜还来请教您问题。我把评价函数换成ZDT1后,GEN到了4时,Truncation函数发生出错,
错误使用 pdist2 (line 224)
PDIST2 does not accept complex data for built-in distances.
请问为什么会这样呢?
楼主,您好,能否发一下您推荐的这篇文章,我搜了好久都没有搜索到这篇,只看到了其他,我的邮箱是1637678434@qq.com,谢谢您了
楼主请问FES和sizep的大小是怎么确定的?
楼主您好,我最近也在做NSPSO算法的一个多目标问题,有几个问题想咨询一下,楼主可以加一下联系方式吗?
非常感谢楼主的代码,想问下楼主两个目标(最小化特征数和最小化错误率)评价函数是怎么写的。同一篇论文的CMDPSOFS算法楼主能够实现吗,谢谢
一个特征数直接sum选出的特征,错误率用KNN计算错误率,可以用LOOCV来
另外CMDPSO我有写过的算法,你什么时候要
有 CMDPSO的matlab代码嘛
有的
楼主,请问这个有python的代码嘛???可不可以发一下python代码
没有
为什么这个需要先划分数据集与测试集
划分训练集和测试集,是基本的机器学习模型验证的方法啊
楼主能把数据集与训练集也颇出来吗 希望能够程序能够运行边运行边看理解
这个在我的其他群智能算法里面有划分数据集的算法,你看看关于NSGA2的一些代码,可以自己组装一下
谢谢讲解!