动态时间扭曲递归实现

时间:2015-10-08 16:31:49

标签: python optimization recursion

晚上好女士和男士们,
我想在Python中实现动态时间扭曲(DTW)算法。

出于测试目的,我设置了一个小的随机距离矩阵(例如,由曼哈顿指标生成),然后用它调用我的DTW算法。

import numpy as np
from dynamic_time_warping import compute_dtw

x=np.zeros((3,4))
x[0,2]=1.0
x[0,3]=2.0
x[1,2]=1.0
x[1,3]=2.0
x[2,0]=1.0
x[2,1]=1.0
x[2,3]=1.0

compute_dtw(x)

我的DTW算法如下所示:

def compute_dtw(W):
    if W.shape[0]==1 or W.shape[1]==1:
        C=float("inf")
    if W.shape[0]==1 and W.shape[1]==1:
        C=0.0
    else:
        C=W[len(W),len(W)]+min(compute_dtw(W[0:-1, 0:-1]),
            compute_dtw(W[0:-1]), compute_dtw(W[:, 0:-1]))
    return C

我希望算法取x的m * n值并将其添加到我试图通过使用较小的矩阵再次调用该函数时尝试实现的下一个最小值。 (compute_dtw(W[0:-1, 0:-1]), compute_dtw(W[0:-1]), compute_dtw(W[:, 0:-1]))

在执行一次脚本后,这会给我以下错误:

  

C = W [len(W),len(W)] + min(compute_dtw(W [0:-1,0:-1]),   compute_dtw(W [0:-1]),compute_dtw(W [:,0:-1]))IndexError:索引3是   超出轴0的大小为3

显然,我正在调用一个不存在的阵列元素,但我无法弄清楚它在哪里断裂。

感谢您的建议和帮助!

//更新代码:

def compute_dtw(W):
    if W.shape[0]==1 and W.shape[1]==1:
        C=0.0
    elif W.shape[0]==1 or W.shape[1]==1:
        C=float("inf")
    else:
        C=W[W.shape[0]-1,W.shape[1]-1]+min(compute_dtw(W[0:-1, 0:-1]), compute_dtw(W[0:-1]), compute_dtw(W[:, 0:-1]))
    return C

1 个答案:

答案 0 :(得分:1)

Python索引从零开始。在你的第一次传递中你调用元素[3,3](它不存在),因此出现了越界错误。

我并不熟悉动态时间扭曲,但我认为应该使用特定轴的.shape而不是len(),这只是第一个的长度数组的维度。即便如此,您还是必须调整递归以迭代每个连续数组的边界。

最后,return语句应该与if块的级别相同。目前,只有在两个轴上的形状大于长度1时,compute_dtw才会在前两种情况下返回任何内容。