时间序列降维

机器算法验证 时间序列 预测 降维 svd 小波
2022-04-11 05:01:59

我有一个呼叫中心数据(如下所示),它每 15 分钟收集一次呼叫数据。一天的周期为 96,一周的周期为 (7 x 96 = 672)。如果我想预测这些数据,我可以使用处理多个季节性的模型,例如DSHW, TBATS and BATSR预测包正如您可以想象的那样,具有 96 和 672 的周期将需要大量的计算资源,并且没有很多技术可以处理如此长的周期。

我最近看到了Shen的一篇优秀文章,它使用奇异值分解来降低时间序列的维度/周期性,因此我们可以有一个简约的模型,并且该模型会更高效/需要更少的计算资源。我对其他方法持开放态度,例如离散小波变换 (dwt)、离散傅里叶变换 (dft) 等,

    Time in mins                    
Date      0:15 0:20 0:45 1:00 1:15 1:30
1/1/2012    41  12  33  42  38  27
2/1/2012    50  12  20  14  27  46
3/1/2012    30  17  21  44  47  45
4/1/2012    26  15  10  13  50  38
5/1/2012    39  17  22  28  48  12
6/1/2012    30  10  25  30  21  21
7/1/2012    47  46  18  10  36  37
8/1/2012    26  37  41  36  37  12

以下是我的问题:

  1. 如何使用 R 和 matlab 等工具对上述时间序列数据实施基于 SVD/DWT/DFT 的降维?
  2. 是否有任何自动程序可用于时间序列降维?
2个回答

您可能需要考虑可预测成分分析 (ForeCA),这是一种时间序列降维技术,专门设计用于获得比原始时间序列更容易预测的低维空间。

让我们看一个每月太阳黑子数量的例子,为了计算效率,让我们看看 20 世纪。

yy <- window(sunspot.month, 1901, 2000)
plot(yy)

太阳黑子每月

太阳黑子数只是一个单变量时间序列yt=(y1,,yT),但我们可以通过将其嵌入滞后来将其转换为多元时间序列(p+1)维特征空间Xt=(yt,yt1,,ytp). 这是非线性时间序列分析中的常用技术。

XX <- embed(yy, 24)
XX <- ts(XX, end = end(yy), freq = 12)
dim(XX)

## [1] 1166   24

在 R 中,您可以使用ForeCA包进行估计。请注意,这需要 a 的多元谱K维时间序列T观测值,存储在T×K×K数组(可以使用对称/厄米特属性将大小减半)。因此,与 iid 降维技术(例如 PCA 或 ICA)相比,计算所需的时间要长得多。

因此,在这里我们采用嵌入太阳黑子数的 24 维时间序列,并尝试找到一个 6 维子空间,该子空间具有可以轻松预测的有趣模式。

library(ForeCA)
# this can take several seconds
mod.foreca <- foreca(XX, n.comp = 4, 
                     spectrum.control = list(method = "wosa"))

mod.foreca

## ForeCA found the top 4 ForeCs of 'XX' (24 time series).
## Out of the top 4 ForeCs, 0 are white noise.
## 
## Omega(ForeC 1) = 53% vs. maximum Omega(XX) = 43%.
## This is an absolute increase of 9.9 percentage points (relative: 23%) in forecastability.
## 
## * * * * * * * * * * 
## Use plot(), biplot(), and summary() for more details.


plot(mod.foreca)

太阳黑子的预测结果

双图显示第一个组件都指向同一方向,这告诉我们该组件将是整体/平均模式。右侧的条形图显示了可预测组件 (ForeC) 的可预测性确实如何降低,并且第一个组件比原始序列更可预测。在这个例子中,所有原始序列都具有相同的可预测性,因为我们使用了嵌入。对于一般的多元时间序列,情况并非如此。

现在这些系列看起来像什么?

mod.foreca$scores <- ts(mod.foreca$scores, start = start(XX), 
                        freq = frequency(XX))
plot(mod.foreca$scores)

前景

事实上,第一个分量比原始序列更可预测,因为它的噪音更小。其余系列也显示出非常有趣的图案,这些图案在原始系列中是看不到的。请注意,所有的 ForeC 都是相互正交的,即它们是不相关的。

round(cor(mod.foreca$scores), 3)

##        ForeC1 ForeC2 ForeC3 ForeC4
## ForeC1      1      0      0      0
## ForeC2      0      1      0      0
## ForeC3      0      0      1      0
## ForeC4      0      0      0      1

每个系列的光谱也很好地了解了太阳黑子活动中的不同 ForeCs [原文如此!]。

spec <- mvspectrum(mod.foreca$scores, "wosa")
plot(spec)

ForeC 谱

我们从许多想要以 15 分钟间隔预测需求的快餐连锁店看到这样的数据。您可以构建一个每日模型,该模型包含星期几效应、每周效应、每月效应、每月每周效应、每月几日效应、周末效应、假期领先和滞后效应、水平变化效应、趋势变化效应、星期效应变化、自回归效应和脉冲效应以及任何用户指定的预测器系列。然后可以使用每日预测来帮助形成 15 分钟间隔预测,最终在每日预测和 15 分钟预测之间进行所需的协调。汽车盒(http://www.autobox.com) 是一个在这方面很有帮助的工具,而其他主要软件供应商则缺乏解决这个非常有趣的问题的所有“免费解决方案”。就全面披露而言,我曾参与为 AUTOBOX 的制造商 Automatic Forecasting Systems 开发其中一些解决方案。如果您有足够的时间和耐心来编写所需的步骤,您可以尝试在 R 中执行此操作。