随后的时间序列匹配

时间:2015-02-06 14:16:35

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

我一直坚持在MATLAB中随后匹配时间序列(我不熟悉它)。

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

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

所以我有几个问题:

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

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

  3. 感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

我想建议cross-correlationxcorr)作为解决此问题的方法。关于互相关和欧几里德距离的关系,请参考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