我越来越不喜欢matlab,因为它让我们只需要使用它的工具箱;我越来越喜欢matlab,因为在它的工具箱里隐藏着无数优秀甚至卓越的算法。
晚上闲的没事,突发奇想预测一下中国代表团在2012年伦敦运动会上获得金牌和奖牌的情况,使用matlab神经网络工具箱BP网络设计与分析函数进行预测,程序根据《matlab在数学建模中的应用》一书中神经网络一章中的程序改编而成。
clc
%原始数据
%参赛人数
sqrs=[225 301 251 309 311 411 639 ];
%金牌数
sqjdcs=[15 5 16 16 28 32 51];
%奖牌数
sqglmj=[32 28 54 50 59 63 100 ];
p=[sqrs] %输入数据矩阵
t=[sqjdcs;sqglmj] %目标数据矩阵
%利用premnmx函数对数据进行归一化
[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); % 对于输入矩阵p和输出矩阵t进行归一化处理
dx=[-1,1]; %归一化处理后最小值为-1,最大值为1
%BP网络训练
net=newff(dx,[1,2],{'tansig','purelin'},'traingdx'); %建立模型,并用梯度下降法训练.
net,trainParam.Lr=1; %学习速率为1
net.trainParam.epochs=50000; %最大训练轮回为50000次
net.trainParam.goal=3; %均方误差
net=train(net,pn,tn); %开始训练,其中pn,tn分别为输入输出样本
%利用原始数据对BP网络仿真
an=sim(net,pn); %用训练好的模型进行仿真
a=postmnmx(an,mint,maxt); % 把仿真得到的数据还原为原始的数量级;
%本例因样本容量有限使用训练数据进行测试,通常必须用新鲜数据进行测试
x=1984:4:2008;
newk=a(1,:);
newh=a(2,:);
figure (2);
subplot(2,1,1);plot(x,newk,'r-o',x,sqjdcs,'b--+') %绘值金牌数对比图;
legend('网络输出金牌数','实际金牌数');
xlabel('年份');ylabel('金牌数/枚');
subplot(2,1,2);plot(x,newh,'r-o',x,sqglmj,'b--+') %绘制奖牌数对比图;
legend('网络输出奖牌数','实际奖牌数');
xlabel('年份');ylabel('奖牌数/枚');
%利用训练好的网络进行预测
% 当用训练好的网络对新数据pnew进行预测时,也应作相应的处理:
pnew=[621]; %2012年的相关数据;
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
anewn=sim(net,pnewn); %利用归一化后的数据进行仿真;
anew=postmnmx(anewn,mint,maxt) %把仿真得到的数据还原为原始的数量级;
缺点与不足:(1)对神经网络的使用经验不是很足,每次运行程序结果都会发生较大变化,需要凭借观察取得较好的预测值;(2)金牌与奖牌数量只与代表团成员人数相关显然不合理;(3)单独对金牌数或奖牌数进行预测更容易使网络输出值与实际值之间误差较小,可见根据单一因素预测不准。
结果:多次运行程序,选取误差较小的预测情况,最终接受的预测值为金牌36枚,奖牌总数91枚。
最后,本预测纯属娱乐,如有雷同,不胜荣幸。
来源:oschina
链接:https://my.oschina.net/u/347565/blog/69657