1. 说明

 用傅立叶变换预测时序数据,原理是把时域数据转换到频域,再转换回来.python的numpy和scipy里面都有现成的转换工具fft()和ifft(),但使用时会遇到一个问题:比如25天的数据转到频域再转回时域,还是25天,虽然拟合了数据,但没法直接预测未来,本篇介绍用它实现预测的方法.

2. 傅立叶变换

(1) 相关知识

 之前写过关于傅立叶变换原理的文档,这次就不再重复了,具体请见:https://www.jianshu.com/p/9e786be6dccb 本篇只从程序的角度看如何使用它. 经过FFT转换的数据和转换前长度一致,每个数据分为实部和虚部两部分,假设时序时数长度为N(N最好是2的整数次幂,这样算起来更快),用fft()转换后:下标为0和 N /2的两个复数的虚数部分为0,下标为i和 N - i 的两个复数共辄,也就是其虚部数值相同、符号相反。再用ifft()从频域转回时域之后,出现了由误差引起的很小的虚部,用np.real()取其实部即可.
 由于一半是另一半的共轭,因此只需要关心一半数据.fft转换后下标为0的实数表示时域信号中的直流成分(不随时间变化),下标为i的复数 a + bj,其中a表示余弦成分,b表示其正弦成分.

(2) 示例功能

 数据是航空乘客数据"AirPassengers.csv",可以从CSDN下载,其中包括从1949-1960年,每月旅客的数量,程序预测未来几年的旅客数据.

 如图所示,数据为非平稳数据,其趋势向上,且波动加俱,为将其变为平稳数据, 先对其做了对数和差分处理.

(3) 示例代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 函数功能:将频域数据转换成时序数据
# bins为频域数据,n设置使用前多少个频域数据,loop设置生成数据的长度def fft_combine(bins, n, loops=1):length = int(len(bins) * loops)data = np.zeros(length)index = loops * np.arange(0, length, 1.0) / length * (2 * np.pi)for k, p in enumerate(bins[:n]):if k != 0 : p *= 2 # 除去直流成分之外, 其余的系数都 * 2data += np.real(p) * np.cos(k*index) # 余弦成分的系数为实数部分data -= np.imag(p) * np.sin(k*index) # 正弦成分的系数为负的虚数部分return index, dataif __name__ == '__main__':data = pd.read_csv('AirPassengers.csv')ts = data['Passengers']# 平稳化ts_log = np.log(ts)ts_diff = ts_log.diff(1)ts_diff = ts_diff.dropna()print(fy[:10]) # 显示前10个频域数据fy = np.fft.fft(ts_diff)conv1 = np.real(np.fft.ifft(fy)) # 逆变换index, conv2 = fft_combine(fy / len(ts_diff), int(len(fy)/2-1), 1.3) # 只关心一半数据plt.plot(ts_diff)plt.plot(conv1 - 0.5) # 为看清楚,将显示区域下拉0.5plt.plot(conv2 - 1)
plt.show()

(4) 运行结果

[ 1.34992672+0. j -0.09526905-0.14569535j -0.03664114-0.12007802j-0.2670005 +0.24512406j -0.10075074+0.0314084 j -0.26409417+0.04197159j0.14411338+0.18703009j 0.07467991+0.05367644j -0.26663142+0.15324939j0.03248223+0.14130114j]

(5). 示例分析

 输出的是fft转换后的数据,只显示了前十个,形式为复数.复数模(绝对值)的两倍为对应频率的余弦波的振幅;复数的辐角表示对应频率的余弦波的相位。第0个元素表示直流分量,虚部为0.在数据中的位置标记了频率大小,值标记了振幅大小.
 图中显示的三条曲线分别为原始数据,做了fft以及ifft逆变换后的数据,以及fft后自己实现算法还原并预测了未来的数据,从图中可见,基本拟合了原始曲线,预测曲线看起来也比较合理.
 上述方法可实现用傅里叶变换预测时序数据.与ARMA算法相比,它没有明显衰减,更适合长时间的预测.
 对于随时间变化的波形,比如语音数据,一般使用加窗后做傅立叶变量的方法拟合数据.

3. 小波变换

(1) 相关知识

 有了傅立叶变换,为什么还用小波呢?上面提到,如果波型随时间变化,就需要对波型加窗分段后再处理,而且有时候需要大窗口,有时候需要小窗口,处理起来就更加麻烦.于是引入了更灵活的小波.
 傅立叶变换的基是正余弦函数,而小波的基是各种形状小波,也就是说它把整个波形看成是多个位置和宽度不同的小波的叠加.小波有两个变量:尺度a和平移量t,尺度控制小伸的伸缩,平移量控制小波的平移,它不需将数据切分成段,就可以处理时变数据.尤其对突变信号处理得更好.
 下图是几种常见的小波.

 离散小波变换,Discrete Wavelet Transformatio (dwt),可以说是小波变换中最简单的一种。这里使用Python调用pywt库实现最简单的功能.
 经过变换之后的返回值:cA:Approximation(近似), cD:Detail(细节),其中近似cA是周期性有规律的部分,可以被模拟和预测,而cD可看做是噪声。换言之,用此方法可以拆分周期性数据,和其上的扰动数据。

(2) 示例功能

 示例使用的仍然是乘客数据,下面代码是将细节D设为0,然后还原。

(3) 示例代码

