Иерархическая кластеризация данных временных рядов различной длины с использованием scipy и DTW - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть набор данных временных рядов, имеющих разную длину, и я пытаюсь их кластеризовать, используя 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 при необходимости.Я не уверен, изменит ли это семантику временных рядов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...