后续时间序列匹配

Subsequent time-series matching

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

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

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

所以我有几个问题:

  1. 如何在没有循环的情况下得到C(实际上是对A进行reshape)?

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

感谢您的帮助!

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

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

第一个问题你可以试试

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

我想建议cross-correlation (xcorr) as an approach to this problem. On how cross-correlation and euclidian distance are related, refer for instance to 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