时间序列

数学建模时间序列

原文:http://blog.youkuaiyun.com/qq_34861102/article/details/77075424


  • 趋势移动平均法:
    • 最简单的,使用线性的预测
  • 指数平滑预测模型:

    • 二次指数平滑

      这里写图片描述

    • 三次指数平滑

      这里写图片描述

曲线预测模型:

  • Compertz曲线
  • 生长曲线
  • 修正指数曲线

ARMA模型:

  • armax(p,q)函数
    这里写图片描述
  • 定阶
    我想的话,直接用aic评估一下,画个图,看哪个点的指标最小
 aic(m)
  • 预测
predict和forecast

正文:

这里写图片描述

  • 1
yt = [80.8 94.0 88.4 101.5 110.3 121.5 134.7 142.7];
m = length(yt);
n = 3;
%未来一步的预测
for i = n+1:m+1
    ythat(i) = sum(yt(i-n:i-1))/n;
end
ythat
%未来多步的预测
for i = m+1:m+3
    yt(i) = ythat(i);
    ythat(i+1) = sum(yt(i-n+1:i))/n;
end
yhat = ythat(end-3:end)
s1 = sqrt(mean(yt(n+1:m)-ythat(n+1:m)).^2)
  • 2

    • alpha = 0.6;
       yt = [80.8 94.0 88.4 101.5 110.3 121.5 134.7 142.7];
       n = length(yt);
       st1(1) = mean(yt(1:3));
       st2(1) = st1(1);
       for i = 2:n
          st1(i) = alpha*yt(i) + (1-alpha)*st1(i-1);
          st2(i) = alpha*st1(i) + (1-alpha)*st2(i-1);
       end
       at = 2*st1 - st2;
       bt = alpha/(1-alpha)*(st1-st2);
       yhat = at + bt;
       sigma = sqrt(mean((yt(2:end)-yhat(1:end-1)).^2));
       m = 1:4;
       yhat2 = at(end) + bt(end)*m;
    • alpha = 0.3;
       yt = [80.8 94.0 88.4 101.5 110.3 121.5 134.7 142.7];
       n = length(yt);
       st1(1) = mean(yt(1:3));
       st2(1) = st1(1);
       for i = 2:n
          st1(i) = alpha*yt(i) + (1-alpha)*st1(i-1);
          st2(i) = alpha*st1(i) + (1-alpha)*st2(i-1);
       end
       at = 2*st1 - st2;
       bt = alpha/(1-alpha)*(st1-st2);
       yhat = at + bt;
       sigma = sqrt(mean((yt(2:end)-yhat(1:end-1)).^2));
       m = 1:4;
       yhat2 = at(end) + bt(end)*m;

这里写图片描述

  • 同(1)中的指数模型编写方法,参考三次指数:

    这里写图片描述

这里写图片描述

  • 修正指数曲线

    • t = 1969:1983;
      yt = [3.78 4.19 4.83 5.46 6.71 7.99 8.60 9.24 9.67 9.87 10.49 10.92 10.93 12.39 12.59];
      plot(t,yt,'* -');
      n = length(yt);
      
      
      m = n/3;
      dyt = diff(yt);
      for i = 1:n-2
          jy(i) = dyt(i+1)/dyt(i);
      end
      fw = minmax(jy);
      s1 = sum(yt(1:m));
      s2 = sum(yt(m+1:2*m));
      s3 = sum(yt(2*m+1:end));
      b = ((s3-s2)/(s2-s1))^(1/m);
      a = (s2 - s1)*(b - 1)/(b * (b^m - 1)^2);
      k = (s1 - a*b*(b^m-1)/(b-1))/m;
      yuce = @(t) k + a*b.^t;
      bzcha = sqrt(mean((yt - yuce(1:n)).^2))
      ythat = yuce([n+2,n+7])

      这里写图片描述

      这里写图片描述

  • Compertz曲线

    解答:

    这里写图片描述

    y = [3.78 4.19 4.83 5.46 6.71 7.99 8.60 9.24 9.67 9.87 10.49 10.92 10.93 12.39 12.59];
    yt = log(y);
    n = length(yt);
    m = n/3;
    s1 = sum(yt(1:m));
    s2 = sum(yt(m+1:2*m));
    s3 = sum(yt(2*m+1:end));
    b = ((s3 - s2)/(s2 - s1))^(1/m);
    a2 = (s2 - s1)*(b - 1)/(b*(b^m - 1)^2);
    k2 = (s1 - a2*b*(b^m - 1)/(b - 1))/m;
    a = exp(a2);
    k = exp(k2);
    yuce = @(t) k*a.^(b.^t);
    yhat = yuce(1:n);
    bzcha = sqrt(mean((y-yhat).^2))
    ythat = yuce([n+2,n+7])
  • 生长曲线

    这里写图片描述
    这里写图片描述

    y = [3.78 4.19 4.83 5.46 6.71 7.99 8.60 9.24 9.67 9.87 10.49 10.92 10.93 12.39 12.59];
    yt = 1./y;
    n = length(yt);
    m = n/3;
    s1 = sum(yt(1:m));
    s2 = sum(yt(m+1:2*m));
    s3 = sum(yt(2*m+1:end));
    b = ((s3-s2)/(s2-s1))^(1/m);
    a = (s2 - s1)*(b - 1)/(b * (b^m - 1)^2);
    k = (s1 - a*b*(b^m-1)/(b-1))/m;
    yuce = @(t)1./(k + a*b.^t);
    bzcha = sqrt(mean((yt - yuce(1:n)).^2))
    ythat = yuce([n+2,n+7])

ARMA模型拟合实例:

elps = randn(100,1);
x = ones(100,1);
for i = 3:100
    x(i,1) = elps(i) - 0.6*elps(i - 1) - 0.2*elps(i - 2);
end
%模拟ARMA(0,2)模型
%x必须为列向量
m = armax(x,[0,2]);
%预测
dx_Forecast = forecast(m,x,10);
x_Forecast = x(end) + cumsum(dx_Forecast)

  • 具体建模的话,先观察时列图

    • 选择差分

      这里写图片描述

    • 确定与非确定结合

      这里写图片描述

  • 然后进行拟合

  • 拟合后预测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值