Найти ближайший Вектор из списка векторов / Python
Если вам дан список из 10 векторов, называемых A, которые представляют разные группы. Тогда у вас есть временной ряд векторов v1, v2,..., vn, каждый из которых также является вектором. Мне было интересно,есть ли способ найти "ближайший" вектор в A для каждого v1, v2,..., vn если вы определяете некоторую метрику расстояния?
есть ли быстрый способ сделать это, кроме зацикливания и просто сравнения всех записей?
Edit: Нет, я не спрашиваю, Как сделать k-means или что-то вроде что.
3 ответов
можно использовать пространственное KDtree в scipy. Он использует быстрый алгоритм для определения следующих точек для векторов произвольной размерности.
редактировать: извините, если вы ищете произвольные метрики, дерево, подобное структуре, все еще может быть вариантом.
вот пример:
>>> from scipy import spatial
>>> A = [[0,1,2,3,4], [4,3,2,1,0], [2,5,3,7,1], [1,0,1,0,1]]
>>> tree = spatial.KDTree(A)
это устанавливает KDTree со всеми точками в A, что позволяет выполнять быстрый пространственный поиск внутри него. Такие запрос принимает вектор и возвращает ближайшего соседа в A для него:
>>> tree.query([0.5,0.5,0.5,0.5,0.5])
(1.1180339887498949, 3)
первое возвращаемое значение-это расстояние до ближайшего соседа, а второе его положение в A, такое, что вы можете получить его, например, следующим образом:
>>> A[ tree.query([0.5,0.5,0.5,0.5,0.5])[1] ]
[1, 0, 1, 0, 1]
Если вы определяете метрику, вы можете использовать ее в мин:
closest = min(A, key=distance)
таким образом, некоторый пример кода:
# build a KD-tree to compare to some array of vectors 'centall'
tree = scipy.spatial.KDTree(centall)
print 'shape of tree is ', tree.data.shape
# loop through different regions and identify any clusters that belong to a different region
[d1, i1] = tree.query(group1)
[d2, i2] = tree.query(group2)
Это возвращает переменные d и i. d сохраняет ближайшее расстояние I возвращает индекс, при котором это происходит
надеюсь, что это помогает.