У меня есть набор данных временных рядов, имеющих разную длину, и я пытаюсь их кластеризовать, используя Dynamic Time Warping (DTW).
Для полноты вопроса я использую эту простую реализацию DTW
def DTWDistance(s1, s2):
DTW={}
for i in range(len(s1)):
DTW[(i, -1)] = float('inf')
for i in range(len(s2)):
DTW[(-1, i)] = float('inf')
DTW[(-1, -1)] = 0
for i in range(len(s1)):
for j in range(len(s2)):
dist= (s1[i]-s2[j])**2
DTW[(i, j)] = dist + min(DTW[(i-1, j)],DTW[(i, j-1)], DTW[(i-1, j-1)])
return sqrt(DTW[len(s1)-1, len(s2)-1])
и у меня есть данные временных рядов в форме
timeseries = [[0, 1, 2, 3, 4, 5, 6, 7, 8],
[0, 0, 1, 2, 3, 4],
[6, 7, 8, 9, 10, 11, 12, 13, 14],
[15, 14, 13, 14, 15, 16, 17, 18, 19]]
Когда я пытаюсь
import scipy.cluster.hierarchy as hac
Z = hac.linkage(data, method='complete', metric= DTWDistance)
, я получаю ValueError: setting an array element with a sequence.
, что понятно, потому что scipy.cluster.hierarchy.linkage
документация гласит
...коллекция m векторов наблюдения в n измерениях может быть передана в виде m массивом n .Все элементы сжатой матрицы расстояний должны быть конечными, т. Е. Не содержать NaN или инф.
И, очевидно, мои данные не соответствуют этой спецификации.Каков будет правильный подход для классификации данных временных рядов различной длины?
РЕДАКТИРОВАТЬ 1
Простой обходной путь - заполнить недостающие записи для более коротких временных рядов 0,так что мы можем получить матрицу m x n при необходимости.Я не уверен, изменит ли это семантику временных рядов.