Разное расстояние DTW в FASTDTW и DTAIDISTANCEPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Разное расстояние DTW в FASTDTW и DTAIDISTANCE

Сообщение Anonymous »

Я только начал читать о DTW и решил попробовать два пакета Python, FastDTW и dtaidistance. Образцы для классов 1, 3 и 4 генерируются на основе классов 0 образцов, например: < /p>

Код: Выделить всё

import numpy as np
from fastdtw import fastdtw
from dtaidistance import dtw

np.random.seed(42)
# Original Class 0 samples (10 samples with 48 half-hourly measurements each)
class_0_samples = np.random.rand(10, 48)
# Generate Class 1 samples (multiply each sample by a random value between [0, 0.8])
class_1_samples = class_0_samples * np.random.uniform(0, 0.8, size=(10, 1))
# Generate Class 3 samples (multiply each half-hourly measurement by a different random value between [0, 0.8])
class_3_samples = class_0_samples * np.random.uniform(0, 0.8, size=(10, 48))
# Generate Class 4 samples (multiply specific columns by a random value between [0, 0.8])
class_4_samples = class_0_samples.copy()
start_cols = np.random.randint(7, 15, size=(10,))
for i in range(10):
start_col = start_cols[i]
class_4_samples[i, start_col:start_col+4] = class_4_samples[i, start_col:start_col+4]*np.random.uniform(0, 0.8)
Теперь я попытался определить расстояние DTW от каждого образца класса 0 до каждого образца классов 1, 3 и 4. Использование FASTDTW я написал этот код:

Код: Выделить всё

# Calculate DTW distances between Class 0 samples and original Class 0 samples
fastdtw_distances_class_0 = []
fastdtw_distances_class_1 = []
fastdtw_distances_class_3 = []
fastdtw_distances_class_4 = []
for i in range(10):
distance0, _ = fastdtw(class_0_samples[i].reshape(1, -1), class_0_samples[i].reshape(1, -1), dist=euclidean)
fastdtw_distances_class_0.append(distance0)
distance1, _ = fastdtw(class_0_samples[i].reshape(1, -1), class_1_samples[i].reshape(1, -1), dist=euclidean)
fastdtw_distances_class_1.append(distance1)
distance3, _ = fastdtw(class_0_samples[i].reshape(1, -1), class_3_samples[i].reshape(1, -1), dist=euclidean)
fastdtw_distances_class_3.append(distance3)
distance4, _ = fastdtw(class_0_samples[i].reshape(1, -1), class_4_samples[i].reshape(1, -1), dist=euclidean)
fastdtw_distances_class_4.append(distance4)

# Convert distances to a numpy array
fastdtw_distances_class_0 = np.array(fastdtw_distances_class_0).reshape(-1, 1)
fastdtw_distances_class_1 = np.array(fastdtw_distances_class_1).reshape(-1, 1)
fastdtw_distances_class_3 = np.array(fastdtw_distances_class_3).reshape(-1, 1)
fastdtw_distances_class_4 = np.array(fastdtw_distances_class_4).reshape(-1, 1)
и для dtaidistance я написал это:

Код: Выделить всё

# Calculate DTW distances between Class 0 samples and original Class 0 samples
dtaidtw_distances_class_0 = []
dtaidtw_distances_class_1 = []
dtaidtw_distances_class_3 = []
dtaidtw_distances_class_4 = []
for i in range(10):
distance0 = dtw.distance_fast(class_0_samples[i], class_0_samples[i])
dtaidtw_distances_class_0.append(distance0)
distance1 = dtw.distance_fast(class_0_samples[i], class_1_samples[i])
dtaidtw_distances_class_1.append(distance1)
distance3 = dtw.distance_fast(class_0_samples[i], class_3_samples[i])
dtaidtw_distances_class_3.append(distance3)
distance4 = dtw.distance_fast(class_0_samples[i], class_4_samples[i])
dtaidtw_distances_class_4.append(distance4)

# Convert distances to a numpy array
dtaidtw_distances_class_0 = np.array(dtaidtw_distances_class_0).reshape(-1, 1)
dtaidtw_distances_class_1 = np.array(dtaidtw_distances_class_1).reshape(-1, 1)
dtaidtw_distances_class_3 = np.array(dtaidtw_distances_class_3).reshape(-1, 1)
dtaidtw_distances_class_4 = np.array(dtaidtw_distances_class_4).reshape(-1, 1)
< /code>
Если вы запустите все это, вы можете видеть, что некоторые расстояния одинаковы, но некоторые нет. Например, если мы проверим FASTDTW 
и dtaidistance расстояния между выборкой 0 класса 0 и класса 4, мы видим, что они точно одинаковы:
fastdtw_distances_class_4[0]
Out[12]: array([0.35720446])
dtaidtw_distances_class_4[0]
Out[13]: array([0.35720446])
< /code>
Но для некоторых других образцов они отличаются, например, пример 1: < /p>
fastdtw_distances_class_4[1]
Out[15]: array([0.57095312])
dtaidtw_distances_class_4[1]
Out[16]: array([0.48818216])
< /code>
и для некоторых других случаев они значительно различаются, например, любая выборка между классом 0 и классом 3. < /p>
fastdtw_distances_class_3[8]
Out[17]: array([3.27973515])
dtaidtw_distances_class_3[8]
Out[18]: array([2.11034766])
< /code>
Что может быть причиной этого? Что -то не так с моим кодом? Или реализация алгоритма DTW в этих пакетах действительно отличается друг от друга? Как мне выбрать то или иное в этом случае?

Подробнее здесь: https://stackoverflow.com/questions/770 ... aidistance
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»