#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
значения.