Найти ближайший Вектор из списка векторов / 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 возвращает индекс, при котором это происходит

надеюсь, что это помогает.