QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2740|回复: 0
打印 上一主题 下一主题

ARIMA模型 指数平滑法

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-20 10:30 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
当涉及到时间序列数据分析和预测时,指数平滑法是一种常用的方法之一。它是一种简单而有效的平滑技术,可以用于处理具有趋势和季节性的时间序列数据。6 L/ m  h( R3 ^8 s9 ~
指数平滑法基于以下假设:
" a8 N7 d8 R  Z5 _1.过去的观测值对于预测未来的值更为重要。
. d0 j( M. O6 C+ M2.近期的观测值对于预测的影响程度比过去的观测值更大。, D& L) ^; ^2 u% U
3.观测值中的随机波动应该被消除,使得预测值更稳定。1 g9 `2 @) r$ o; E4 Q( w% `
) i8 a8 Q/ E) l
指数平滑法有几种不同的变体,其中最常见的是简单指数平滑、二次指数平滑和三次指数平滑。! \& A* E  q- L( b  F
( @3 R8 C% q4 A0 x. R4 m2 b! G, \! E
4.简单指数平滑(Simple Exponential Smoothing):. q7 C4 ~. p  j2 q
简单指数平滑方法将所有观测值视为等权重,并使用一个平滑参数(通常表示为α)来确定各个观测值的权重。具体来说,简单指数平滑法的计算公式如下:
. l; p& Z/ `" E! e' I* ^8 z5 `, ~3 Q* q9 H! u; _& l
5.初始值:S₁ = X₁+ K  j3 e. P) C: M! ?. t
6.平滑公式:Sₜ = α * Xₜ + (1 - α) * Sₜ₋₁- X8 X% u# H$ k& E; j
其中,Sₜ表示时刻 t 的平滑值,Xₜ表示时刻 t 的观测值。
0 y! J# D( t! F( p7.二次指数平滑(Double Exponential Smoothing):' p' p0 [* u* F& y! f
二次指数平滑法相对于简单指数平滑法,将趋势也纳入考虑。它不仅考虑过去观测值的权重,还考虑了过去观测值的趋势。具体来说,二次指数平滑法的计算公式如下:
! l% S, c# E$ [6 q  `: A
5 \9 \! G& e9 z  H- s, ~8.初始水平值:L₁ = X₁' m8 e# d. N$ t; v! J% d! J3 B
9.初始趋势值:T₁ = X₂ - X₁
6 h, E4 S6 F7 ]- U) Y- ^10.平滑公式(水平值):Lₜ = α * Xₜ + (1 - α) * (Lₜ₋₁ + Tₜ₋₁)* B. ~9 N5 v# t- b) `! \/ g8 v4 m
11.平滑公式(趋势值):Tₜ = β * (Lₜ - Lₜ₋₁) + (1 - β) * Tₜ₋₁
8 Y9 ?+ C1 x5 E( M# W7 e& f/ t其中,Lₜ表示时刻 t 的水平值,Tₜ表示时刻 t 的趋势值,Xₜ表示时刻 t 的观测值,α和β是平滑参数。
6 I" [, f% L& j7 U12.三次指数平滑(Triple Exponential Smoothing):
3 i# I- v+ D: S- {三次指数平滑法是在二次指数平滑法的基础上进一步考虑了季节性的影响。它适用于具有明显季节性模式的时间序列数据。具体来说,三次指数平滑法的计算公式如下:7 L/ _& V& @7 f: s2 V2 x+ a  t

5 J4 e$ w7 {. I13.初始水平值:L₁ = X₁* r0 f0 L( b* C3 l. f" E0 b6 K: r
14.初始趋势值:T₁ = X₂ - X₁
3 I! i5 b3 `9 s; Z; ^: v* i15.初始季节性值:S₁ = X₃ - 2T₁ - L₁
3 }% I; |3 x) P- U16.平滑公式(水平值):Lₜ = α * (Xₜ - Sₜ₋₃) + (1 - α) * (Lₜ₋₁ + Tₜ₋₁)
) k2 N# J% D/ w! r/ p17.平滑公式(趋势值):Tₜ = β * (Lₜ - Lₜ₋₁) + (1 - β) * Tₜ₋₁' x3 j7 B# q! m) C
18.平滑公式(季节性值):Sₜ = γ * (Xₜ - Lₜ - Tₜ) + (1 - γ) * Sₜ₋₃  E0 r/ g) {: X2 H
其中,Lₜ表示时刻 t 的水平值,Tₜ表示时刻 t 的趋势值,Sₜ表示时刻 t 的季节性值,Xₜ表示时刻 t 的观测值,α、β和γ是平滑参数。/ f, s4 o: u6 V: c2 l# t

- U; L) v8 }5 H, t  n请注意,指数平滑法适用于简单的时间序列模式,例如渐变性趋势或没有明显季节性模式的数据。对于更复杂的模式,如长期趋势、季节性和其他周期性模式,可以考虑使用更高级的模型,例如ARIMA模型。
" G4 H2 i% F3 W- {ARIMA(Autoregressive Integrated Moving Average)模型是一种常用于时间序列分析和预测的统计模型,它将自回归(AR)、差分(I)和移动平均(MA)三种方法结合在一起。ARIMA模型根据时间序列数据的自相关性和移动平均性来拟合模型,并用于预测未来的数值。ARIMA模型通常用于处理具有复杂模式的时间序列数据,如具有长期趋势、季节性和周期性模式的数据。3 G* R  O6 l$ F: a0 t6 {  L

5 v  f# p. y: x4 K+ O# 导入所需的库
7 ]& x* A' L  [$ n, [2 m  Q  N( _import numpy as np6 m# N3 c8 d3 Y- b
import pandas as pd
! B# ~% ]. R& C5 ^- u& ]) g9 h
! o" _; @  K1 U# 源数据* \+ e. E$ S/ G% l
df = pd.DataFrame({
4 y3 K( m$ t, i' ~    't': [i for i in range(1, 11)],
9 d) g- d' [8 `8 H9 _1 ^    'production': [2031, 2234, 2566, 2820, 3006,
& K& R. o- E% ^+ t5 l/ r                   3093, 3277, 3514, 3770, 4107],
+ k, F# t: {& M( L; n})
& u  d6 }1 |1 N; U( _; Y
2 d5 m( p, K# c# Z: H. N9 X' {这段代码创建了一个DataFrame df,包含了时间(t)和产量(production)的数据。' P; d; w# s3 ?7 D
# 设 alpha=.3,计算一次、二次指数平滑1 V  S' [3 w! R6 E" b1 @7 H3 s$ U
alpha = .3
. U& a% l  q/ A8 Zs1, s2 = [int(df['production'][0])],\
7 I/ Y+ O2 w8 }7 y' S* U& |- V    [int(df['production'][0])]( ]) c9 @$ R8 _+ I) F( \
: s- \  K8 f9 f2 b4 O! u0 P
for i in range(1, len(df['t'])):
; M: N) ]9 B5 `( `' T7 b# Q    s1.append(alpha*df['production'][i] + (1-alpha)*s1[i-1])- K4 V7 `/ m' }0 G$ u
    s2.append(alpha*s1[i] + (1-alpha)*s2[i-1])- S. w$ X( g8 I# x, s
df['s1'] = s1
$ p7 V8 R0 A" F( o6 r8 qdf['s2'] = s2
$ h( G# C$ _' F8 i( n( K, M4 `' t/ Z0 S8 n6 u
这段代码使用指数平滑法计算了一次指数平滑和二次指数平滑的值,并将结果添加到DataFrame df中的's1'和's2'列中。& K/ X: ?* i9 |! V1 M; f
# 计算过去年的预测值,以及未来年的线性表达式
& m: @/ O6 @+ j  Zpredict_list = [None]
1 w3 Z1 W- u+ t/ G( yfor i in range(len(df['t'])-1):( e: M2 d+ D8 V3 }3 A, I5 @) j7 A
    a = 2*df['s1'][i] - df['s2'][i]2 A4 T' [3 d8 p5 n4 Q1 Z3 N
    b = (alpha / (1-alpha)) * (df['s1'][i] - df['s2'][i])4 o0 w8 u9 P& V" N  f2 h2 s) H! ~2 u
    predict_list.append(a + b)
6 O0 t3 t* W) f& s: A$ x8 B
$ \4 a  i! t3 Y% x* J6 ?8 Jt = 10
% [+ w& \1 O& ka = 2*df['s1'][t-1] - df['s2'][t-1]* t3 P1 }5 R# `$ U# Y6 |6 V6 L
b = (alpha / (1-alpha)) * (df['s1'][t-1] - df['s2'][t-1])5 Z: s$ e; W! @% s$ Y
df['predict'] = predict_list: @$ z! B# u& ?6 l% w+ n4 p& t3 a
print('at =', a)
+ D$ B; Z# k8 G* m5 K" Tprint('bt =', b)
0 [/ @4 s: r3 s& g) I$ h8 Y# M3 C! Q2 \
这段代码计算了过去年份的预测值,并给出了未来年份的线性表达式。其中a和b是线性表达式的参数,对应于二次指数平滑法的结果。将过去年份的预测值添加到DataFrame df的'predict'列中,并打印出a和b的值。7 _2 X$ K5 l! V3 h2 o2 [* B
# 计算未来年的预测值
! A) L+ D0 B$ t' m& xpred_df = df.copy()
& J1 ~  J/ ~# z: [8 E+ e: Lfor i in range(5):
  Q% |; u2 O( f" U8 H! h    pred_df = pd.concat([pred_df, pd.DataFrame({/ W1 v( d8 e: \# L0 ]" |) V- K3 n' G
        't': [10+i+1],1 ~! x  N) `$ G0 ?5 g% s* \
        'predict': a + b*i,3 Z& R: w) S5 K4 n, r9 l0 M" w  o& y
    })])
  B: [0 q: O, J+ {  R) `pred_df
