Python:计算列表的所有可能的成对距离(DTW)

时间:2016-07-13 19:50:52

标签: python euclidean-distance

我有一个像这样的项目列表:C其中每个T=[T_0, T_1, ..., T_N]本身就是一个时间序列。我想找到所有潜在对的成对距离(通过DTW)。

E.g。如果T_i我有DTW函数T=[T_0, T_1, T_2],我想查找f

注意f(T_0, T_1), f(T_0, T_2), f(T_1, T_2)实际上看起来像T_i

我的代码段如下所示:

( id of i, [ time series values ] )

现在我有大约20,000个时间序列,这需要太长时间(它将在大约5天内运行)。我正在使用python库cluster = defaultdict( list ) donotcluster = defaultdict( list ) for i, lst1 in tqdm(enumerate(T)): for lst2 in tqdm(T): if lst2 in cluster[lst1[0]] or lst2 in donotcluster[lst1[0]]: pass else: distance, path = fastdtw(lst1[1], lst2[1], dist=euclidean) if distance <= distance_threshold: cluster[lst1[0]] += [ lst2 ] cluster[lst2[0]] += [ lst1 ] else: donotcluster[lst1[0]] += [ lst2 ] donotcluster[lst2[0]] += [ lst1 ] 。是否有更优化的库?或者只是更好/更快地计算所有可能的距离?由于距离是对称的,如果我已计算fastdtw

,我不必计算f(T_41,T_33)例如f(T_33, T_41)

2 个答案:

答案 0 :(得分:1)

我建议保留到目前为止所做的所有对中的_GLIBCXX_USE_CXX11_ABI ,请记住0有一个恒定的时间查找操作。除此之外,你应该考虑其他方法,你不经常扩展你的列表(你正在做的那个令人讨厌的set),因为它可能相当昂贵。尽管如此,我对您的应用程序的实现还不够了解。如果您提供更多信息,我可能想办法摆脱一些您不需要的set。一个想法(为了提高效率)将每个列表+=添加到列表列表中,然后在脚本末尾将其展平为类似

+=

我修改了你的代码如下:

append

答案 1 :(得分:0)

我无法回答您关于是否有更优化的dtw库的问题,但您可以使用itertools获取所需的组合而无需重复:

import itertools

for combination in itertools.combinations(T, 2):
        f(combination[0], combination[1])

以下是组合的示例:

('T_1', 'T_2')
('T_1', 'T_3')
('T_1', 'T_4')
('T_1', 'T_5')
('T_2', 'T_3')
('T_2', 'T_4')
('T_2', 'T_5')
('T_3', 'T_4')
('T_3', 'T_5')
('T_4', 'T_5')