2020APMC—题2——最小二乘拟合&灰色预测

    笔者在2020年11月参加了APMCM竞赛,在队伍中也是一个相对划水的角色。

    在比赛中我们选择了第二题。相对第一题,第二题的答案并不唯一,思考面更广。因为队伍中有得国奖的大佬,在准备不足的情况下也从中学到了很多。我们所搜集的数据,有部分是残缺的,因此采用的最小二乘法进行拟合将数据补齐,但是部分拟合结果并不完美。所涉及程序如下:

clc,clear,close all

A=xlsread('F:\MATLAB_APMCM\1_value.xlsx',1,'A1:A45');
year_month=xlsread('F:\MATLAB_APMCM\1_value.xlsx',1,'B1:B45');
Totalretail=xlsread('F:\MATLAB_APMCM\1_value.xlsx',1,'C1:H45');
n=length(A);

Total_month=Totalretail(:,1);
nan_bit=isnan(Total_month);%找出没有记录的月份
bit_j=1;bit_i=1;
for i=1:n
 if(nan_bit(i)==0) 
     num_x(bit_j)=i; 
     bit_j=bit_j+1;
 else
     num_y(bit_i)=i;
     bit_i=bit_i+1;
 end
end

for i=1:bit_j-1
    value(i)=Total_month(num_x(i),1);
    month(i)=A(num_x(i),1);
    x_axis(i)=year_month(num_x(i),1);
end
for i=1:n-bit_j+1
    x0(i)=A(num_y(i),1);
end
x_year_month(1)=year_month(1);
for i=1:45/5
    x_year_month(i+1)=year_month(i*5);
end


value=fliplr(value);
x_axis=fliplr(x_axis);
retailsales=polyfit(month,value,9);
y1=polyval(retailsales,month);
y2=polyval(retailsales,x0);
plot(month,value,'or',month,y1,'-b')
legend('Original point','Fitting graph');
get(gca);
set(gca,'XTickLabel',x_year_month);
set(gca,'XTickLabelRotation',45);
xlabel('date(month)')
ylabel('output value(100 million yuan)')
title('Total retail sales of consumer goods')

上图是我们搜集的其中一个领域数据的拟合,因为数据量较小,在用最小二乘得到的结果并不怎么精确。结果如下:

笔者的MATLAB软件并不熟练,只能说了解。通过本次比赛,我也了解到了在用MATLAB绘制图形方面的欠缺。该行业的拟合效果并不理想,如果简单增加polyfit函数中的拟合次数,虽然图像的拟合效果看起来会很好,但是所需要计算的值会非常不理想。接下来是通过灰色预测模型对各行业未来发展的预测。我们所选择的领域,只有部分可以达到灰色预测模型的使用标准。我们仅仅做了残差的检验,残差结果部分符合最低要求的,但是对于竞赛中,我们并不能用最低要求处理数据,更何况其中非常标准的预测结果,最后分析时还是有很大的误差。灰色预测模型程序如下:

clc,clear,close all
%取值
x_mid_1=xlsread('F:\MATLAB_APMCM\American_date.xlsx',1,'b2:p14');
x_1=x_mid_1';
[n,m]=size(x_1);
ps=1;G=[];
for l=1:m
syms a b;
c=[a,b]';
month=4;
AGO=cumsum(x_1(:,ps));
for i=2:n
    z_1(i)=(AGO(i)+AGO(i-1))/2;
end
z_1(1)=[];
AGO=[-z_1;ones(1,n-1)]';
Y=x_1(2:n,ps);
c=inv(AGO'*AGO)*AGO'*Y;
a=c(1);b=c(2);
F=[];F(1)=x_1(1,ps);
for i=2:(n+month)
    F(i)=(x_1(1,ps)-b/a)/exp(a*(i-1))+b/a;
end
G(ps,1)=x_1(1,ps);
for i=2:(n+month)
    G(ps,i)=F(i)-F(i-1);
end
disp(['预测数据为:',num2str(G(ps,:))]);
H = G(ps,1:n);  
p=x_1(:,ps)';
epsilon =x_1(:,ps)'-H;
%计算相对误差q
q=abs(epsilon./x_1(:,ps)');
Q(ps)=mean(q);
disp(['相对残差Q检验:',num2str(Q(ps))]);
ps=ps+1;
end

在残差检验是有几个数据非常不理想一般残差小于0.1为最佳,小于0.2为较好,结果如下:

笔者之前并没有接触过灰色预测,在开赛后才对其有些许了解。所以欢迎大家指正,一起学习。

    最后,在比赛中使用Excel、word等基础软件深感乏力,经过要多学习。在用ATLAB处理数据时,自己的模型库并没有搭建起来,今后会在这方面多下功夫。


[1]卓金武,王鸿钧等,《MATLAB数学建模方法与实践》(第三版)

[2]https://blog.csdn.net/Fighting_Peter/article/details/104302362/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值