当前位置: 首页 > news >正文

【时间序列】时间序列预测基本方法:移动平均(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)

S M A t SMA_t SMAt ( n ) (n) (n) = 1 n \frac{1}{n} n1 ∑ i = t − n + 1 t \textstyle\sum_{i=t-n+1}^t i=tn+1t x n x_n xn
n n n是窗口大小, S M A t SMA_t SMAt表示 t t t时刻的移动平均值

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类似,但是在计算平均数时不是等量齐观的,可以给最近的观测值相对历史观测值更大的权重。比容,最近的用电量对预测日最有影响力,历史用电量随着时间拉长影响力越小。
W M A t WMA_t WMAt ( n ) (n) (n) = w 1 x t + w 2 x t − 1 + . . . + w n − 1 x t − n + 2 + x t − n + 1 w 1 + w 2 + . . . + w n \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
n n n是窗口大小, W M A t WMA_t WMAt表示 t t t时刻的移动平均值。
权重系数为 n 到 0 n到0 n0,即最近的一个数值权重为 n n n,次近的为 n − 1 n-1 n1,以此类推,直到 0 0 0
W M A t WMA_t WMAt ( n ) (n) (n) = n x t + ( n − 1 ) x t − 1 + . . . + 2 x t − n + 2 + x t − n + 1 n + ( 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提供了一个更明显的指标,能更快地反映最近的趋势。

E M A t EMA_t EMAt = x t + ( 1 − α ) x t − 1 + ( 1 − α ) 2 x t − 2... + ( 1 − α ) t x 0 1 + ( 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
t t t是窗口大小, 0 < α < = 1 0<\alpha<=1 0<α<=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

相关文章:

  • 电脑重装系统开机后运行慢怎么办
  • [高性能] 关于如何高效的往本地写入视频
  • 【C++】string类
  • 一级建造师考试大纲要改版了?对2022年的考试有影响吗?
  • CSS 伪类选择器 last-child 和 last-of-type 的区别
  • string
  • Vue简介及简单应用
  • 停止线程的方法
  • java计算机毕业设计计算机专业在线学习评估软件-演示录像-源码+数据库+系统+lw文档+mybatis+运行部署
  • STM32Cube学习(2)——定时器中断
  • jenkins安装部署(前端+后端)自动发布
  • docker logs 命令
  • 数据结构和算法-全文总结
  • 漏洞复现-CVE-2022-1388命令执行F5 BIG-IP iControl REST
  • labelme标注及标签的统一
  • JS 中的深拷贝与浅拷贝
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • conda常用的命令
  • Golang-长连接-状态推送
  • leetcode98. Validate Binary Search Tree
  • Linux后台研发超实用命令总结
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PAT A1017 优先队列
  • PHP 小技巧
  • PHP变量
  • PHP面试之三:MySQL数据库
  • Spring Cloud中负载均衡器概览
  • vue的全局变量和全局拦截请求器
  • 从重复到重用
  • 高度不固定时垂直居中
  • 两列自适应布局方案整理
  • 爬虫模拟登陆 SegmentFault
  • 实现菜单下拉伸展折叠效果demo
  • 数据科学 第 3 章 11 字符串处理
  • Python 之网络式编程
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​​​【收录 Hello 算法】9.4 小结
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • %check_box% in rails :coditions={:has_many , :through}
  • (3)STL算法之搜索
  • (Git) gitignore基础使用
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (三分钟)速览传统边缘检测算子
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Windows2003安全设置/维护
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现