查看: 132|回复: 1|关注: 0

[已解决] 关于隐含层阀值个数的确定和索引超出矩阵维度的错误处理,请求帮助!

[复制链接]

新手

7 麦片

财富积分


050


3

主题

6

帖子

0

最佳答案
本人萌新,各位大佬们好,想通过pso对bp神经网络进行优化,但是对于程序里的inputnum=?;hiddennum=?;
outputnum=?;

这三个参数的确定,不知道该怎么设置,导致运行中一直出现:
索引超出矩阵维度。


出错 pso_youhua (line 21)
input_test=input(85:102,:)'; %输入预测数据,后18个输入数据;

编码如下:
clc
clear

% %读取数据
% load data input output

% load data input output
input= xlsread('经济性指标用到的参数.xlsx','sheet1','A3:B102,D3:D102,F3:G102');  %读取excel里面的输入数据
output= xlsread('经济性指标用到的参数.xlsx','sheet1','H3:H102');  %读取excel里面的输出数据


%节点个数
inputnum=5;
hiddennum=21;
outputnum=1;

%训练数据和预测数据
input_train=input(3:84,:)'; %输入训练数据,前82行作为输入数据
input_test=input(85:102,:)'; %输入预测数据,后18个输入数据
output_train=output(3:84)'; %输出训练数据,前82个输出数据
output_test=output(85:102)'; %输出预测数据,后18个输出数据


%选连样本输入输出数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);

%构建网络
net=newff(inputn,outputn,hiddennum);

% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;

maxgen=20;   % 进化次数  
sizepop=20;   %种群规模

Vmax=1;
Vmin=-1;
popmax=5;
popmin=-5;

for i=1:sizepop
    pop(i,:)=5*rands(1,21);
    V(i,:)=rands(1,21);
    fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
end


% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:);   %全局最佳
gbest=pop;    %个体最佳
fitnessgbest=fitness;   %个体最佳适应度值
fitnesszbest=bestfitness;   %全局最佳适应度值

%% 迭代寻优
for i=1:maxgen
    i

    for j=1:sizepop

        %速度更新
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
        V(j,find(V(j,:)>Vmax))=Vmax;
        V(j,find(V(j,:)<Vmin))=Vmin;

        %种群更新
        pop(j,:)=pop(j,:)+0.2*V(j,:);
        pop(j,find(pop(j,:)>popmax))=popmax;
        pop(j,find(pop(j,:)<popmin))=popmin;

        %自适应变异
        pos=unidrnd(21);
        if rand>0.95
            pop(j,pos)=5*rands(1,1);
        end

        %适应度值
        fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,inputn,outputn);
    end

    for j=1:sizepop
    %个体最优更新
    if fitness(j) < fitnessgbest(j)
        gbest(j,:) = pop(j,:);
        fitnessgbest(j) = fitness(j);
    end

    %群体最优更新
    if fitness(j) < fitnesszbest
        zbest = pop(j,:);
        fitnesszbest = fitness(j);
    end

    end

    yy(i)=fitnesszbest;   

end

%% 结果分析
plot(yy)
title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');

x=zbest;
%% 把最优初始阀值权值赋予网络预测
% %用遗传算法优化的BP网络进行值预测
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;

%% BP网络训练
%网络进化参数
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
%net.trainParam.goal=0.00001;

%网络训练
[net,per2]=train(net,inputn,outputn);

%% BP网络预测
%数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
an=sim(net,inputn_test);
test_simu=mapminmax('reverse',an,outputps);
error=test_simu-output_test;
% figure(2)
% plot(error)


%%结果分析
figure(2)
plot(test_simu,':og')
hold on
plot(output_test,'-*');
title('BP神经网络预测输出值与目标值');
ylabel('仿真输出','fontsize',12);
xlabel('样本','fontsize',12);

figure(3)
subplot(2,1,1)
plot(error,'-*')
title('绝对误差');
ylabel('绝对误差','fontsize',12);
xlabel('样本','fontsize',12);

subplot(2,1,2)
plot((output_test-test_simu)./test_simu*100,'-*')
title('相对误差');
ylabel('误差百分比','fontsize',12);
xlabel('样本','fontsize',12);


关于附件和数据内容,我也会上传上去,如有大佬看到了,请指教,谢谢!

pso_youhua.m

3.64 KB, 下载次数: 1

经济性指标用到的参数.xlsx

16.32 KB, 下载次数: 1

MATLAB 基础讨论
版块优秀回答者

中级

616 麦片

财富积分


5001500


0

主题

273

帖子

46

最佳答案
  • 关注者: 7
发表于 3 天前 | 显示全部楼层 |此回复为最佳答案
数据样本是100*2的矩阵,所以input_test=input(85:102,:)'; %输入预测数据,后18个输入数据和output_test=output(85:102)'; %输出预测数据,后18个输出数据索引到101行报错,将102改为100即可修改索引错误
至于节点设置
inputnum与特征值数量相等
outputnum取决于定义的标签编码规则,或者预测的节点数
可以参照CSDN博客,如图
微信图片_20191202103807.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表