Как найти ближайшие векторы к определенной точке - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть тысячи многомерных векторов вложения предложений, и я хочу вычислить ближайшее (евклидово расстояние) 4 к некоторым предопределенным кластероидам. То же самое может появиться несколько раз, если они находятся между двумя точками, некоторые вообще не появятся, если они далеко.

Например, допустим, у меня есть 6 векторов:

[1 0 3 1]
[2 1 2 1]
[3 4 1 1]
[1 0 3 1]
[2 1 2 1]
[3 4 1 1]

И Теперь я хочу знать, какие векторы 4 ближе всего к точкам [1 1 1 1] и [2 2 2 2].

Как бы я вычислил это и какой самый простой способ с точки зрения вычислительной мощности ? - Я счастлив использовать уже существующие библиотеки.

Редактировать: я добавил еще одно измерение к точкам, чтобы указать на тот факт, что я работаю в n-мерном пространстве

1 Ответ

1 голос
/ 20 февраля 2020

используйте numpy.linalg.norm для вычисления (евклидовых) расстояний, затем numpy.argsort для сортировки индексов точек по их расстоянию.

import numpy
points = numpy.array([
    [1, 0, 3],
    [2, 1, 2],
    [3, 4, 1],
    [1, 0, 3],
    [2, 1, 2],
    [3, 4, 1]
])

distances = numpy.linalg.norm(points - numpy.array([[1, 1, 1]]), axis=1)
print(distances)
print(numpy.argsort(distances))

Выходные данные

[2.23606798 1.41421356 3.60555128 2.23606798 1.41421356 3.60555128]
[1 4 0 3 2 5]

В первой строке перечислены евклидовы расстояния каждой точки в списке до контрольной точки. Во второй строке приведены индексы точек, отсортированные по их расстоянию: ближайшая точка - 1, вторая - ближайшая точка 4, третья - ближайшая точка 0, ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...