数学建模社区-数学中国

标题: ARIMA模型 指数平滑法 [打印本页]

作者: 2744557306    时间: 2024-3-20 10:30
标题: ARIMA模型 指数平滑法
当涉及到时间序列数据分析和预测时,指数平滑法是一种常用的方法之一。它是一种简单而有效的平滑技术,可以用于处理具有趋势和季节性的时间序列数据。
6 V+ \/ _* z& ^4 e8 F7 _' P指数平滑法基于以下假设:9 x1 s; a5 c% w) F+ o3 ?
1.过去的观测值对于预测未来的值更为重要。: E* p: w9 J* Y7 g# V" F; e
2.近期的观测值对于预测的影响程度比过去的观测值更大。
1 q* L+ C0 G" i3.观测值中的随机波动应该被消除,使得预测值更稳定。, S6 U! V6 b" S, H+ Q9 i, I

9 P( b5 C) K' S$ T" m  n  e指数平滑法有几种不同的变体,其中最常见的是简单指数平滑、二次指数平滑和三次指数平滑。1 m3 s& F; x2 v& `0 L9 X
  l: n: H4 G2 [
4.简单指数平滑(Simple Exponential Smoothing):
) D3 ^5 |- d. J' S简单指数平滑方法将所有观测值视为等权重,并使用一个平滑参数(通常表示为α)来确定各个观测值的权重。具体来说,简单指数平滑法的计算公式如下:" }/ k1 J$ H* _! O, g8 g/ u0 q

