Обчислення відстані до k-го найближчого сусіда для всіх точок у наборі


9

Для програми машинного навчання моїй групі потрібно обчислити евклідову відстань до го найближчого сусіда в наборі для кожного (для між 5 і приблизно 100 , і кілька сотень до кількох мільйонів). В даний час ми використовуємо або грубу силу або очевидну з деревом kd на X , яке, коли d високе і | X | відносно низький ніколи не виграє. (Все в пам’яті.)kXx(XY)Rdd|X||Y|O(d|X||XY|)Xd|X|

Здається, що повинен бути кращий спосіб, ніж груба сила, хоча б - принаймні той, хто використовує нерівність трикутника, або, можливо, з хеш-чутливими місцями. Досить чітке наближення також потенційно добре.

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


2
kd-дерева DO скористаються нерівністю трикутника. Ви спробували використовувати інші дерева з розділенням просторових даних? Інша річ, яку ви можете заглянути (я нічого не знаю про ваш алгоритм машинного навчання), чи мають конкретні точки структуру, яка може допомогти вам швидко знайти гіперплани та використовувати ті в kd-подібному дереві замість звичайного медіан-per- координатний розкол, який погано виконує високі розміри.
Росс Снайдер

@RossSnider дякую за пропозиції. І звичайно, дерева KD використовують нерівність трикутника, але я думав про щось, що було б швидше, ніж груба сила. :) Які ще види дерев, що розділяють просторові дані, ви б рекомендували? У списку Вікіпедії лише, можливо, vp-дерева здаються застосовними, і вони не здаються, що вони будуть кращими за kd-дерева для евклідової відстані. І я подумаю, чи існує кращий специфічний для визначення спосіб розділення гіперпланів, але це не спадає на думку.
Дугал

Я думаю, я сподівався, що той факт, що ми знаємо, що ми оцінюємо це для всіх (як і інших точок), дозволить отримати якусь допомогу в алгоритмі. Я не впевнений, що це так. X
Дугал

що зазвичай є у ваших програмах? k
Суреш Венкат

1
@SureshVenkat Ми зазвичай використовуємо приблизно 3, іноді трохи більше. k
Дугал

Відповіді:


10

Ось простий трюк, який може бути корисним. Розглянемо випадковий зразок, який вибирає кожну точку з вірогідністю 1 / k. Неважко переконатись, що з хорошою ймовірністю точно один із ваших k найближчих сусідів опиниться у вибірці. Обчисліть найближчого сусіда у вибірці. Повторіть цей раз (k log n) разів. З великою ймовірністю k найближчі точки в обчислених точках є k найближчими сусідами вашого запиту. Таким чином, пошук k найближчого сусіда еквівалентно виконанню запитів найближчого сусіда.O(klogn)O(klogn)

Коротше кажучи, дайте мені швидку структуру даних для відповіді на запити найближчих сусідів, і я би радий надати вам швидку структуру даних k-найближчого сусіда.


Гарний трюк. Було б добре повторно використовувати зразки для різних точок запиту, правда? Отже, щоб обчислити найближчий сусід для кожної точки в наборі, мені потрібно лише побудувати структуру даних разів. kO(klogn)
Дугал

1
Повторне використання зразків є складним, оскільки тоді ви вимагаєте, щоб фіксований зразок працював для будь-якого запиту (кількісне визначення перевернуто), і тому ймовірності змінилися б. Загальною ідеєю було б тоді побудувати набір зразків більшого розміру (це залежить від # запитів) та використовувати їх, якщо це проблема.
Суреш Венкат

@SureshVenkat Ну, звичайно. Я сів і розберу фактичні ймовірності. Дякую всім!
Дугал

Якщо ти зробиш O(klog(1/δ)) зразки, то кожен запит успішно вдається 1δ. Зауважте, що цей трюк трохи краще, ніж це здається на перший погляд - у вас єO(klogn) зразки, кожен з них розміром O(n/k) (з великою часткою ймовірності, якщо kне надто великий). Що означає кращий час запиту для кожного зразків.
Саріель Хар-Пелед

3

Дешевим орієнтовним рішенням, що використовує "хеш-чутливий хеш", буде перетворення кожної точки в біт перемежованої форми:

[xxx, yyy, zzz] -> xyzxyzxyz

потім сортування radix для попередньої обробки.

Виберіть свою точку для запиту та йдіть k балів в обох напрямках, щоб отримати розмір 2kнабір; потім візьмітьkthнайближчий до вашої точки. Також дивіться цей документ Коннора та Кумара.

Також дивіться цей документ Каллахана та Косараджу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.