% BP 神经网络用于函数拟合
% 使用平台 - Matlab6.5
%---------------------------------------------------
clc
clear
close all
%---------------------------------------------------
% 产生训练样本与测试样本
P1 = [4885.8 8157 43529.3 708.6 347.57
5523.4 904.7 44265.8 784 376.02
5237.2 10995.5 45648.8 921.6 440.45
6603.5 15750.5 44510.1 1221 532.98
8243.3 20340.9 46661.8 1577.7 574.93
9822.9 22353.7 50453.5 1926.1 700.43
10648.5 23788.4 49417.1 2090.1 766.39
11327.3 24541.9 51229.5 2162 1154.76
12043.1 24519.1 50838.6 2210.3 1085.76
13042.3 24915.8 46217.5 2253.4 1231.54
14051.8 26179.6 45263.7 2366.4 1456.73
15041 27390 45705.8 2475.6 1580.76
16065 29691 43069.5 2622.2 1754.45
] % 训练样本,每一列为一个样本
T1 = [3252
3335
4281
6104
7951
8618
8996
9160
9138
9634
10291
10986
11261
]
% 训练目标
P2 = [19805 36239 46946.9 2936.4 2337.63
22082 39450.9 48402.2 3254.9 2450.31
] % 测试样本,每一列为一个样本
T2 = [11970
12748
] % 测试目标
%---------------------------------------------------
% 归一化
[PN1,minp,maxp,TN1,mint,maxt] = premnmx(P1',T1');
PN2 = tramnmx(P2',minp,maxp);
TN2 = tramnmx(T2',mint,maxt);
%---------------------------------------------------
% 设置网络参数
NodeNum = 20; % 隐层节点数
TypeNum = 1; % 输出维数
TF1 = 'tansig';TF2 = 'purelin'; % 判别函数(缺省值)
%TF1 = 'tansig';TF2 = 'logsig';
%TF1 = 'logsig';TF2 = 'purelin';
%TF1 = 'tansig';TF2 = 'tansig';
%TF1 = 'logsig';TF2 = 'logsig';
%TF1 = 'purelin';TF2 = 'purelin';
net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2});
%---------------------------------------------------
% 指定训练参数
% net.trainFcn = 'traingd'; % 梯度下降算法
% net.trainFcn = 'traingdm'; % 动量梯度下降算法
%
% net.trainFcn = 'traingda'; % 变学习率梯度下降算法
% net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法
%
% (大型网络的首选算法)
% net.trainFcn = 'trainrp'; % RPROP(弹性BP)算法,内存需求最小
%
% 共轭梯度算法
% net.trainFcn = 'traincgf'; % Fletcher-Reeves修正算法
% net.trainFcn = 'traincgp'; % Polak-Ribiere修正算法,内存需求比Fletcher-Reeves修正算法略大
% net.trainFcn = 'traincgb'; % Powell-Beal复位算法,内存需求比Polak-Ribiere修正算法略大
% (大型网络的首选算法)
%net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多
%
% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快
% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比BFGS算法小,比共轭梯度算法略大
%
% (中型网络的首选算法)
net.trainFcn = 'trainlm'; % Levenberg-Marquardt算法,内存需求最大,收敛速度最快
%
% net.trainFcn = 'trainbr'; % 贝叶斯正则化算法
%
% 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm'
%---------------------%
net.trainParam.show = 20; % 训练显示间隔
net.trainParam.lr = 0.3; % 学习步长 - traingd,traingdm
net.trainParam.mc = 0.95; % 动量项系数 - traingdm,traingdx
net.trainParam.mem_reduc = 1; % 分块计算Hessian矩阵(仅对Levenberg-Marquardt算法有效)
net.trainParam.epochs = 1000; % 最大训练次数
net.trainParam.goal = 1e-8; % 最小均方误差
net.trainParam.min_grad = 1e-20; % 最小梯度
net.trainParam.time = inf; % 最大训练时间
%---------------------------------------------------
% 训练
net = train(net,PN1,TN1); % 训练
%---------------------------------------------------
% 测试
YN1 = sim(net,PN1); % 训练样本实际输出
YN2 = sim(net,PN2); % 测试样本实际输出
MSE1 = mean((TN1-YN1).^2) % 训练均方误差
MSE2 = mean((TN2-YN2).^2) % 测试均方误差
%---------------------------------------------------
% 反归一化
Y2 = postmnmx(YN2,mint,maxt);
%---------------------------------------------------
% 结果作图
plot(1:length(T2),T2,'r+:',1:length(Y2),Y2,'bo:')
title('+为真实值,o为预测值')
由于对神经网络不甚了解, 我是单从程序能运行的角度调整的代码(只是添加了几个转置). 上述代码在Matlab R2014a中运行通过.