如何高效地计算多时间序列的欧氏距离矩阵

2024-09-29 21:33:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下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问题中:Efficient and precise calculation of the euclidean distance此方法具有最高的性能)

例如,计算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中可以有更简单、计算效率更高的方法来实现这一点。如果你有什么建议,请告诉我

如果需要,我很乐意提供更多细节


Tags: 方法距离distnp时间序列矩阵v1
3条回答

你可以在一行中用简单的numpy创建一个距离矩阵,你不需要其他任何东西

np.sqrt(((series[:,None,:] - series)**2).sum(axis=2))

还可以使用^{}获取距离矩阵:

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


pure numpyeuclidean_distances解决方案的性能比较: enter image description here

因此,对于相对较小的数据集(最多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 64位进行测试

您根本不需要循环,因为两个数组之间的欧几里德距离只需计算差分的元素平方,如下所示:

def euclidean_distance(v1, v2):
    return np.sqrt(np.sum((v1 - v2)**2)) 

对于距离矩阵,有^{}

from sklearn.metrics.pairwise import euclidean_distances

euclidean_distances(a).round(2)

array([[0.  , 2.83, 3.74, 0.  , 2.83, 3.74],
       [2.83, 0.  , 2.83, 2.83, 0.  , 2.83],
       [3.74, 2.83, 0.  , 3.74, 2.83, 0.  ],
       [0.  , 2.83, 3.74, 0.  , 2.83, 3.74],
       [2.83, 0.  , 2.83, 2.83, 0.  , 2.83],
       [3.74, 2.83, 0.  , 3.74, 2.83, 0.  ]])

np.allclose(
    eudis(series[2], series[3]),
    euclidean_distance(series[2], series[3])
)
# True

相关问题 更多 >

    热门问题