数学建模时间序列
原文: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)
具体建模的话,先观察时列图
选择差分
确定与非确定结合
然后进行拟合
- 拟合后预测