0

我有一组具有不同长度的时间序列数据,我正在尝试使用动态时间规整 (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文档说

...在n维中的m个观察向量的集合可以作为m × n数组传递。压缩距离矩阵的所有元素都必须是有限的,即没有 NaN 或 inf。

显然我的输入不符合这个规范。对不同长度的时间序列数据进行分类的正确方法是什么?

编辑 1

一个简单的解决方法是用 0 填充较短时间序列的缺失条目,以便我们可以根据需要获得一个m x n矩阵。我不确定这是否会改变时间序列的语义。

4

0 回答 0