【发布时间】:2021-02-11 16:31:06
【问题描述】:
动态时间扭曲算法提供了两个时间序列之间的距离概念,这两个时间序列的速度可能会有所不同。如果我有 N 个序列要相互比较,我可以通过成对应用算法来构造一个具有 nule 对角线的 NXN 对称矩阵。然而,这对于长的二维序列来说非常慢。因此,我正在尝试对代码进行矢量化以加快此矩阵计算。重要的是,我还想提取定义最佳对齐方式的索引。
到目前为止我的成对比较代码:
import math
import numpy as np
seq1 = np.random.randint(100, size=(100, 2)) #Two dim sequences
seq2 = np.random.randint(100, size=(100, 2))
def seqdist(seq1, seq2): # dynamic time warping function
ns = len(seq1)
nt = len(seq2)
D = np.zeros((ns+1, nt+1))+math.inf
D[0, 0] = 0
cost = np.zeros((ns,nt))
for i in range(ns):
for j in range(nt):
cost[i,j] = np.linalg.norm(seq1[i,:]-seq2[j,:])
D[i+1, j+1] = cost[i,j]+min([D[i, j+1], D[i+1, j], D[i, j]])
d = D[ns,nt] # distance
matchidx = [[ns-1, nt-1]] # backwards optimal alignment computation
i = ns
j = nt
for k in range(ns+nt+2):
idx = np.argmin([D[i-1, j], D[i, j-1], D[i-1, j-1]])
if idx == 0 and i > 1 and j > 0:
matchidx.append([i-2, j-1])
i -= 1
elif idx == 1 and i > 0 and j > 1:
matchidx.append([i-1, j-2])
j -= 1
elif idx == 2 and i > 1 and j > 1:
matchidx.append([i-2, j-2])
i -= 1
j -= 1
else:
break
matchidx.reverse()
return d, matchidx
[d,matchidx] = seqdist(seq1,seq2) #try it
【问题讨论】:
-
如前所述,很难在问题上做出有用的 cmets。您可以查看here 了解一般指南。您可能希望确保可以复制粘贴代码并运行它,但现在情况并非如此(由于缩进问题)。
-
除此之外,我得到
d在这个例子中等于无穷大。如果您的代码是正确的并且您想要更好的性能,您可能需要包含样本序列,这些序列会导致与您描述的“动态时间规整算法”相关的有限距离。 -
有些缩进错了,我修好了。距离是有限的。
-
对我来说看起来不错,不知道为什么我昨天在输出中看到无限距离。
标签: python algorithm optimization vectorization distance