【时间序列】时间序列预测基本方法:移动平均(SMA,EMA,WMA)

部署运行你感兴趣的模型镜像

时间序列预测基本方法:移动平均(SMA,EMA,WMA)

移动平均作为时间序列中最基本的预测方法,计算简单却很实用。不仅可以用来做预测,还有一些其他的重要作用,比如平滑序列波动,揭示时间序列的趋势特征

移动平均简而言之即使用前n个时刻的观测值来预测下一个时刻的取值。移动平均可以分为简单移动平均、加权移动平均、指数移动平均等。注意:移动平均用于预测场景时,尤其是多步预测,需要要求序列相对平稳,没有趋势、季节性的情况

问题公式化

给定一个时间序列{Xt},观测值序列为:x1,x2,…,xt
xt+1为可预测为前n项的平均值,即xt+1=E({xt-n+1,xt-n+2,…,xt}),n表示窗口大小需要往前推多少时刻。

移动平均能够去除时间序列的短期波动,使得数据变得平滑,从而可以方便的看出序列的趋势特征。原序列波动较大,经过移动平均后,随机波动会明显减少,窗大小n越大,平滑后波动越小,滞后越明显。

简单移动平均(Simple Moving Average,SMA)

SMAtSMA_tSMAt(n)(n)(n) = 1n\frac{1}{n}n1 ∑i=t−n+1t\textstyle\sum_{i=t-n+1}^ti=tn+1t xnx_nxn
nnn是窗口大小,SMAtSMA_tSMAt表示ttt时刻的移动平均值

SMA案例代码
# 导包
import numpy as np
from pandas import read_csv
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
df = pd.read_csv('household_power_consumption_days.csv', sep=',', header=0,
                      usecols=[0,1],parse_dates={'date':[0]},index_col=['date'])
# 真实数据列'Global_active_power'
real = df['Global_active_power']

# 取前6个时刻的数据预测下一时刻的数据
rolling = df['Global_active_power'].rolling(window=6)
rolling_mean = rolling.mean()

# 查看真实数据的维度和预测数据的维度
print("real Shape-- ",real.shape)#(1442,)
print("rolling_mean Shape-- ",rolling_mean.shape)#(1442,)

预测结果可视化

# 取最后258个时刻的数据绘图
plt.plot(real[-260:-2], color = 'red', label = 'Real')
plt.plot(rolling_mean[-260:-2], color = 'blue', label = 'Predicted')
plt.xlabel('Time')
plt.legend()
plt.show()

在这里插入图片描述

计算误差

real = real[-260:-2]
pred = rolling_mean[-260:-2]

from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
# 计算误差
mae = mean_absolute_error(pred,real)
mse = mean_squared_error(pred,real)
print("MAE:",mae) # MAE: 218.50487338501293
print("MSE:",mse) # MSE: 90166.86320972697

加权移动平均(Weighted Moving Average,WMA)

与SMA类似,但是在计算平均数时不是等量齐观的,可以给最近的观测值相对历史观测值更大的权重。比容,最近的用电量对预测日最有影响力,历史用电量随着时间拉长影响力越小。
WMAtWMA_tWMAt(n)(n)(n) = w1xt+w2xt−1+...+wn−1xt−n+2+xt−n+1w1+w2+...+wn\frac{ w_1x_t+w_2x_t-1+...+w_n-1x_t-n+2+x_t-n+1 }{w_1+w_2+...+w_n}w1+w2+...+wnw1xt+w2xt1+...+wn1xtn+2+xtn+1
nnn是窗口大小,WMAtWMA_tWMAt表示ttt时刻的移动平均值。
权重系数为n到0n到0n0,即最近的一个数值权重为nnn,次近的为n−1n-1n1,以此类推,直到000
WMAtWMA_tWMAt(n)(n)(n) = nxt+(n−1)xt−1+...+2xt−n+2+xt−n+1n+(n−1)+...+2+1\frac{nx_t+(n-1)x_t-1+...+2x_t-n+2+x_t-n+1 }{n+(n-1)+...+2+1}n+(n1)+...+2+1nxt+(n1)xt1+...+2xtn+2+xtn+1

