时间序列聚类

机器算法验证 r 时间序列 聚类
2022-03-29 02:19:17

我有许多这种格式的时间序列 1 列,其中我有日期(d/m/yr)格式和许多代表不同时间序列的列,如下所示:

DATE         TS1     TS2     TS3 ...
24/03/2003   0.00    0.00    ...
17/04/2003  -0.05    1.46
11/05/2003   0.46   -3.86
04/06/2003  -2.21   -1.08
28/06/2003  -1.18   -2.16
22/07/2003   0.00    0.23

使用 R,我如何对显示相似趋势的时间序列进行分组?

1个回答

第1步

对时间序列数据执行快速傅立叶变换。这会将您的时间序列数据分解为均值和频率分量,并允许您使用变量进行聚类,这些变量不会像许多原始时间序列那样显示出严重的自相关。

第2步

如果时间序列是实值的,则丢弃快速傅里叶变换元素的后半部分,因为它们是多余的。

第 3 步

分离每个快速傅里叶变换元素的实部和虚部。

第4步

对每个频率元素的实部和虚部执行基于模型的聚类。

第 5 步

按集群绘制时间序列的百分位数以检查它们的形状。

或者,您可以省略快速傅立叶变换的 DC 分量,以避免您的集群基于均值,而不是基于傅立叶变换定义的序列,该序列表示时间序列的形状。

您还需要计算快速傅里叶变换的幅度和相位角,以便您可以探索簇内时间序列光谱的分布。请参阅此 StackOverflow 答案,了解如何对实值数据执行此操作。

您还可以通过从幅度和相位角计算傅里叶级数,按集群绘制时间序列形状的百分位数(生成的时间序列估计不会完全匹配原始时间序列)。您还可以按集群绘制原始时间序列数据的百分位数。这是一个这样的图的例子,它来自我今天刚刚做的 NDVI 数据的谐波分析:

第 1、25、50、75 和 99 个百分位数的周期级 NDVI 测量值,由使用 R 中的 Mclust 包从基于模型的聚类派生的聚类得出

最后,如果您的时间序列不是平稳的(即均值和方差随时间变化),则使用小波变换可能比傅里叶变换更合适。您会以获取有关位置信息的同时获取有关频率的信息为代价这样做。