#python #nested-loops #distance
#python #вложенные циклы #расстояние
Вопрос:
Я получил около 9000 траекторий, для проекта я должен рассчитать расстояние между каждым из них. Траектория состоит из 11 точек, и каждая точка содержит координаты x и y. Просто сгенерируйте образец набора данных с помощью:
import numpy as np
trajs = np.random.rand(9000,11,2)
Я взял функцию расстояния Фреше изhttps://pypi.org/project/similaritymeasures /, который принимает две траектории в качестве входных данных, а на выходе — значение с плавающей точкой.
В начале я написал вложенный цикл for:
from similaritymeasures import frechet_dist
distance_matrix = []
for i in trajs:
for j in trajs:
distance_matrix.append(frechet_dist(i,j))
Получение результатов занимает слишком много времени.
Поскольку вычисление расстояния является симметричным (т. Е. frechet_dist (t1, t2) = frechet_dist (t2,t1) ), я уменьшаю время вычисления до половины указанного выше таким образом:
from scipy.spatial.distance import squareform
n = len(trajs)
distance_matrix = []
flag = 0
for i in range(n):
for j in range(flag,n):
if i != j:
distance_matrix.append(frechet_dist(trajs[i],trajs[j]))
flag = 1
dist_mat = squareform(np.asarray(distance_matrix))
Теперь для 9000 траекторий требуется 19 часов. Я получил результат, но он все еще слишком длинный. Существуют ли какие-либо методы для ускорения вычисления?
Комментарии:
1. Вам нужна полная матрица расстояний? Или, возможно, только экстремальные значения. Кроме того, если вы можете использовать случайные данные для генерации матрицы одинаковой формы, мы можем помочь вам лучше.
2. Первоначальная идея заключалась в использовании матрицы расстояний в качестве матрицы подобия для кластеризации этих траекторий. Полная матрица будет вводиться некоторыми алгоритмами, такими как DBSCAN. Я обновляю образец набора данных в вопросе, спасибо за помощь!