训练样本定义如下:
输入矢量为
p =[-1 -2 3 1
-1 1 5 -3]
目标矢量为 t = [-1 -1 1 1]
解:本例的 MATLAB 程序如下:
close all
clear
echo on
clc
% NEWFF——生成一个新的前向神经网络
% TRAIN——对 BP 神经网络进行训练
% SIM——对 BP 神经网络进行仿真
pause
% 敲任意键开始
clc
% 定义训练样本
% P 为输入矢量
P=[-1, -2, 3, 1; -1, 1, 5, -3];
% T 为目标矢量
T=[-1, -1, 1, 1];
pause;
clc
% 创建一个新的前向神经网络
net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm')
% 当前输入层权值和阈值
inputWeights=net.IW{1,1}
inputbias=net.b{1}
% 当前网络层权值和阈值
layerWeights=net.LW{2,1}
layerbias=net.b{2}
pause
clc
% 设置训练参数
net.trainParam.show = 50;
net.trainParam.lr = 0.05;
net.trainParam.mc = 0.9;
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
pause
clc
% 调用 TRAINGDM 算法训练 BP 网络
[net,tr]=train(net,P,T);
pause
clc
% 对 BP 网络进行仿真
A = sim(net,P)
% 计算仿真误差
E = T - A
MSE=mse(E)
pause
clc
echo off
例2 采用贝叶斯正则化算法提高 BP 网络的推广能力。在本例中,我们采用两种训练方法,即 L-M 优化算法(trainlm)和贝叶斯正则化算法(trainbr),用以训练 BP 网络,使其能够拟合某一附加有白噪声的正弦样本数据。其中,样本数据可以采用如下MATLAB 语句生成:
输入矢量:P = [-1:0.05:1];
目标矢量:randn(’seed’,78341223);
T = sin(2*pi*P)+0.1*randn(size(P));
解:本例的 MATLAB 程序如下:
close all
clear
echo on
clc
% NEWFF——生成一个新的前向神经网络
% TRAIN——对 BP 神经网络进行训练
% SIM——对 BP 神经网络进行仿真
pause
% 敲任意键开始
clc
% 定义训练样本矢量
% P 为输入矢量
P = [-1:0.05:1];
% T 为目标矢量
randn('seed',78341223); T = sin(2*pi*P)+0.1*randn(size(P));
% 绘制样本数据点
plot(P,T,'+');
echo off
hold on;
plot(P,sin(2*pi*P),':');
% 绘制不含噪声的正弦曲线
echo on
clc
pause
clc
% 创建一个新的前向神经网络
net=newff(minmax(P),[20,1],{'tansig','purelin'});
pause
clc
echo off
clc
disp('1. L-M 优化算法 TRAINLM'); disp('2. 贝叶斯正则化算法 TRAINBR');
choice=input('请选择训练算法(1,2):');
figure(gcf);
if(choice==1)
echo on
clc
% 采用 L-M 优化算法 TRAINLM
net.trainFcn='trainlm';
pause
clc
% 设置训练参数
net.trainParam.epochs = 500;
net.trainParam.goal = 1e-6;
net=init(net);
% 重新初始化
pause
clc
elseif(choice==2)
echo on
clc
% 采用贝叶斯正则化算法 TRAINBR
net.trainFcn='trainbr';
pause
clc
% 设置训练参数
net.trainParam.epochs = 500;
randn('seed',192736547);
net = init(net);
% 重新初始化
pause
clc
end
% 调用相应算法训练 BP 网络
[net,tr]=train(net,P,T);
pause
clc
% 对 BP 网络进行仿真
A = sim(net,P);
% 计算仿真误差
E = T - A;
MSE=mse(E)
pause
clc
% 绘制匹配结果曲线
close all;
plot(P,A,P,T,'+',P,sin(2*pi*P),':');
pause;
clc
echo off
通过采用两种不同的训练算法,我们可以得到如图 1和图 2所示的两种拟合结果。图中的实线表示拟合曲线,虚线代表不含白噪声的正弦曲线,“+”点为含有白噪声的正弦样本数据点。显然,经 trainlm 函数训练后的神经网络对样本数据点实现了“过度匹配”,而经 trainbr 函数训练的神经网络对噪声不敏感,具有较好的推广能力。
值得指出的是,在利用 trainbr 函数训练 BP 网络时,若训练结果收敛,通常会给出提示信息“Maximum MU reached”。此外,用户还可以根据 SSE 和 SSW 的大小变化情况来判断训练是否收敛:当 SSE 和 SSW 的值在经过若干步迭代后处于恒值时,则通常说明网络训练收敛,此时可以停止训练。观察trainbr 函数训练 BP 网络的误差变化曲线,可见,当训练迭代至 320 步时,网络训练收敛,此时 SSE 和 SSW 均为恒值,当前有效网络的参数(有效权值和阈值)个数为 11.7973。
例3 采用“提前停止”方法提高 BP 网络的推广能力。对于和例 2相同的问题,在本例中我们将采用训练函数 traingdx 和“提前停止”相结合的方法来训练 BP 网络,以提高 BP 网络的推广能力。
解:在利用“提前停止”方法时,首先应分别定义训练样本、验证样本或测试样本,其中,验证样本是必不可少的。在本例中,我们只定义并使用验证样本,即有
验证样本输入矢量:val.P = [-0.975:.05:0.975]
验证样本目标矢量:val.T = sin(2*pi*val.P)+0.1*randn(size(val.P))
值得注意的是,尽管“提前停止”方法可以和任何一种 BP 网络训练函数一起使用,但是不适合同训练速度过快的算法联合使用,比如 trainlm 函数,所以本例中我们采用训练速度相对较慢的变学习速率算法 traingdx 函数作为训练函数。
本例的 MATLAB 程序如下:
close all
clear
echo on
clc
% NEWFF——生成一个新的前向神经网络
% TRAIN——对 BP 神经网络进行训练
% SIM——对 BP 神经网络进行仿真
pause
% 敲任意键开始
clc
% 定义训练样本矢量
% P 为输入矢量
P = [-1:0.05:1];
% T 为目标矢量
randn('seed',78341223);
T = sin(2*pi*P)+0.1*randn(size(P));
% 绘制训练样本数据点
plot(P,T,'+');
echo off
hold on;
plot(P,sin(2*pi*P),':'); % 绘制不含噪声的正弦曲线
echo on
clc
pause
clc
% 定义验证样本
val.P = [-0.975:0.05:0.975]; % 验证样本的输入矢量
val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)); % 验证样本的目标矢量
pause
clc
% 创建一个新的前向神经网络
net=newff(minmax(P),[5,1],{'tansig','purelin'},'traingdx');
pause
clc
% 设置训练参数
net.trainParam.epochs = 500;
net = init(net);
pause
clc
% 训练 BP 网络
[net,tr]=train(net,P,T,[],[],val);
pause
clc
% 对 BP 网络进行仿真
A = sim(net,P);
% 计算仿真误差
E = T - A;
MSE=mse(E)
pause
clc
% 绘制仿真拟合结果曲线
close all;
plot(P,A,P,T,'+',P,sin(2*pi*P),':');
pause;
clc
echo off
下面给出了网络的某次训练结果,可见,当训练至第 136 步时,训练提前停止,此时的网络误差为 0.0102565。给出了训练后的仿真数据拟合曲线,效果是相当满意的。
[net,tr]=train(net,P,T,[],[],val);
TRAINGDX, Epoch 0/500, MSE 0.5047/0, Gradient 2.1201/1e-006
TRAINGDX, Epoch 25/500, MSE 0.163593/0, Gradient 0.384793/1e-006
TRAINGDX, Epoch 50/500, MSE 0.130259/0, Gradient 0.158209/1e-006
TRAINGDX, Epoch 75/500, MSE 0.086869/0, Gradient 0.0883479/1e-006
TRAINGDX, Epoch 100/500, MSE 0.0492511/0, Gradient 0.03874/1e-006
TRAINGDX, Epoch 125/500, MSE 0.0110016/0, Gradient 0.017242/1e-006
TRAINGDX, Epoch 136/500, MSE 0.0102565/0, Gradient 0.01203/1e-006
TRAINGDX, Validation stop.
例3 用BP网络估计胆固醇含量
这是一个将神经网络用于医疗应用的例子。我们设计一个器械,用于从血样的光谱组成的测量中得到血清的
胆固醇含量级别,我们有261个病人的血样值,包括21种波长的谱线的数据,对于这些病人,我们得到了基于 光谱分类的胆固醇含量级别hdl,ldl,vldl。
(1) 样本数据的定义与预处理。
choles_all.mat 文件中存储了网络训练所需要的全部样本数据。
利用 load 函数可以在工作空间中自动载入网络训练所需的输入数据 p 和目标数据 t,即
load choles_all
sizeofp = size (p)
sizeofp = 21 2
sizeoft = size (t)
sizeoft = 3 2
可见,样本集的大小为 2。为了提高神经网络的训练效率,通常要对样本数据作适当的预处理。首先,利用 prestd 函数对样本数据作归一化处理,使得归一化后的输入和目标数据均服从正态分布,即 [pn,meanp,stdp,tn,meant,stdt] = prestd(p,t);
然后,利用 prepca 函数对归一化后的样本数据进行主元分析,从而消除样本数据中的冗余成份,起到数据降维的目的。
[ptrans,transMat] = prepca(pn,0.001);
[R,Q] = size(ptrans)
R = 4 Q = 2
可见,主元分析之后的样本数据维数被大大降低,输入数据的维数由 21 变为 4。
(2) 对训练样本、验证样本和测试样本进行划分。
为了提高网络的推广能力和识别能力,训练中采用“提前停止”的方法,因此,在训练之前,需要将上面处理后的样本数据适当划分为训练样本集、验证样本集和测试样本集。
(3) 网络生成与训练。 选用两层 BP 网络,其中网络输入维数为 4,输出维数为 3,输出值即为血清胆固醇的三个指标值大小。网络中间层神经元数目预选为 5,传递函数类型选为 tansig 函数,输出层传递函数选为线性函数 purelin,训练函数设为 trainlm。网络的生成语句如下:
net = newff(minmax(ptr),[5 3],{'tansig' 'purelin'},'trainlm');
利用 train 函数对所生成的神经网络进行训练,训练结果如下:
[net,tr]=train(net,ptr,ttr,[],[],val,test);
见,网络训练迭代至第 20 步时提前停止,这是由于验证误差已经开始变大。利用下面语句可以绘制出训练误差、验证误差和测试误差的变化曲线,如图 4.50 所示。由图可见,验证误差和测试误差的变化趋势基本一致,说明样本集的划分基本合理。由训练误差曲线可见,训练误差结果也是比较满意的。
(4) 网络仿真。 为了进一步检验训练后网络的性能,下面对训练结果作进一步仿真分析。利用 postreg函数可以对网络仿真的输出结果和目标输出作线性回归分析,并得到两者的相关系数,从而可以作为网络训练结果优劣的判别依据。仿真与线性回归分析如下:
an = sim(net,ptrans);
a = poststd(an,meant,stdt);
for i=1:3
figure(i)
[m(i),b(i),r(i)] = postreg(a(i,:),t(i,:));
end
%导入原始测量数据
load choles_all;
%对原始数据进行规范化处理,prestd是对输入数据和输出数据进行规范化处理,
%prepca可以删除一些数据,适当地保留了变化不小于0.01的数据
[pn,meanp,stdp,tn,meant,stdt]=prestd(p,t);
[ptrans,transMat]=prepca(pn,0.001);
[R,Q]=size(ptrans)
%将原始数据分成几个部分作为不同用途四分已用于确证,四分一用于测试,二分一用于训练网络
iitst=2:4:Q;
iival=4:4:Q;
iitr=[1:4:Q 3:4:Q];
%vv是确证向量,.P是输入,.T是输出,vt是测试向量
vv.P=ptrans(:,iival);
vv.T=tn(:,iival);
vt.P=ptrans(:,iitst);
vt.T=tn(:,iitst);
ptr=ptrans(:,iitr);
ttr=tn(:,iitr);
%建立网络,隐层中设计5个神经元,由于需要得到的是3个目标,所以网络需要有3个输出
net=newff(minmax(ptr),[5 3],{'tansig' 'purelin'},'trainlm');
%训练网络
net.trainParam.show=5;
[net,tr]=train(net,ptr,ttr,[],[],vv,vt);
%绘出训练过程中各误差的变化曲线
plot(tr.epoch,tr.perf,'r',tr.epoch,tr.vperf,':g',tr.epoch,tr.tperf,'-.b');
legend('训练','确证','测试',-1);
ylabel('平方误差');
xlabel('时间');
pause;
%将所有数据通过网络(包括训练,确证,测试),然后得到网络输出和相应目标进行线性回归,
%对网络输出进行反规范化变换,并绘出个各级别的线性回归结果曲线
an=sim(net,ptrans);
a=poststd(an,meant,stdt);
%得到3组输出,所以进行3次线性回归
for i=1:3
figure(i)
[m(i),b(i),r(i)] = postreg(a(i,:),t(i,:));
end
网络输出数据和目标数据作线性回归后,前面两个输出对目标的跟踪比较好,相应的R值接近0.9。而第三个输出却并不理想,我们很可能需要在这点上做更多工作。可能需要使用其它的网络结构(使用更多的隐层神经元),或者是在训练技术上使用贝页斯规范华而不实使用早停的方法。
把隐层数目改为20个时,网络训练的3种误差非常接近,得到的结果R也相应提高。但不代表神经元越多就越精确。
多层神经网络能够对任意的线性或者非线性函数进行逼近,其精度也是任意的。但是BP网络不一定能找到解。训练时,学习速率太快可能引起不稳定,太慢则要花费太多时间,不同的训练算法也对网络的性能有很大影响。BP网络对隐层的神经元数目也是很敏感的,太少则很难适应,太多则可能设计出超适应网络。
注:例子均来自于互联网,本人的工作只是将整合在一起。
采用L-M 优化算法(trainlm):
基于Matlab的BP神经网络编程过程
(1)对样本集进行归一化
确定输入样本和输出样本,并对它们进行归一化,将输入和输出样本变换到(0.1,0.9)区间,由于Matlab的归一化函数premnmx把数据变换到(-1,1)之间,所以可使用自编premnmx2归一化函数。
(2)创建BP神经网络
在样本集确定之后,即可进行网络的结构设计,在Matlab中一般使用newff创建函数,它不但创建了网络对象,还自动初始化网络的权重和阈值。如果需要重新初始化网络权重和阈值,可以使用Init函数。
关键语句如下:
net=newff(输入样本的取值范围,[网络各层的神经元数目],{网络各层神经元的激活函数},‘训练函数',‘学习函数’,‘性能函数’)
一般选用三层BP网络,输入层、输出层的神经元个数根据具体情况确定,而隐层神经元个数目前多采用经验的方法确定。
(3)设置网络的训练参数
net.trainParam.epochs―最大收敛次数;
net.trainParam.goal―收敛误差;
net.trainParam.show―显示间隔;
以上在一般的神经网络训练中都有使用,如果使用Levenberg-Marquart优化算法进行训练,还需设置的参数有:
net.trainParam.mu―Levenberg-Marquart优化算法中的
net.trainParam.mu_dec― 的缩减因子;
net.trainParam.mu_inc― 的增大因子;
net.trainParam.mu_max― 的最大值;
net.trainParam.min_grad―性能函数的最小梯度;
(4)训练BP网络
关键语句为:net=train(net,p,t)
(6)训练成功,相关结果输出。
[b]编程过程[/b]
下面是一个以 [i]LM优化算法[/i]为训练函数的BP神经网络:
[S0,Q]=size(P); % P的行数必须为6
S1=7; % 7个隐含层神经元个数
S2=2; % 2个输出经元个数
% BP神经网络训练参数设置
net=newff(minmax(P),[S1,S2],{'logsig','logsig'},'trainlm');
net.trainParam.epochs=200000;
net.trainParam.goal=1e-30;
net.trainParam.min_grad=1e-15;
net.trainParam.mu=10;
net.trainParam.mu_dec=0.2;
net.trainParam.mu_inc=1.2;
net.trainParam.mu_max=1e15;
net.trainParam.show=100;
% 训练神经网络
[net,tr]=train(net,P,T);
例子:
编程算法 2010-05-26 17:52:55
P=[。。];输入T=[。。];输出 % 创建一个新的前向神经网络
net_1=newff(minmax(P),[10,1],{'tansig','purelin'},'traingdm') % 当前输入层权值和阈值
inputWeights=net_1.IW{1,1} inputbias=net_1.b{1} % 当前网络层权值和阈值
layerWeights=net_1.LW{2,1} layerbias=net_1.b{2} % 设置训练参数
net_1.trainParam.show = 50;
net_1.trainParam.lr = 0.05;
net_1.trainParam.mc = 0.9;
net_1.trainParam.epochs = 10000;
net_1.trainParam.goal = 1e-3;
% 调用 TRAINGDM 算法训练 BP 网络
[net_1,tr]=train(net_1,P,T);
% 对 BP 网络进行仿真 A = sim(net_1,P);
% 计算仿真误差 E = T - A;
MSE=mse(E) x=[。。]';%测试 sim(net_1,x)
例子:
%% 清空环境变量
clc
clear
X=[18.9 993 662 6.7 1.92 411 438
16.6 952 702 6.7 2 279 278
20.9 926 658 6.9 2.08 378 439
17 966 674 6.6 2 335 314
18.1 1108 6 7.1 1.6 243 209
18.4 883 637 6.6 2 379 371
18.3 1012 685 6.4 2 391 395
20.7 1119 684 6.5 1.68 383 411
18.9 929 719 6.3 1.76 383 358
18.8 1071 681 6.4 1.84 381 383
18.1 940 722 6.8 1.8 386 396
18.9 984 655 6.5 1.6 375 385
18.8 999 717 6.3 1.68 368 365
18.6 926 681 6.6 1.68 356 338
18.9 927 699 6.3 1.8 373 367
18.7 872 730 6.5 1.2 355 321
11.4 444 698 1.7 0 175 115
11.3 6 590 7.1 1.44 71 52
17 981 655 7.2 1.68 152 181
17 1133 733 7.2 1.75 332 341
18.7 1138 711 6.8 1.92 341 341
18.9 993 662 6.7 1.92 411 438
16.6 952 702 6.7 2 279 278
18.9 926 658 6.9 2.08 378 439
20.7 1084 694 6.4 2 346 3
18.9 1040 668 6.6 2 365 351
18.7 1067 727 6.9 2.04 401 360
18.8 1048 732 7.1 2.08 332 270
19.1 1177 680 6.5 1.92 372 370
19.1 1130 735 5.8 1.76 362 298
18.4 1111 700 6.7 1.68 385 369
18.9 1157 714 6.4 1.84 374 348
17.7 1112 687 7.2 2 355 301
19.3 1162 713 6.8 2.04 358 352
20.6 1090 729 6.9 2.16 314 326
20.7 1060 552 6.5 2 369 387
17.1 1135 691 6.6 1.92 370 355
20.6 1087 702 6.7 1.93 395 408
20.7 1141 722 6.7 2 393 427
19 1131 677 6.7 1.88 396 362
20.6 1123 710 5.8 2 379 388
20.1 1150 690 7 2.04 379 363
19.4 1023 714 6.6 1.92 398 328
17.1 1062 729 5.3 1.96 324 324
20.6 1140 712 6.4 2.06 312 415
19.7 1049 711 6.7 1.44 401 310
17.1 1074 5 6.6 2 347 324
17.3 1059 702 6.4 1.6 346 372
];
%% 数据累加作为网络输入
[n,m]=size(X);
for i=1:n
y(i,1)=sum(X(1:i,1));
y(i,2)=sum(X(1:i,2));
y(i,3)=sum(X(1:i,3));
y(i,4)=sum(X(1:i,4));
y(i,5)=sum(X(1:i,5));
y(i,6)=sum(X(1:i,6));
y(i,7)=sum(X(1:i,7));
end
%% 网络参数初始化
a=0.3+rand(1)/4;
b1=0.3+rand(1)/4;
b2=0.3+rand(1)/4;
b3=0.3+rand(1)/4;
b4=0.3+rand(1)/4;
b5=0.3+rand(1)/4;
b6=0.3+rand(1)/4;
%% 学习速率初始化
u1=0.0015;
u2=0.0015;
u3=0.0015;
u4=0.0015;
u5=0.0015;
u6=0.0015;
%% 权值阀值初始化
t=1;
w11=a;
w21=-y(1,1);
w22=2*b1/a;
w23=2*b2/a;
w24=2*b3/a;
w25=2*b4/a;
w26=2*b5/a;
w27=2*b6/a;
w31=1+exp(-a*t);
w32=1+exp(-a*t);
w33=1+exp(-a*t);
w34=1+exp(-a*t);
w35=1+exp(-a*t);
w36=1+exp(-a*t);
w37=1+exp(-a*t);
theta=(1+exp(-a*t))*(b1*y(1,2)/a+b2*y(1,3)/a+b3*y(1,4)/a+b4*y(1,5)/a+b5*y(1,6)/a+b6*y(1,7)/a-y(1,1));
kk=1;
%% 循环迭代
for j=1:7
%循环迭代
E(j)=0;
for i=1:48
%% 网络输出计算
t=i;
LB_b=1/(1+exp(-w11*t)); %LB层输出
LC_c1=LB_b*w21; %LC层输出
LC_c2=y(i,2)*LB_b*w22; %LC层输出
LC_c3=y(i,3)*LB_b*w23; %LC层输出
LC_c4=y(i,4)*LB_b*w24; %LC层输出
LC_c5=y(i,5)*LB_b*w25; %LC层输出
LC_c6=y(i,6)*LB_b*w26;
LC_c7=y(i,7)*LB_b*w27;%LC层输出
LD_d=w31*LC_c1+w32*LC_c2+w33*LC_c3+w34*LC_c4+w35*LC_c5+w36*LC_c6+w37*LC_c7; %LD层输出
theta=(1+exp(-w11*t))*(w22*y(i,2)/2+w23*y(i,3)/2+w24*y(i,4)/2+w25*y(i,5)/2+w26*y(i,6)/2+w27*y(i,7)/2-y(1,1)); %阀值
ym=LD_d-theta; %网络输出值
yc(i)=ym;
%% 权值修正
error=ym-y(i,1); %计算误差
E(j)=E(j)+abs(error); %误差求和
error1=error*(1+exp(-w11*t)); %计算误差
error2=error*(1+exp(-w11*t)); %计算误差
error3=error*(1+exp(-w11*t));
error4=error*(1+exp(-w11*t));
error5=error*(1+exp(-w11*t));
error6=error*(1+exp(-w11*t));
error7=error*(1+exp(-w11*t));
error8=(1/(1+exp(-w11*t)))*(1-1/(1+exp(-w11*t)))*(w21*error1+w22*error2+w23*error3+w24*error4+w25*error5+w26*error6+w27*error7);
%修改权值
w22=w22-u1*error2*LB_b;
w23=w23-u2*error3*LB_b;
w24=w24-u3*error4*LB_b;
w25=w25-u4*error5*LB_b;
w26=w26-u5*error6*LB_b;
w27=w27-u6*error7*LB_b;
w11=w11+a*t*error8;
end
end
%画误差随进化次数变化趋势
figure(1)
plot(E)
title('训练误差','fontsize',8);
xlabel('进化次数','fontsize',8);
ylabel('误差','fontsize',8);
%print -dtiff -r600 28-3
%根据训出的灰色神经网络进行预测
for i=41:48
t=i;
LB_b=1/(1+exp(-w11*t)); %LB层输出
LC_c1=LB_b*w21; %LC层输出
LC_c2=y(i,2)*LB_b*w22; %LC层输出
LC_c3=y(i,3)*LB_b*w23; %LC层输出
LC_c4=y(i,4)*LB_b*w24; %LC层输出
LC_c5=y(i,5)*LB_b*w25;
LC_c6=y(i,6)*LB_b*w26;
LC_c7=y(i,7)*LB_b*w27;
LD_d=w31*LC_c1+w32*LC_c2+w33*LC_c3+w34*LC_c4+w35*LC_c5+w36*LC_c6+w37*LC_c7; %LD层输出
theta=(1+exp(-w11*t))*(w22*y(i,2)/2+w23*y(i,3)/2+w24*y(i,4)/2+w25*y(i,5)/2+w26*y(i,6)/2+w27*y(i,7)/2-y(1,1)); %阀值
ym=LD_d-theta; %网络输出值
yc(i)=ym;
end
yc=yc;
y(:,1)=y(:,1);
%计算预测的每月需求量
for j=48:-1:2
ys(j)=(yc(j)-yc(j-1))/10;
end
figure(2)
plot(ys(41:48),'-*');
hold on
plot(X(41:48,1),'r:o');
legend('灰色神经网络','烧结终点')
title('灰色系统预测','fontsize',8)
xlabel('月份','fontsize',8)
ylabel('销量','fontsize',8)