我有如下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中可以有更简单、计算效率更高的方法来实现这一点。如果你有什么建议,请告诉我
如果需要,我很乐意提供更多细节
你可以在一行中用简单的numpy创建一个距离矩阵,你不需要其他任何东西
还可以使用^{} 获取距离矩阵:
与pure 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 64位进行测试您根本不需要循环,因为两个数组之间的欧几里德距离只需计算差分的元素平方,如下所示:
对于距离矩阵,有^{} :
相关问题 更多 >
编程相关推荐