报童问题的简单解法
我们早先已经在《报童问题》一文中介绍了这个经典的商品采购模型。文中的推导略有些繁复。为了便于理解,本文将给出一个相对简单的解法。
问题
我们还是沿用前文的记号。问题定义如下:
每天早上,报童以批发价 元/份采购当天的报纸,然后以零售价 元/份售卖。如果当天报纸没有卖完,则以 元/份的价格卖给废品回收站。不失一般性,假设 。用随机变量 表示当天的需求量,并已知其概率分布。求使得期望收益最大的采购量 。
最近打算分享一些基于深度学习的时间序列预测方法。这是第四篇。
前面已经分享了两个基于 RNN 的模型(DeepAR 和 DeepState)和一个基于 Attention 的模型(Transformer),今次将会介绍一个基于 CNN 的模型。
Google DeepMind 在 2016 年发表了 WaveNet: A generative model for raw audio 。这篇文章介绍了一种用于音频生成的神经网络 WaveNet。该模型在文字转语音(Text-to-Speech, TTS)任务上取得了极佳的效果,与当时业界已有的模型不同,它合成的声音与真人的发音非常接近。目前 WaveNet 已经被应用在 Google Assistant 语音助手中。
WaveNet 是一个自回归概率模型,它将音波 x={x1,⋯,xT} 的联合概率分布建模为
最近打算分享一些基于深度学习的时间序列预测方法。这是第三篇。
前面介绍的 DeepAR 和 DeepState 都是基于 RNN 的模型。RNN 是序列建模的经典方法,它通过递归来获得序列的全局信息,代价是无法并行。CNN 也可以用来建模序列,但由于卷积捕捉的是局部信息,CNN 模型往往需要通过叠加很多层才能获得较大的感受野。后续我可能会 (意思就是未必会) 介绍基于 CNN 的时间序列预测方法。Google 在 2017 年发表的大作 Attention Is All You Need 为序列建模提供了另一种思路,即单纯依靠注意力机制(Attention Mechanism),一步到位获得全局信息。Google 将这个模型称为 Transformer。Transformer 在自然语言处理、图像处理等领域都取得了很好的效果。Transformer 的结构如下图所示(误
最近打算分享一些基于深度学习的时间序列预测方法。这是第二篇。
今次介绍的是 Amazon 在 NIPS 2018 上发表的文章 Deep State Space Models for Time Series Forecasting。
状态空间模型(State Space Models)起源于控制工程领域,典型的应用包括卡尔曼滤波等。时间序列分析中的一些经典方法,如 ARIMA、Holt-Winters’ 等,都可以改写成状态空间模型。状态空间模型对每个时间序列单独建模,无法利用序列之间相似的模式,因而对历史数据较少的序列往往无能为力。
DeepState 将状态空间模型与深度学习结合起来。先用循环神经网络将特征映射为状态空间模型的参数,再使用状态空间模型预测序列在每个时间步上取值的概率分布。所有的时间序列共享网络本身的参数,而每个时间序列都有独立的状态空间参数。这样一来,既能从大量的序列和特征中学习到相似的模式,又能使模型具有一定的可解释性。
最近学习了一种结合了深度学习和状态空间模型的时间序列预测方法(见《时间序列预测方法之 DeepState》),该方法需要用到卡尔曼滤波。
卡尔曼滤波是一种高效的自回归滤波器,它能够从一系列不完全及包含噪声的测量中,估计动态系统的状态。在导航、运动控制、时间序列分析等领域都有重要应用。
卡尔曼滤波的公式比较多,乍一看容易懵。根据我多年的经验,遇到让人头疼的公式,自己试着推导一遍,肯定会更头疼, 比较有助于理解。
最近打算分享一些基于深度学习的时间序列预测方法。这是第一篇。
DeepAR 是 Amazon 于 2017 年提出的基于深度学习的时间序列预测方法,目前已集成到 Amazon SageMaker 和 GluonTS 中。前者是 AWS 的机器学习云平台,后者是 Amazon 开源的时序预测工具库。
传统的时间序列预测方法(ARIMA、Holt-Winters’ 等)往往针对一维时间序列本身建模,难以利用额外特征。此外,传统方法的预测目标通常是序列在每个时间步上的取值。与之相比,基于神经网络的 DeepAR 方法可以很方便地将额外的特征纳入考虑,且其预测目标是序列在每个时间步上取值的概率分布。在特定场景下,概率预测比单点预测更有意义。以零售业为例,若已知商品未来销量的概率分布,则可以利用运筹优化方法推算在不同业务目标下的最优采购量,从而辅助决策(详见《为什么需要考虑销量的随机性?》和《报童问题》)。
本文将简要地介绍一下 DeepAR 模型,并给出一个 demo。如果希望了解更多细节,建议直接阅读 Amazon 的论文 Deep AR: Probabilistic Forecasting with Autoregressive Recurrent Networks。
重启服务之前往往需要检查一下是否还有未处理完的请求。此时可以使用 ss
命令查看端口是否还有 TCP 连接。例如:
1 | pi@raspberrypi:~ $ ss -nt state established src 192.168.1.26:8888 |
我们可以统计这条命令输出的行数,若小于 2,则说明服务已经处于闲置状态。脚本如下:
考虑一个 ARIMA 过程生成的时间序列
Yt=α(B)ϕ(B)θ(B)at,t=1,2,⋯,n
其中θ(B)和ϕ(B)的所有根都在单位圆外,α(B)的所有根都在单位圆上。
在这个序列中引入一个异常,得到
Yt∗=Yt+ωG(B)H(B)A(B)It(τ)
其中
It(τ)={1,0,t=τ,otherwise
τ表示异常发生的时刻,ω表示异常的量级,G(B)H(B)A(B)表示异常的演化模式。