如何有效地计算多个时间序列的欧几里得距离矩阵

电子杂志

我有6个时间序列数据,分别为t1,t2,t3,t4,t5和t6。

import numpy as np
series = np.array([
     [0., 0, 1, 2, 1, 0, 1, 0, 0],
     [0., 1, 2, 0, 0, 0, 0, 0, 0],
     [1., 2, 0, 0, 0, 0, 0, 1, 1],
     [0., 0, 1, 2, 1, 0, 1, 0, 0],
     [0., 1, 2, 0, 0, 0, 0, 0, 0],
     [1., 2, 0, 0, 0, 0, 0, 1, 1]])

我想从这6个时间序列中创建一个欧式距离矩阵,格式为(即6 * 6,其中x表示相应的欧式距离):

     t1  t2  t3  t4  t5  t6
t1    0   x   x   x   x   x
t2    x   0   x   x   x   x
t3    x   x   0   x   x   x
t4    x   x   x   0   x   x
t5    x   x   x   x   0   x
t6    x   x   x   x   x   0

我目前正在按以下方式手动构造此矩阵(在此SO问题中:欧氏距离的高效,精确计算,该方法具有最高的性能)。

例如,计算t3和t6之间的欧式距离。

def eudis(v1, v2):
    dist = [(a - b)**2 for a, b in zip(v1, v2)]
    dist = math.sqrt(sum(dist))
    return dist

eudis(t3, t6)

但是,我确信在python中可以有更简单且计算效率更高的方法来执行此操作。如果您有任何建议,请告诉我。

如果需要,我很乐意提供更多详细信息。

斯蒂夫

您还可以pdist用来获取距离矩阵:

from scipy.spatial.distance import pdist, squareform
squareform(pdist(series))


纯numpy euclidean_distances 解决方案的性能比较 在此处输入图片说明

因此,对于相对较小的数据集(最多约20个序列,每个序列包含200个元素)pdist最快,而对于较大的数据集,euclidean_disances性能要好得多。pure numpy最慢,并且可能无法为大型数据集分配中间数组。
使用np.random.randint(0, 100, (n, 10*n)).astype('int16')numpy 1.17.4,scipy 1.4.1,sklearn 0.23.1,python 3.8.2,Win10 64bit进行了测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章