我有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))
因此,对于相对较小的数据集(最多约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] 删除。
我来说两句