在Felipe Mello的信息丰富的答案之上的一些其他信息(免责声明:此处是DTAIDistance的作者)。
对于距离结果:
- DTAIDistance仅使用欧几里得距离(或L2范数),这是硬编码的。做出此选择是为了加快C代码的执行速度(不调用函数)。“快速”是指使用基于C的实现而不是纯Python版本,因此这两种方法给出的结果完全相同。
- FastDTW是与DTW不同的算法。这是线性近似。“快速”是指较低的复杂性。
- cDTW。我对这个工具箱不是很熟悉,但是它似乎实现了L1规范。
对于速度结果:
通常,基于纯C的算法比纯Python的算法快100倍(在DTAIDistance中,这是distance()和distance_fast()之间的差异)。对于基于C的方法,差异主要是由于方法的灵活性。例如,传递自定义规范会减慢该方法的速度(更多函数调用)。同样,不同的方法具有不同的选项,这会导致算法中或多或少的switch语句。例如,DTAIDistance提供了许多方法来调整该方法,因为它更喜欢提早停止计算而不是进一步的优化(也由Felipe
Mello观察到)。此外,不同的方法存储不同数量的数据。DTAIDistance距离方法不存储整个矩阵,也不提供线性空间复杂度(使用具有二次空间复杂度的warping_paths方法获得完整的矩阵)。通常,对于DTW,建议使用一个窗口来稍微降低时间复杂度。
对于DTAIDistance,所有设计选择都考虑了时间序列聚类应用程序(distance_matrix_fast方法)。这是不允许自定义规范的另一个原因。DTW代码必须是纯C语言,才能在C代码级别上支持并行化,并且具有最小的开销(它使用OpenMP)来计算序列之间的所有成对距离。



