我有一个像这样的项目列表: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)
答案 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')