Разные результаты и выступления с разными библиотеками

1

Я сравниваю библиотеки dtaidistance, fastdtw и cdtw для вычислений DTW. Это мой код:

from fastdtw import fastdtw
from cdtw import pydtw
import fastdtw
import array
from timeit import default_timer as timer
from dtaidistance import dtw, dtw_visualisation as dtwvis

s1 = mySampleSequences[0] # first sample sequence consisting of 3000 samples
s2 = mySampleSequences[1] # second sample sequence consisting of 3000 samples

start = timer()
distance1 = dtw.distance(s1, s2)
end = timer()
start2 = timer()
distance2 = dtw.distance_fast(array.array('d',s1),array.array('d',s2))
end2 = timer()
start3 = timer()
distance3, path3 = fastdtw(s1,s2)
end3 = timer()
start4 = timer()
distance4 = pydtw.dtw(s1,s2).get_dist()
end4 = timer()

print("dtw.distance(x,y) time: "+ str(end - start))
print("dtw.distance(x,y) distance: "+str(distance1))
print("dtw.distance_fast(x,y) time: "+ str(end2 - start2))
print("dtw.distance_fast(x,y) distance: " + str(distance2))
print("fastdtw(x,y) time: "+ str(end3 - start3))
print("fastdtw(x,y) distance: " + str(distance3))
print("pydtw.dtw(x,y) time: "+ str(end4 - start4))
print("pydtw.dtw(x,y) distance: " + str(distance4))

Это результат, который я получаю:

  • dtw.distance(x, y) время: 22.16925272245262
  • dtw.distance(x, y) расстояние: 1888.8583853746156
  • dtw.distance_fast (x, y) время: 0.3889036471839056
  • dtw.distance_fast (x, y) расстояние: 1888.8583853746156
  • fastdtw (x, y) время: 0.23296659641047412
  • fastdtw (x, y) расстояние: 27238.0
  • pydtw.dtw(x, y) время: 0.13706478039556558
  • pydtw.dtw(x, y) расстояние: 17330,0

Мой вопрос: почему у меня разные выступления и разные дистанции? Большое спасибо за ваши комментарии.

//edit: Единица измерения времени - секунды.

Теги:
dtw

1 ответ

1

Изменить: каковы единицы измерения времени? Я считаю, что вы сравнили их, поскольку все они были в одном подразделении. Вероятно, dtw.distance, например, в микросекундах, в то время как другие ответы в миллисекундах, и вы думали, что dtw.distance выполняется медленнее, когда это фактически наоборот.

Существуют разные методологии для измерения расстояния между двумя точками. Это может быть основано на стандартном отклонении или просто эвклидовом расстоянии. Вот список многих из этих расстояний.

Некоторые из них могут быть более вычислительными, чем другие, а также иметь разные значения. Например, быстрый dtw использует в качестве третьего ввода тип расстояния, которое вы хотите, как описано в их github

distance3, path3 = fastdtw(s1, s2, dist = euclidean)

Другой причиной разницы в скорости является базовый код. Некоторые из них находятся в чистом питоне, а другие - на C, что может быть легко в 100 раз быстрее. Способ ускорения вашего dtaidistance - установить максимальный порог расстояния. Алгоритм останавливает вычисление, если он понимает, что общее расстояние будет превышать определенное значение:

distance2 = dtw.distance_fast(array.array('d',s1),array.array('d',s2), max_dist = your_threshold)

Также важно отметить, что некоторые могут быть оптимизированы для более длинных или более коротких массивов. Посмотрев пример ниже и запустив его на своем компьютере, я получаю разные результаты:

from cdtw import pydtw
from dtaidistance import dtw
from fastdtw import fastdtw
from scipy.spatial.distance import euclidean
s1=np.array([1,2,3,4],dtype=np.double)
s2=np.array([4,3,2,1],dtype=np.double)

%timeit dtw.distance_fast(s1, s2)
4.1 µs ± 28.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit d2 = pydtw.dtw(s1,s2,pydtw.Settings(step = 'p0sym', window = 'palival', param = 2.0, norm = False, compute_path = True)).get_dist()
45.6 µs ± 3.39 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit d3,_=fastdtw(s1, s2, dist=euclidean)
901 µs ± 9.95 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

fastdtw в 219 раз медленнее, чем dtaidistance lib и 20x медленнее, чем cdtw

  • 0
    Прежде всего: извините за поздний ответ и большое спасибо за ваш ответ. Добавление параметра "dist = euclidean" к вызову fastdtw не изменило значение расстояния. Есть ли какие-то дополнительные параметры, которые я пропускаю?
  • 0
    @ Хагбард, вероятно, евклидово - стандартное используемое расстояние, так как оно одно из самых простых и быстрых, поэтому вы не заметите никакой разницы.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню