使用scipy和DTW的不同长度时间序列数据的分层聚类

时间:2019-04-11 15:01:28

标签: python scipy hierarchical-clustering dtw

我有一组长度不同的时间序列数据,我正在尝试使用动态时间规整(DTW)将它们聚类。

为完整起见,我正在使用this 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 个观察向量的集合   以 n 数组的形式 m 表示。凝聚距离矩阵的所有元素必须   是有限的,即没有NaN或infs。

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

编辑1

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

0 个答案:

没有答案