【问题标题】:Subsequent time-series matching后续时间序列匹配
【发布时间】:2015-04-06 17:04:57
【问题描述】:

我一直坚持在 MATLAB 中进行时间序列的后续匹配(我是新手)。

我有两个时间序列:A(长度为 a)和 B(长度为 b)。假设a远大于b。任务是找到从 A 到 B 的最近窗口(根据欧几里得度量)。

为了做到这一点,我构造了一个额外的矩阵 C,它存储了来自 A 的所有长度为 b 的子序列,然后使用 pdist2(C, B)。显然它运行缓慢并且需要太多内存。

所以我有几个问题:

  1. 如何获得没有循环的C(实际上是重塑A)?

  2. 解决此问题的常用方法有哪些? (最好在 MATLAB 中,但也可以在其他环境中使用)

感谢您的帮助!

【问题讨论】:

  • 如果您也可以发布一些示例数据会有所帮助。

标签: matlab machine-learning time-series euclidean-distance


【解决方案1】:

第一个问题你可以试试

tmp = repmat(A,1,b);
C = reshape([tmp zeros(1,b)],a,b);
C = C(1:(a-b+1),:);

此外,pdist2 与这个非常好的解决方案相比非常慢:Efficiently compute pairwise squared Euclidean distance in Matlab

【讨论】:

  • 谢谢!我有显着的加速重塑时间序列,我会尽量避免使用 pdist2。附言第二行必须是 tmp 而不是 B
  • 这是创建信号的所有移位版本的好方法,但我花了一段时间才了解添加零的想法 - 也许您可以添加一些解释?
  • 需要零才能在整形后获得矩阵的正确尺寸。当我使用 pdist2 时,我需要所有信号的长度相同。实际上它们无论如何都被削减了。
【解决方案2】:

我想建议 cross-correlation (xcorr) 作为解决此问题的方法。关于互相关和欧几里得距离的关系,例如参考the introduction of this article。它对时间或幅度的缩放不是不变的,并且可能对噪声敏感,但问题并不意味着任何此类失真。

互相关的一个优点是它在变换域中的高效实施。不幸的是,我手头只有一个没有 pdist2 的旧 Matlab 版本,所以我无法计时。但是考虑

%// Parameters
a = 1e4;
b = 1e2;
noise = 0.1;

%// Create sample signals with some distortion
A = rand(1, a);
Offset_actual = 321
B = A(Offset_actual + [1:b]) + noise*rand(1, b);

%// Computation
CC = xcorr(A, B);
[m, i] = max(CC);
Offset_estimated = i - a
plot(CC)

应该恢复Offset_estimated == Offset_actual

【讨论】:

  • 谢谢!现在对我来说有点不知所措,但我会尝试这种方法。
【解决方案3】:

对于您问题的第 2 部分,比较序列的典型方法是通过 Dynamic Time Warping (DTW)。您几乎可以肯定能够通过 Google 搜索 Matlab 实现。

DTW 算法的基本版本的复杂度为 O(nm),但通常具有可比性能的近似版本的复杂度更接近 O(max(n, m))。

【讨论】:

  • 谢谢!我对 DTW 不熟悉,但我会尝试一下。
猜你喜欢
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多