WMA案例代码
# 导包
import numpy as np
from pandas import read_csv
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
df = pd.read_csv('household_power_consumption_days.csv', sep=',', header=0,
                      usecols=[0,1],parse_dates={'date':[0]},index_col=['date'])
# 真实数据列'Global_active_power'
real = df['Global_active_power']

# 权重函数
def WMA(close, n):
    weights = np.array(range(1, n+1))
    sum_weights = np.sum(weights)

    res = close.rolling(window=n).apply(lambda x: np.sum(weights*x) / sum_weights, raw=False)
    return res

# 取前6个时刻的数据加权预测下一时刻的数据
df['WMA'] = WMA(df['Global_active_power'],6)
rolling_mean = df['WMA']

# 查看真实数据的维度和预测数据的维度
print("real Shape-- ",real.shape)#(1442,)
print("rolling_mean Shape-- ",rolling_mean.shape)#(1442,)

预测结果可视化

# 取最后258个时刻的数据绘图
plt.plot(real[-260:-2], color = 'red', label = 'Real')
plt.plot(rolling_mean[-260:-2], color = 'blue', label = 'Predicted')
plt.xlabel('Time')
plt.legend()
plt.show()

在这里插入图片描述

计算误差

real = real[-260:-2]
pred = rolling_mean[-260:-2]

from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
# 计算误差
mae = mean_absolute_error(pred,real)
mse = mean_squared_error(pred,real)
print("MAE:",mae) # MAE: 181.05885714285714
print("MSE:",mse) # MSE: 66044.51492577454

指数移动平均(Exponential Moving Average,EMA)

可以看成一种特殊的加权移动平均,也称为指数加权移动平均(EWMA)。与WMA类似,它为以前的数值分配了一系列固定的指数递减权重,即权重系数随着时间呈指数下降。EMA提供了一个更明显的指标,能更快地反映最近的趋势。

EMAtEMA_tEMAt = xt+(1−α)xt−1+(1−α)2xt−2...+(1−α)tx01+(1−α)+(1−α)2+...+(1−α)t\frac{x_t+(1-\alpha)x_t-1+(1-\alpha)^2x_t-2...+(1-\alpha)^tx_0}{1+(1-\alpha)+(1-\alpha)^2+...+(1-\alpha)^t}1+(1α)+(1α)2+...+(1α)txt+(1α)xt1+(1α)2xt2...+(1α)tx0
ttt是窗口大小,0<α<=10<\alpha<=10<α<=1为平滑因子,(1-\alpha)^i为呈指数增加的权重,期数离预测时刻越近权重越大。

EMA案例代码
# 导包
import numpy as np
from pandas import read_csv
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
df = pd.read_csv('household_power_consumption_days.csv', sep=',', header=0,
                      usecols=[0,1],parse_dates={'date':[0]},index_col=['date'])
# 真实数据列'Global_active_power'
real = df['Global_active_power']

# 指数函数,取前6个时刻的数据加权预测下一时刻的数据
df['EMA'] = df['Global_active_power'].ewm(span=6,min_periods=6).mean()
rolling_mean = df['EMA']

# 查看真实数据的维度和预测数据的维度
print("real Shape-- ",real.shape)#(1442,)
print("rolling_mean Shape-- ",rolling_mean.shape)#(1442,)

预测结果可视化

# 取最后258个时刻的数据绘图
plt.plot(real[-260:-2], color = 'red', label = 'Real')
plt.plot(rolling_mean[-260:-2], color = 'blue', label = 'Predicted')
plt.xlabel('Time')
plt.legend()
plt.show()

在这里插入图片描述

计算误差

real = real[-260:-2]
pred = rolling_mean[-260:-2]

