当前位置:   article > 正文

利用深度学习进行时间序列预测_深度学习时间序列预测

深度学习时间序列预测

作者|Christophe Pere 编译|VK 来源|Towards Datas Science

介绍

长期以来,我听说时间序列问题只能用统计方法(AR[1],AM[2],ARMA[3],ARIMA[4])。这些技术通常被数学家使用,他们试图不断改进这些技术来约束平稳和非平稳的时间序列。

几个月前,我的一个朋友(数学家、统计学教授、非平稳时间序列专家)提出让我研究如何验证和改进重建恒星光照曲线的技术。事实上,开普勒卫星[11]和其他许多卫星一样,无法连续测量附近恒星的光通量强度。开普勒卫星在2009年至2016年间致力于寻找太阳系外的行星,称为太阳系外行星或系外行星。

正如你们所理解的,我们将比我们的行星地球走得更远一点,并利用机器学习进入银河之旅。天体物理学一直是我的挚爱。

这个notebook可以在Github上找到:https://github.com/Christophe-pere/Time_series_RNN。

RNN,LSTM,GRU,双向,CNN-x

那么我们将在哪个模型上进行这项研究?我们将使用循环神经网络(RNN[5]),LSTM[6]、GRU[7]、Stacked LSTM、Stacked GRU、双向LSTM[8]、双向GRU以及CNN-LSTM[9]。

对于那些热衷于树的人,你可以在这里找到一篇关于XGBoost和时间序列的文章,作者是jasonbrownley。github上提供了一个关于时间序列的很好的存储库:https://github.com/Jenniferz28/Time-Series-ARIMA-XGBOOST-RNN

对于那些不熟悉RNN家族的人,把它们看作是具有记忆效应和遗忘能力的学习方法。双向来自体系结构,它是指两个RNN,它将在一个方向(从左到右)和另一个方向(从右到左)“读取”数据,以便能够最好地表示长期依赖关系。

数据

如前文所述,这些数据对应于几颗恒星的通量测量值。实际上,在每一个时间增量(小时),卫星都会测量来自附近恒星的通量。这个通量,或者说是光强度,随时间而变化。这有几个原因,卫星的正确移动、旋转、视角等都会有所不同。因此,测量到的光子数会发生变化,恒星是一个熔化的物质球(氢和氦聚变),它有自己的运动,因此光子的发射取决于它的运动。这对应于光强度的波动。

但是,也可能有行星,系外行星,它们干扰恒星,甚至从恒星之间穿过卫星的视线(凌日方法[12])。这条通道遮住了恒星,卫星接收到的光子较少,因为它们被前面经过的行星挡住了(一个具体的例子是月球引起的日食)。

通量测量的集合被称为光曲线。光曲线是什么样子的?以下是一些示例:

不同恒星之间的通量非常不同。有的噪音很大,有的则很稳定。通量仍然呈现异常。在光照曲线中可以看到孔或缺少测量。我们的目标是看是否有可能在没有测量的情况下预测光曲线的行为。

数据缩减

为了能够使用模型中的数据,有必要进行数据简化。这里将介绍两种方法,移动平均法和窗口法。

移动平均线:

移动平均包括取X个连续点并计算它们的平均值。这种方法可以减少变异性,消除噪声。这也减少了点的数量,这是一种下采样方法。

下面的函数允许我们从点列表中计算移动平均值,方法计算点的平均值和标准差的数字。

def moving_mean(time, flux, lag=5):
    '''
    该函数通过设定平均值,使数据去噪,减少数据量。
    @param time: (list) 时间值列表
    @param flux: (list) 浮点列表->恒星通量
    @param lag: (int) 平均值个数,默认值5
    @return X: (list) 时间调整
    @return y: (list) 通量按平均值重新标定
    @return y_std: (list) 标准差列表
    '''
    # 让我们做一些简单的代码
    # 空列表
    X = []
    y = []
    y_std = []
    j = 0 # 增量
    for i in range(int(len(flux)/lag)):
        X.append(np.mean(time[(i+j):(i+j+lag)]))
        y.append(np.mean(flux[(i+j):(i+j+lag)]))
        y_std.append(np.std(flux[(i+j):(i+j+lag)]))
        j+= lag


    return X, y, y_stdn  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

可以看到函数在输入中接受3个参数。时间和通量是时间序列的x和y。lag 是控制计算时间和通量平均值以及通量标准差时所考虑的数据个数。

现在,我们可以看看如何使用这个函数以及通过转换得到的结果。

# #导入所需的包
matplotlib inline
import scipy
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sklearn
import tensorflow as tf
# 让我们看看进度条
from tqdm import tqdm
tqdm().pandas()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

现在我们需要导入数据。文件kep_lightcurves.csv包含着数据。每颗恒星有4列,原始磁通量(“…orig”),重新缩放的通量是原始磁通量减去平均磁通量(“…rscl’”)、差值(“…diff”)和残差(“…_res”)。总共52列。

# 20个数据点
x, y, y_err  = moving_mean(df.index,df["001724719_rscl"], 20)
  • 1

df.index表示时间序列的时间

df[" 001724719_rscl "] 重新缩放的通量(" 001724719 ")

lag=20是计算平均值和std的数据点的个数

前面3条光照曲线的结果:

窗口方法

第二种方法是窗口方法,它是如何工作的?

你需要取很多点,在前一个例子中是20,然后计算平均值(与前面的方法没有区别),这个点是新时间序列的开始,它在位置20(偏移19个点)。但是,窗口不是移动到下2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/743896
推荐阅读
相关标签
  

闽ICP备14008679号