Задача пошуку найближчого сусіда є задачею оптимізації, яка полягає у відшуканні у множині елементів, розташованих у багатовимірному метричному просторі, елементів, близьких до заданого, відповідно до заданої функції близькості. Формально ця задача ставиться наступним чином: надано множину точок S у просторі M та точку q ∈ M, необхідно знайти найближчу до q точку в S. Дональд Кнут в Мистецтві програмування (том 3, 1973) назвав це проблемою поштового відділення, посилаючись на застосування цієї задачі до пошуку найближчого поштового відділення. Прямим узагальненням задачі пошуку найближчого сусіда є алгоритм пошуку k-NN, який призначений для пошуку k найближчих точок.

Найчастіше M є метричним простором і запроваджується функція близькості, що визначається як метрика, яка є симетричною і задовольняє нерівності трикутника. Ще загальніше, M — це d-вимірний векторний простір, в якому близькість береться як Евклідова метрика, вулична метрика або інші метрики. Однак функція близькості може бути довільною. Одним з прикладів може бути метрика Брегмана [en] , для якої нерівність трикутника не виконується.

Застосування

Задача пошуку найближчого сусіда зустрічається у багатьох областях, наприклад:

  • розпізнавання образів;
  • класифікація документів;
  • рекомендаційні і експертні системи;
  • динамічне розміщення реклами в Інтернеті.

Моделі даних

Перед вирішенням прикладної задачі необхідно обрати форму подання об'єктів і функцію близькості. У більшості випадків об'єкти подаються у вигляді багатовимірних векторів, а як функція близькості використовується скалярний добуток векторів, але можуть бути й інші форми подання даних, наприклад:

  • множини — розмір перетину множин;
  • рядки — відстань Левенштейна;
  • граф — відповідність структур.

Споріднені задачі

Існують численні варіанти задачі пошуку найближчих сусідів. Окрім класичної задачі знаходження найближчої до заданої точки, можуть бути поставлені задачі:

  • знайти близьких сусідів (не обов'язково найближчого);
  • знайти найближчого сусіда для групи елементів;
  • знайти кількох найближчих сусідів;
  • знайти усі пари елементів, відстань між якими менша за деяку задану;
  • знайти найближчих сусідів у середі, що динамічно змінюється.

Одним з найбільш відомих варіантів є k-NN пошук.

Алгоритми

Було запропоновано багато алгоритмів вирішення задачі пошуку найближчого сусіда. Якість та корисність алгоритмів визначається часовою складністю запитів, а також складністю усіх структур пошуку інформації, що мають підтримуватися. Не існує загального вирішення задачі у багатовимірному Евклідовому просторі, яке б використовувало поліноміальний час попередньої обробки та полілогаріфмічній час пошуку даних.

Послідовний пошук

Найпростішим способом розв'язання задачі, є обчислення відстані від заданої точки до кожної іншої точки в наборі даних, постійно відстежуючи найкращий результат на даний момент. Цей алгоритм називають прямими методом, і його складність виконання становить O(dN), де N — це потужність множини точок S, а d — це розмірність простору M. Для реалізації не потрібні ніякі додаткові структуру для пошуку даних, тому лінійний пошук не потребує додаткового простору даних крім початкового набору даних.

Розбиття простору

  • Діаграма Вороного;
  • KD-дерева;
  • BSP-дерева;
  • Дерева покриттів [ru] ;
  • VP-дерево [en] ;
  • R-дерево.

Зворотній індекс

  • Метод рідкісних точок.

Інші

  • Хешування;
  • Алгоритм Клейнберга [ru] .

У цій статті використовується матеріал з статті Вікіпедії Пошук найближчого сусіда, який випущений під Creative Commons Attribution-Share-Alike License 3.0.