' k, t# }( H4 M1 p6 u7 H) h! r5.初始值:S₁ = X₁4 z8 h6 c) J5 B" x
6.平滑公式:Sₜ = α * Xₜ + (1 - α) * Sₜ₋₁5 o) p! M7 S) }3 L: g  D9 t0 h  j
其中,Sₜ表示时刻 t 的平滑值,Xₜ表示时刻 t 的观测值。
2 x4 U% w3 c( o; H6 L+ K( v2 t7.二次指数平滑(Double Exponential Smoothing):, Z% p0 s( Y/ a
二次指数平滑法相对于简单指数平滑法,将趋势也纳入考虑。它不仅考虑过去观测值的权重,还考虑了过去观测值的趋势。具体来说,二次指数平滑法的计算公式如下:
* V, M8 @# k5 k& R( e! {; U8 J/ F$ H4 H$ i0 G1 t* @3 R' W
8.初始水平值:L₁ = X₁
: K4 ~0 G, e) v* l) F2 M; O0 E9.初始趋势值:T₁ = X₂ - X₁
) x6 q# ?* o3 b( z10.平滑公式(水平值):Lₜ = α * Xₜ + (1 - α) * (Lₜ₋₁ + Tₜ₋₁)2 h* @$ j8 q3 Q& E2 `, X5 t' R0 h: W
11.平滑公式(趋势值):Tₜ = β * (Lₜ - Lₜ₋₁) + (1 - β) * Tₜ₋₁
. M% o& h+ y( d/ a8 {7 S3 z其中,Lₜ表示时刻 t 的水平值,Tₜ表示时刻 t 的趋势值,Xₜ表示时刻 t 的观测值,α和β是平滑参数。
  k0 A/ E" p- l  [7 q  l12.三次指数平滑(Triple Exponential Smoothing):& R! C+ K$ m: U5 T2 i; M0 O! j0 d: s
三次指数平滑法是在二次指数平滑法的基础上进一步考虑了季节性的影响。它适用于具有明显季节性模式的时间序列数据。具体来说,三次指数平滑法的计算公式如下:
) h4 ]; ]2 _# V# u2 @( M
1 a. X& p( A% d% e( V$ S13.初始水平值:L₁ = X₁
; J8 o1 s0 M, d6 B1 \7 \* L14.初始趋势值:T₁ = X₂ - X₁
( v1 C: @+ Y# I9 \  d8 f0 @15.初始季节性值:S₁ = X₃ - 2T₁ - L₁+ U# h, _$ @/ W  j3 `8 A; ]* W
16.平滑公式(水平值):Lₜ = α * (Xₜ - Sₜ₋₃) + (1 - α) * (Lₜ₋₁ + Tₜ₋₁)  K/ F& r7 J2 d+ P
17.平滑公式(趋势值):Tₜ = β * (Lₜ - Lₜ₋₁) + (1 - β) * Tₜ₋₁
6 c+ s# C9 ]+ R% F  t2 p18.平滑公式(季节性值):Sₜ = γ * (Xₜ - Lₜ - Tₜ) + (1 - γ) * Sₜ₋₃
- B5 {: y* o% Z0 L其中,Lₜ表示时刻 t 的水平值,Tₜ表示时刻 t 的趋势值,Sₜ表示时刻 t 的季节性值,Xₜ表示时刻 t 的观测值,α、β和γ是平滑参数。, w* G4 \$ q9 {( ~  [

- L; I8 v3 a7 _; U请注意,指数平滑法适用于简单的时间序列模式,例如渐变性趋势或没有明显季节性模式的数据。对于更复杂的模式,如长期趋势、季节性和其他周期性模式,可以考虑使用更高级的模型,例如ARIMA模型。! a% Q* I3 g# |7 k- H% ]; S9 d
ARIMA(Autoregressive Integrated Moving Average)模型是一种常用于时间序列分析和预测的统计模型,它将自回归(AR)、差分(I)和移动平均(MA)三种方法结合在一起。ARIMA模型根据时间序列数据的自相关性和移动平均性来拟合模型,并用于预测未来的数值。ARIMA模型通常用于处理具有复杂模式的时间序列数据,如具有长期趋势、季节性和周期性模式的数据。; x. ]- F4 r2 W

: n) j0 Z$ `/ T) v# 导入所需的库/ Z1 f! o: I" \% m- K6 m
import numpy as np$ D0 `" U$ h% b% G7 i0 k' K
import pandas as pd
6 F, w5 s4 O3 w/ S1 m! e+ Y2 Y: K* c) r
# 源数据
+ \  ]% [9 \4 L& q$ X, ~, Odf = pd.DataFrame({0 Z- E5 F/ ^2 a0 }, q2 ]0 v# Q7 |
    't': [i for i in range(1, 11)],4 |) _. x" G; E2 D$ j
    'production': [2031, 2234, 2566, 2820, 3006,- \/ |( t( x1 f! Z# Y# J0 b' x2 t
                   3093, 3277, 3514, 3770, 4107],* B/ P' Y) \8 H$ F3 }( G, `4 v7 o
})
5 S+ i$ N, U8 |; B
; F5 c; w1 t  e1 `( F- Z8 Q这段代码创建了一个DataFrame df,包含了时间(t)和产量(production)的数据。
& ^- T4 W  K% T6 A& J# 设 alpha=.3,计算一次、二次指数平滑
2 y; E8 w$ Q/ B8 Aalpha = .3
4 k6 J. C0 T8 {0 B& T0 W7 Bs1, s2 = [int(df['production'][0])],\9 n( c+ V6 a9 y8 E, X9 Z
    [int(df['production'][0])]0 x3 k- x  h! h* T

8 t2 q9 N8 I# M! S3 R  {for i in range(1, len(df['t'])):
0 e4 C" {8 e9 p5 F    s1.append(alpha*df['production'][i] + (1-alpha)*s1[i-1])
; L- H, f' ^2 A7 L7 @    s2.append(alpha*s1[i] + (1-alpha)*s2[i-1])5 y  R+ ^$ K8 E; L& S6 C8 H; Q
df['s1'] = s1& k6 \/ I. C* T& ^+ L4 Q- V0 l. o- M
df['s2'] = s2
6 y/ i  g$ m; |2 H
9 d3 b" r! N) `& s这段代码使用指数平滑法计算了一次指数平滑和二次指数平滑的值,并将结果添加到DataFrame df中的's1'和's2'列中。
3 B: K0 b, y( u2 K+ C# 计算过去年的预测值,以及未来年的线性表达式
2 q0 e5 _5 ~$ Rpredict_list = [None]3 N: y# i% e8 o6 x8 P- F
for i in range(len(df['t'])-1):8 S# W" C  d, T+ w
    a = 2*df['s1'][i] - df['s2'][i]- _* p2 [8 G- G* U2 X
    b = (alpha / (1-alpha)) * (df['s1'][i] - df['s2'][i])' w2 }& Y3 b+ M# p9 J% U
    predict_list.append(a + b)
9 R% E3 p( d2 R+ m1 X, [- W0 B' _. }* G2 _1 E, n
t = 103 J& ~3 R1 Q9 T+ `
a = 2*df['s1'][t-1] - df['s2'][t-1]' A2 `4 g0 k+ u
b = (alpha / (1-alpha)) * (df['s1'][t-1] - df['s2'][t-1])9 z' Y( |5 ]0 R! a
df['predict'] = predict_list
: p' p2 s! R  M- i+ y! V- i' zprint('at =', a)3 r+ s- v: l, X4 G
print('bt =', b)
1 I9 w1 h. ~( [% I1 a$ K
& s( s" _( f8 Z9 o( Y这段代码计算了过去年份的预测值,并给出了未来年份的线性表达式。其中a和b是线性表达式的参数,对应于二次指数平滑法的结果。将过去年份的预测值添加到DataFrame df的'predict'列中,并打印出a和b的值。
: e0 i0 ]$ m4 E# 计算未来年的预测值* Q& X4 D1 |! I" z9 I
pred_df = df.copy()9 ^( R. S- K# J% B1 b
for i in range(5):
( w% i, ~/ o9 ]1 w1 X8 x    pred_df = pd.concat([pred_df, pd.DataFrame({7 ]! t7 G3 f. G! D0 {' A
        't': [10+i+1],
, p5 e2 ]7 x% ~3 m3 t* }        'predict': a + b*i,
- q! G" g% d( I1 b, a' N    })])5 Z: o# s( F& l- w8 X! n+ R) [5 s
pred_df7 {. f0 ]5 W* Z! X
' x2 ]; C! l. r, _8 P0 ?
这段代码使用线性表达式计算了未来5年的预测值,并将结果添加到新的DataFrame pred_df中。, t& {; W3 R2 o
# 画图( ^( H4 K" g, v; o  v
import matplotlib.pyplot as plt- _5 I; a' Z' s! n& v1 f! N# }

* I' f, `1 `& B4 X* U$ \plt.plot(pred_df['t'], pred_df['production'],label='production')0 T" u4 a; {2 W1 D7 b! v* v$ x! ?
plt.scatter(pred_df['t'], pred_df['production'])
& \: `7 b. `! J2 S5 M4 P( l& Hplt.plot(pred_df['t'], pred_df['s1'],label='s1')$ v8 t( ]. b0 d1 j
plt.scatter(pred_df['t'], pred_df['s1']): h% X2 u, ?% f8 F, ?, i" A( v
plt.plot(pred_df['t'], pred_df['s2'],label='s2')0 Z7 z0 N* s' P* W/ [/ G. H
plt.scatter(pred_df['t'], pred_df['s2'])
! w4 r  y4 L8 g! Dplt.plot(pred_df['t'], pred_df['predict'],label='predict')
, k8 B4 c5 A- y, C' W# N8 Uplt.scatter(pred_df['t'], pred_df['predict'])
( G$ m: b% ^( }. C: M0 z) Oplt.legend()% m1 i' J: b2 Q' O4 @
* ?6 c% o+ F, _- M$ ^" }9 j
这段代码使用matplotlib库将实际产量、一次指数平滑、二次指数平滑和预测值的曲线图绘制出来。
' f; G4 z2 U' I* R0 F6 o8 `+ C3 J希望以上解释对你有帮助。如果你还有任何问题,请随时提问。* k, w8 L# g* q/ {) m
' R/ |# i) ]5 ]6 [5 u
1 S# R4 P6 D, j9 L

24.exponential_smoothing.py

1.64 KB, 下载次数: 1, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5