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