Сравнение двух кривых одинаковой формы, но сдвинутых вдоль оси

#python #compare #data-science #shapes #dtw

#python #Сравнить #наука о данных #формы #dtw

Вопрос:

Я пытаюсь сравнить две кривые, которые имеют точно такую же форму, но сдвинуты вдоль оси x. Для этой проблемы я использую dtw (динамическое искажение времени), поскольку оно не должно быть подвержено сдвигу или растяжению. Пожалуйста, взгляните на следующий пример кода:

 x=np.linspace(0,10,9)         #creating points on the x-axis
y=np.random.randint(0,10,9)   #random values for y
x2=x 4                        #manual shift along x

exp_data = np.zeros((len(x), 2))
exp_data[:, 0] = x
exp_data[:, 1] = y
    
num_data = np.zeros((len(x), 2))
num_data[:, 0] = x2
num_data[:, 1] = y 

import similaritymeasures as sim
dtw,d=sim.dtw(exp_data,num_data) 
  

Я бы ожидал, что результат dtw будет равен 0, но вместо этого получу значение больше 0 и, следовательно, подумаю, что они не очень похожи.
Я неправильно интерпретирую результат? Есть ли лучший способ измерить сходство форм, который не подвержен сдвигу / растяжению?

Комментарии:

1. Насколько большой результат вы получаете? Компьютер не может сохранить каждое число с плавающей точкой и сохраняет приблизительное значение — так 0.1 0.2 == 0.3 дает False — и тогда результат может немного отличаться 0 , и вы должны использовать некоторое небольшое значение для проверки сходства, т.Е. if -0.01 < dtw < 0.01: print("the same")

2.Спасибо за ваш повтор @furas Не уверен, правильно ли я понимаю ваш вопрос, но если я использую код, который я построил, и сравниваю две кривые, которые были созданы случайным образом (см. Мои результаты ниже) Я получаю: y=([1, 4, 9, 1, 5, 7, 1, 0, 3]) x=([ 0. , 1.25, 2.5 , 3.75, 5. , 6.25, 7.5 , 8.75, 10. ]) x2=([ 4. , 5.25, 6.5 , 7.75, 9. , 10.25, 11.5 , 12.75, 14. ]) и, соответственно, dtw из dtw=36.0

3. Я запускаю ваш код с разными значениями x 4 , x 1 и т.д. И dtw выдает мне значение, которое я могу получить также с помощью simple (x-x2).sum() — так что это dtw суммирует только различия между точками. Лучший результат дает мне diff = x-x2 , (diff - diff.min()).sum() потому что это дает мне 0 , но, возможно, было бы неплохо использовать average вместо minimal значения.