from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
# 计算误差
mae = mean_absolute_error(pred,real)
mse = mean_squared_error(pred,real)
print("MAE:",mae) # MAE: 178.27270483176076
print("MSE:",mse) # MSE: 62814.68751826136
SMA:权重系数一致;
WMA:权重系数随时间间隔线性递减;
EMA:权重系数随时间间隔指数递减。

参考文献:

https://zhuanlan.zhihu.com/p/430537478

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

时间序列数据的去噪是数据分析中的一个重要环节,尤其在传感器数据、金融市场数据等领域中,噪声可能会掩盖数据的真实趋势和模式。因此,掌握多种去噪技术对于提升数据分析的准确性至关重要。 ### 常见的时间序列去噪方法 #### 1. 移动平均法(Moving Average) 移动平均是一种简单而有效的时间序列平滑方法,通过计算一定窗口内的平均值来代替原始数据点,从而达到去噪的目的。该方法适用于平稳序列,能够有效减少短期波动带来的噪声影响。常见的变体包括简单移动平均SMA)、加权移动平均WMA)和指数移动平均EMA)。 #### 2. 卡尔曼滤波器(Kalman Filter) 卡尔曼滤波器是一种递归滤波器,能够从一系列带有噪声的测量数据中估计出系统的最优状态。它特别适用于动态系统的时间序列数据,例如传感器采集的实时数据。卡尔曼滤波器通过预测和更新两个步骤来不断修正估计值,从而在存在不确定性的情况下提供较为准确的状态估计[^1]。 #### 3. 小波变换(Wavelet Transform) 小波变换是一种多分辨率分析方法,能够将时间序列数据分解为不同尺度的成分。通过对高频噪声部分进行阈值处理,可以实现对原始数据的有效去噪。小波变换在保留数据突变特征的同时去除噪声,特别适合非平稳时间序列的处理。 #### 4. Savitzky-Golay 滤波器 Savitzky-Golay 滤波器是一种基于局部多项式回归的平滑方法,能够在保留数据特征(如峰谷位置)的同时有效去除噪声。该方法时间序列的平滑与导数估计中表现优异,广泛应用于信号处理和数据分析领域。相比简单的移动平均,Savitzky-Golay 滤波器能更好地保持原始数据的形状特征[^3]。 #### 5. 深度学习模型 近年来,深度学习技术在时间序列去噪中展现出强大能力。常用模型包括: - **自编码器(Autoencoder)**:通过编码器-解码器结构学习数据的低维表示,去除噪声并重构原始信号。 - **循环神经网络(RNN)与长短期记忆网络(LSTM)**:适用于具有时序依赖关系的数据,能够捕捉长期趋势并进行去噪。 - **卷积神经网络(CNN)**:在局部特征提取方面表现优异,可结合时间序列的滑动窗口进行噪声抑制。 这些模型通常需要大量带噪声和干净数据的配对样本进行训练,适合复杂且非线性的时间序列去噪任务[^2]。 ### 示例:使用 Python 实现 Savitzky-Golay 滤波器 ```python import numpy as np import matplotlib.pyplot as plt from scipy.signal import savgol_filter # 生成含噪声的时间序列数据 t = np.linspace(0, 10, 100) y = np.sin(t) + np.random.normal(0, 0.1, t.shape) # 使用 Savitzky-Golay 滤波器进行平滑 y_smooth = savgol_filter(y, window_length=11, polyorder=3) # 绘图对比 plt.plot(t, y, label='Noisy Data') plt.plot(t, y_smooth, label='Smoothed Data', linewidth=2) plt.legend() plt.show() ``` ### 总结 时间序列去噪技术多样,选择合适的方法应根据数据特性(如平稳性、噪声类型)和应用场景(如实时性、可解释性要求)进行综合考虑。传统方法移动平均和卡尔曼滤波器适合线性系统,而深度学习方法则更适合处理复杂的非线性序列。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值