我有一组长度不同的时间序列数据,我正在尝试使用动态时间规整(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 矩阵。我不确定这是否会更改时间序列的语义。