- Предположим, у меня есть n документов, представленных в виде единичных векторов, назовите его X.
- У меня есть векторное представление одного документа, назовите его Xi.
- Как я могу найти ближайший * вектор в X к Xi без поиска грубой силы (линейное время).
* Расстояние может быть L2; пропорционально равно косинусоподобию, когда мы говорим об единичных векторах.
Мой приблизительный подход (постоянное время): 1. Отсортируйте все документы по каждому векторному измерению. 2. Использование индекса сортировки для грубой силы только через подмножество данных: например, включение всех ближайших 1000 документов для каждого векторного измерения, грубое вычисление расстояния L2 через те документы (1000), которые кажутся близкими во всех (или большинство) габариты. (макс. 1000)
Однако я хотел бы знать, есть ли «более чистое» точное решение, такое как алгоритм «разделяй и властвуй» для проблемы ближайшей пары точек, которая выполняется за время log (n).
PS: Память тоже должна масштабироваться линейно. Но это должно быть нормально.
Пример: я сохраняю 100-мерные векторные представления для 1M документов как 32-битные числа с плавающей запятой.
- Векторные представления: 1M * 100 dims * 32bit = 3.2Gbit = 400MB
- Индексы сортировки: 1M * 100 сортировок * 32 бит = 3,2 Гбит = 400 МБ