import pywt
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltif __name__ == '__main__':data = pd.read_csv('AirPassengers.csv')ts = data['Passengers']# 平稳化ts_log = np.log(ts)ts_diff = ts_log.diff(1)ts_diff = ts_diff.dropna()cA,cD = pywt.dwt(ts_diff, 'db2')cD = np.zeros(len(cD))new_data = pywt.idwt(cA, cD, 'db2')plt.plot(ts_diff)plt.plot(new_data - 0.5)plt.show()

(4) 运行结果

(5) 示例分析

 可以看到,用小波拟合的效果也还可以,一般可以使用小波拟合cA,使用ARMA拟合cD部分,两种方法配合使用.

时序预测之三_傅立叶和小波变换相关推荐

  1. python rpy2时间序列_时间序列(二):时序预测那些事儿

    在上一篇文章中,我们简略介绍了与时间序列相关的应用,这次我们聚焦于时间序列的预测,讲讲与之相关的那些事. 1. 效果评估 设 y 是时间序列的真实值, yhat 是模型的预测值.在分类模型中由于y是离 ...

  2. 阿里达摩院最新FEDformer,长程时序预测全面超越SOTA | ICML 2022

    ©作者 | Qingsong 单位 | 阿里达摩院决策职能实验室 论文标题: FEDformer: Frequency Enhanced Decomposed Transformer for Long ...

  3. 时序预测的三种方式:统计学模型、机器学习、循环神经网络

    作者 | luanhz 来源 | 小数志 导读 时序预测是一类经典的问题,在学术界和工业界都有着广泛的研究和应用.甚至说,世间万物加上时间维度后都可抽象为时间序列问题,例如股票价格.天气变化等等.关于 ...

  4. 使用条件分布模态流进行多变量概率时序预测

    使用条件分布模态流进行多变量概率时序预测 译者的话 时序预测是一个古老的话题.有许多基于数理统计的经典算法曾经大放异彩.但随着大数据时代的到来,数据量的急剧增长以使得传统的分析方式在可行性上已初现窘迫 ...

  5. 手动搭建transformer模型进行时序预测,股票预测

    手动搭建transformer模型,时序预测 一.数据 股票的数据具有时序性,采用股票数据来进行预测 下载随机一只股票历史数据进行处理,此次选用600243的数据 在这一步直接设定batch为1了,需 ...

  6. 用神经网络做单变量时序预测,如何构造神经网络的输入呢?

    用神经网络做单变量时序预测,如何构造神经网络的输入呢? 单变量时序预测是一种常见的时间序列分析问题,神经网络可以用于对单变量时序数据进行预测.神经网络的输入通常是过去一段时间的数据,输出是未来一个时间 ...

  7. 时序预测:从两篇高影响力的论文谈起

    未来可以预测吗? 本文从两篇高影响力的时序预测文章谈起,其中一篇是18年放在arXiv上的文章,文中总结性地提出了时序卷积网络(TCN: Temporal Convolutional Network) ...

  8. ​KDD 2020 开源论文 | 图神经网络多变量时序预测

    ©PaperWeekly 原创 · 作者|马敏博 学校|西南交通大学硕士生 研究方向|命名实体识别 本次分享的论文是 KDD 2020 的一篇工作,出发点是为了更好地建模多变量时间序列数据中成对变量之 ...

  9. 分类预测回归预测_我们应该如何汇总分类预测?

    分类预测回归预测 If you are reading this, then you probably tried to predict who will survive the Titanic sh ...

最新文章

  1. 设计模式之笔记--装饰模式(Decorator)
  2. 全球及中国蓝牙智能锁行业发展格局及投资经营效益分析报告2022-2027年
  3. 回文树笔记(转自quack_quack)
  4. HoloLens开发手记- SpectatorView for iOS编译指南
  5. 用户权限管理——DB设计篇
  6. java 函数签名,Java签名getAlgorithm()方法
  7. 为什么很多程序员不用switch,而是大量的if……else if?
  8. MYSQL命令行常用命令
  9. 真正智能的语音识别系统离我们还有多远
  10. 药物临床试验数据递交FDA的规定
  11. 设计模式之职责链模式(责任链模式)
  12. windows2008server实现端口映射代理
  13. 群发邮件服务器软件,邮件服务器软件:邮件群发是否已死?
  14. 应用内更新,直接跳转到对应手机应用市场
  15. node-red实现MQTT通讯
  16. Kernel.org hacked – how to get Android repo?
  17. Python OpenCV3 计算机视觉秘籍:1~5
  18. 【持续更新】机器学习特征工程实用技巧大全
  19. 微信支付信用卡还款将收费;小米宣布进军西欧市场;Uber筹备第二代自动驾驶汽车丨价值早报
  20. Java设计安全的登录接口

热门文章

  1. 区块链学习笔记二之区块链的加密技术
  2. 运维之DNS服务器Bind9配置解析和基础示例及附带命令
  3. 40+倍提升,详解 JuiceFS 元数据备份恢复性能优化之路
  4. max3490esa_MAX1661EUB-T_maxim芯片后缀tg16是什么意思
  5. 笔记本清理风扇和散热片灰尘
  6. asp.net线上宠物商店系统
  7. ACRCloud音乐识别python3版SDK,acrcloud_extr_tool.so导入报错
  8. Echarts安装失败
  9. Express(一) ——简单入门
  10. JAVA有percentile函数吗_五分位算法