这个BP网络误差怎么这么大,怎么也达不到精度

2019-07-17 14:26发布

clear;
clc;
P=[0.501 0.504 0.489;0.601 0.554 0.489;0.601 0.653 0.49;0.702 0.803 0.551;0.702 0.903 0.652;0.852 1.003 0.652;0.852 1.073 0.752;0.952 1.103 0.752;0.952 1.233 0.802;1.052 1.252 0.802;1.151 1.357 0.802;1.151 1.613 1.001;1.301 1.702 1.001;1.301 1.872 1.101;1.451 2.082 1.101;1.451 2.052 1.251;1.652 2.142 1.251;1.652 2.252 1.401;1.851 2.312 1.401;1.851 2.401 1.551;2.051 2.504 1.551;2.051 2.702 1.8;2.201 2.832 1.8;2.201 2.952 1.951;2.301 3.051 1.951;2.301 3.201 2.151;2.501 3.251 2.151;2.7 3.501 2.301;2.951 3.501 2.301;2.951 3.8 2.901;3.201 3.8 2.901;3.4 4.151 3.3;3.75 4.4 4.1;4.45 4.4 4.1;]';
T=[0 0;50 0;50 5;100 10;100 15;150 15;150 20;200 20;200 25;250 25;300 25;300 35;350 35;350 40;400 40;400 45;450 45;450 50;500 50;500 55;550 55;550 65;600 65;600 70;650 70;650 75;700 75;750 80;800 80;800 85;850 85;900 90;950 100;1000 100;]';
net=newff(minmax(P),[5,2],{'tansig' 'purelin'},'trainscg');
net.trainParam.epochs=20000;
net.trainParam.goal=1;
net.trainParam.min_grad=0.1;
net.trainParam.show=200;
net.trainParam.time=inf;
net=train(net,P,T);
Y=sim(net,P);
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
千年未按
1楼-- · 2019-07-17 17:19
clear;
clc;
P=[0.501 0.504 0.489;0.601 0.554 0.489;0.601 0.653 0.49;0.702 0.803 0.551;0.702 0.903 0.652;0.852 1.003 0.652;0.852 1.073 0.752;0.952 1.103 0.752;0.952 1.233 0.802;1.052 1.252 0.802;1.151 1.357 0.802;1.151 1.613 1.001;1.301 1.702 1.001;1.301 1.872 1.101;1.451 2.082 1.101;1.451 2.052 1.251;1.652 2.142 1.251;1.652 2.252 1.401;1.851 2.312 1.401;1.851 2.401 1.551;2.051 2.504 1.551;2.051 2.702 1.8;2.201 2.832 1.8;2.201 2.952 1.951;2.301 3.051 1.951;2.301 3.201 2.151;2.501 3.251 2.151;2.7 3.501 2.301;2.951 3.501 2.301;2.951 3.8 2.901;3.201 3.8 2.901;3.4 4.151 3.3;3.75 4.4 4.1;4.45 4.4 4.1;]';
T=[0 0;50 0;50 5;100 10;100 15;150 15;150 20;200 20;200 25;250 25;300 25;300 35;350 35;350 40;400 40;400 45;450 45;450 50;500 50;500 55;550 55;550 65;600 65;600 70;650 70;650 75;700 75;750 80;800 80;800 85;850 85;900 90;950 100;1000 100;]';

A=length(P);
B=length(T);

K=randperm(34);

input_train=P(:,K(1:20));
output_train=T(:,K(1:20));
input_test=P(:,K(21:34));
output_test=T(:,K(21:34));

%归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%初始化
net=newff(minmax(input_train),[5,2],{'tansig' 'purelin'},'trainscg');
net.trainParam.epochs=20000;
net.trainParam.goal=0.00001;
net.trainParam.lr=0.01;
net.trainParam.show=200;
%训练
net=train(net,inputn,outputn);

%测试数据归一化
input_test=mapminmax('apply',input_test,inputps);

%仿真
Y=sim(net,input_test);

%反归一化
BPoutput=mapminmax('reverse',Y,outputps);

figure(1)
plot(BPoutput(1,:),'-*');
hold on
plot(output_test(1,:),'-og');

figure(2)
plot(BPoutput(2,:),'-*');
hold on
plot(output_test(2,:),'-og');

for i=1:length(output_test)
error1(i)=(output_test(1,1:i)-BPoutput(1,1:i))/output_test(1,1:i);
end

for i=1:length(output_test)
error2(i)=(output_test(2,1:i)-BPoutput(2,1:i))/output_test(2,1:i);
end

fprintf('误差百分比:');
100*error1
100*error2
千年未按
2楼-- · 2019-07-17 18:47
我不明白你的数据是什么意思,似乎是拿P,输出T。但是你好像没有设置训练数据和检验数据,我就从你的数据随便提取了20组做训练,14组做检验。第一个变量输出在误差在1%以内,第二个在3%以内,拟合还是非常不错的。
千年未按
3楼-- · 2019-07-17 23:21
 精彩回答 2  元偷偷看……
千年未按
4楼-- · 2019-07-18 00:18
不知道怎样发图片,总之执行程序就知道了

一周热门 更多>