很少有文章是这个AR是啥意思,笔者推测是自相关的意思,毕竟RNN是自回归神经网络。
笔者比较懒,一些符号将就着看吧。
1.原理符号表示
符号表示十分简洁:
Zi,t表示序列i再第t个时间点的数据,Zi,t0就是要预测数据的开始区间,要预测的数据集合定义为Zi:t0:T。这个是LSTM算出来的。
Xi,1:T表示再整个预测期间内都知道的协变量,具体就是你输入的原始数据。
DeepAR求的是概率分布:P(Zi:t0:T|Zi:t0-1,Xi,1:T)
模型结构
模型的图像化显示如下:
DeepAR模型结构
左右都是LSTM结构,大家想象一下LSTM的原理,左右用的数据不一样,一个用的是训练数据,一个用的是预测数据。
下边来说一些不一样的地方
DeepAR与传统LSTM最不一样的地方,就是加这个似然函数,需要取估计参数。一般有两种似然函数形式:
1)真实数据,选择高斯分布,就是正态分布:
高斯分布计算方式
2)正技术数据,我也不知道是啥,选择负二项分布,看原文就知道了。
3)当然其他似然函数也可以用过里啊。
训练
参数优化形式
以上就是deepar的基本原理,本质就是lstm+softplus,具体怎么输出的还在研究,通过研究亚马逊开源的包吧。不过看别人写的文章大概率是那个softplus中的u就是均值。
2.模仿tensorflow实现
这个参考自“虚胖一场”的https://www.jianshu.com/p/e9533f5799f1,特此鸣谢。
用这个是为了学学tensorflow2.0。
首先更新一下tensorflow#卸载
pip install --no-cache-dir tensorflow==x.xx
#我安装2.0
pip install tensorflow==2.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
#遇到问题问万能的百度
#然后重新打开你的编辑器导入tensorflow
tensorflow.__version__
接下来,说一下导入包的作用:tensorflow_probability
这个包是概率编程工具,如果对概率相关的计算有诉求,可以去看一下,他的官网介绍:tensorflow_probability
tensorflow2.0自己编写类
和torch很像了,显式的继承自tf.keras.models.Model,然后要在初始化函数定义各个层,其中需要初始化:super().init(),然后再定义一下前向传播,这个自己定义的层基本就好了。
tfp.distributions.Normal()
这个定义了一个正态分布,可以根据loc和scale参数生成各种正态分布函数。
tf.GradientTape()
tensorflow2.0的新特性,只要计算梯度一般都用这个函数。
3.gluonts实现
有了现成的包,一般不用去写了,直接导包好了。
首先来安装:pip install太慢了,用国内的镜像:
pip install gluonts -i https://pypi.tuna.tsinghua.edu.cn/simple
安装mxnet
pip install -i https://pypi.doubanio.com/simple/ mxnet-cu100
接下来就该实现了:from gluonts.model import deepar
from gluonts.dataset import common
from gluonts.dataset.util import to_pandas
from gluonts.model.predictor import Predictor
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('/Users/elliot/Desktop/11.csv',header=0,sep=',')
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index(['timestamp'],inplace=True)
data = common.ListDataset([{'start': df.index[0],
'target': df.value[:"2015-04-23 00:00:00"]}], freq='H')#这个数据格式是固定的
estimator = deepar.DeepAREstimator(freq='H', prediction_length=24)
predictor = estimator.train(training_data=data)
for train_entry, predict_result in zip(data, predictor.predict(data)):
to_pandas(train_entry)[-60:].plot(linewidth=2)
predict_result.plot(color='g', prediction_intervals=[50.0, 90.0])
plt.grid(which='both')
plt.show()
##输出预测结果
prediction = next(predictor.predict(data))
print(prediction.mean)
prediction.plot(output_file='graph.png')
https://www.jianshu.com/p/4cb550302963