starbinbin_csu 发表于 2010-9-11 21:54:46

BP网络的训练误差小但是预测误差大

本帖最后由 starbinbin_csu 于 2010-9-11 21:57 编辑

首先一段BP做函数拟合代码如下:function BP()
%% 数据处理
    clear;clc
    load 平头圆柱体数据 ;
    input=;
    output=;
    k=rand(1,152);
    =sort(k);
    input_train=input(n(1:100),:)';
    output_train=output(n(1:100),:)';
    input_test=input(n(101:152),:)';
    output_test=output(n(101:152),:)';
   
    %训练数据归一化
    =mapminmax(input_train);
    =mapminmax(output_train);

%% BP神经网络的构建与训练
% %初始化网络结构
net=newff(inputn,outputn,5);

net.trainParam.epochs=1000;
net.trainParam.lr=0.1;
net.trainParam.goal=0.01;

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

%% BP网络预测
%预测数据归一化
inputn_test=mapminmax('apply',input_test,inputps);

%网络预测输出
an=sim(net,inputn_test);

%网络输出反归一化
BPoutput=mapminmax('reverse',an,outputps);

%% 结果分析

figure(1)
plot(BPoutput,':og')
hold on
plot(output_test,'-*');
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
%预测误差
error=BPoutput-output_test;


figure(2)
plot(error,'-*')
title('BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)

figure(3)
plot((output_test-BPoutput)./BPoutput,'-*');
title('神经网络预测误差百分比')

errorsum=sum(abs(error))
end有兴趣的可以运行一下,为什么预测误差这么大啊?有什么办法可以减小误差吗?相关数据如下:

ZanDZ 发表于 2010-9-12 08:26:03

我以前也碰到过这样的情况,神经网络的泛化能力很差。调了好长时间也没什么改善,:'(

feynmand 发表于 2010-9-12 16:24:36

今年的数学建模竞赛题目?
如果是的话我想这个题目使用神经网络还是不太合适,预测结果误差大我想是因为输入和输出的关系和神经网络内部结构并不类似。如果不是这个题目,那么就拉倒算我没说。

qibbxxt 发表于 2010-9-12 16:39:35

我觉得可能是泛化能力太弱的问题
另一方面,一般的外插效果都不好,所以你确定是不是外插

starbinbin_csu 发表于 2010-9-12 17:04:35

本帖最后由 starbinbin_csu 于 2010-9-12 17:05 编辑

3# feynmand
确实是今年的数模题目。。。
这些是实验数据,后来发现有两组训练数据取错了(顺序反了),使得整体的数据没有什么特点了,后来将数据改过来了,误差就在理想范围内了~~

feynmand 发表于 2010-9-12 19:02:00

为什么没有用积分直接计算?

我想到过另一个办法,蒙特卡罗,就像用蒙特卡罗算圆周率那样算。

starbinbin_csu 发表于 2010-9-12 21:57:42

6# feynmand
我是用积分进行计算,在计算验证的时候发现与实际数据存在一定的误差,说明容器不是严格的圆柱体(当然还有其他因素),然后用BP网络对标定数据进行修正,使其更为接近实际值
页: [1]
查看完整版本: BP网络的训练误差小但是预测误差大