, F% e( v7 R& R' n0 ?& a
; S: P& Z  x: ]+ g! D) y% }, r& N# ~这段代码使用线性表达式计算了未来5年的预测值,并将结果添加到新的DataFrame pred_df中。
( q/ @  {) p* {0 u# 画图
8 I% v$ Z% U* p2 I, yimport matplotlib.pyplot as plt
( i1 j* t) x# U9 x3 w6 Q5 D4 U; n, d( _, a' B0 t: V2 f# y
plt.plot(pred_df['t'], pred_df['production'],label='production')- X  C/ P) R& O6 i) q* N
plt.scatter(pred_df['t'], pred_df['production'])2 Q; r% S; j8 C3 T* A, n
plt.plot(pred_df['t'], pred_df['s1'],label='s1')
0 w3 L3 |8 D; h0 ^" J7 Nplt.scatter(pred_df['t'], pred_df['s1'])
6 F- M4 z" C3 Z: d: Aplt.plot(pred_df['t'], pred_df['s2'],label='s2')
, y% u( `) m, i  s+ nplt.scatter(pred_df['t'], pred_df['s2'])3 o+ {( R5 f0 `- Y4 ~. U' ~1 h
plt.plot(pred_df['t'], pred_df['predict'],label='predict')% O+ n1 g$ }6 K! S
plt.scatter(pred_df['t'], pred_df['predict'])7 E) i. p1 ~' W9 P& g4 O2 L9 J/ m4 x
plt.legend()
0 s7 m5 L% i* {4 s& `4 G+ r. a7 B& e9 y4 j; v
这段代码使用matplotlib库将实际产量、一次指数平滑、二次指数平滑和预测值的曲线图绘制出来。1 y8 v( `) L' h% A6 @' T
希望以上解释对你有帮助。如果你还有任何问题,请随时提问。
+ w# z" l! S! V
0 ]' C; a4 a# ^
) g+ X0 f$ g: [7 g5 o1 ~. H

24.exponential_smoothing.py

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

售价: 2 点体力  [记录]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-8-6 07:46 , Processed in 0.451434 second(s), 55 queries .

回顶部