Найближчі сусіди у великомірних даних?


163

Я задав запитання кілька днів тому, як знайти найближчих сусідів за заданим вектором. У мого вектора зараз 21 розмір, і перш ніж продовжувати далі, тому що я не з області машинного навчання, ані математики, я починаю задавати собі кілька основних питань:

  • Чи є евклідова відстань хорошим показником для пошуку найближчих сусідів в першу чергу? Якщо ні, які мої варіанти?
  • Крім того, як можна вирішити правильний поріг для визначення k-сусідів? Чи можна зробити якийсь аналіз, щоб визначити це значення?
  • Раніше мені пропонували використовувати kd-Trees, але на сторінці Вікіпедії чітко сказано, що для великих розмірів kd-Tree майже еквівалентний грубому пошуку. У такому випадку, який найкращий спосіб ефективно знайти найближчих сусідів у наборі даних на мільйон точок?

Чи може хтось, будь ласка, уточнити деякі (або всі) вищезазначених питань?


Спробуйте запитати на metaoptimize.com
Пейтон

4
"Високий вимір" - 20 для деяких людей, а деякі дані - 50 або 100 або 1000 для інших. Будь ласка, вкажіть цифри, якщо можете, наприклад, "Я зробив тьму 21, 1000000 точок даних, використовуючи xx".
denis

kD-Tree розбиває дані по два вздовж одного виміру. Якщо у вас 20 розмірів і лише 1М точок даних, ви отримаєте приблизно 1 рівень дерева - де рівень означає розділення на кожну вісь. Оскільки немає справжньої глибини, ви не отримаєте користі від ігнорування гілок дерева. Це корисно не думати про це так, як бінарне дерево, а більше як квадратичне дерево, октрис тощо, навіть якщо воно реалізоване як бінарне дерево.
phkahler

@denis, чи було "похмурим 21, 1000000 точок даних" для набору даних Хіггса?
nikk

1
Ось посилання для завантаження набору даних Higgs. 11 мільйонів спостережень з 28 ознаками. Останній стовпець - мітка: 1 для сигналу, нуль для шуму. archive.ics.uci.edu/ml/datasets/HIGGS
nikk

Відповіді:


179

Зараз я вивчаю такі проблеми - класифікацію, пошук найближчого сусіда - пошук музичної інформації.

Можливо, вас зацікавлять алгоритми приблизного найближчого сусіда ( ANN ). Ідея полягає в тому, що ви дозволяєте алгоритму повернутися достатньо близько сусідів (можливо, не найближчого сусіда); тим самим ви зменшуєте складність. Ви згадали про kd-дерево ; це один приклад. Але, як ви сказали, kd-дерево погано працює у великих розмірах. Насправді всі поточні методи індексації (засновані на розподілі простору) деградують до лінійного пошуку для досить високих розмірів [1] [2] [3].

Серед запропонованих останнім часом алгоритмів ANN , мабуть, найпопулярнішим є локалізація чутливих хешингу ( LSH ), яка відображає набір точок у просторовому просторі в набір бункерів, тобто хеш-таблицю [1] [3]. Але на відміну від традиційних хешів, хеш -чутливий місцеположення розміщує неподалік точки в той самий контейнер.

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

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

Нарешті, LSH сумісний з будь-якою нормою Lp для 0 < p <= 2. Тому, щоб відповісти на ваше перше запитання, ви можете використовувати LSH з евклідовою метрикою відстані, або ви можете використовувати її з метрикою відстані на Манхеттені (L1). Існують також варіанти відстані Хеммінга та подібності косинусів.

Достойний огляд написали Малкольм Слейні та Майкл Кейсі для журналу IEEE Signal Processing 2008 року [4].

LSH застосовується, здавалося б, скрізь. Ви можете спробувати.


[1] Датар, Індик, Безсмертник, Міррокні, "Схема чутливості, сприйнятливої ​​до місцевості, заснована на p-стабільних розподілах", 2004.

[2] Вебер, Шек, Блотт, "Кількісний аналіз та дослідження ефективності методів пошуку подібності у просторових просторах", 1998.

[3] Гіоніс, Індік, Мотвані, "Пошук подібності у великих розмірах за допомогою хешування", 1999.

[4] Слейні, Кейсі, "Хеш-чутливість для пошуку найближчих сусідів", 2008.


1
@Steve: Дякую за відповідь. Чи є у вас якісь пропозиції щодо впровадження LSH? Єдине, що я бачив, був той, що був з MIT. Чи є якісь інші пакети, що плавають навколо?
Легенда

1
Крім того одного, ні, я не знаю інших. Я закінчив писати своє власне на Python для моїх конкретних цілей. По суті, кожна хеш-таблиця реалізована як словник Python d, де d[k]є один бін з ключем k. d[k]містить мітки всіх точок, хеш яких є k. Потім потрібно просто обчислити хеш для кожної точки. Див. Рівняння (1) у [4], або в розділі 3 у [1].
Стів Тьоа

@Steve: Дякую за допомогу. Я почну його впроваджувати зараз. Чи маєте ви якесь уявлення про те, як ця методологія виконує випадковість для великих наборів даних?
Легенда

1
Ще одна довідка, що підтримує LSH: Порівняння найближчих сусідніх алгоритмів у просторі великих
Олівер Коулман

1
@SteveTjoa: важко було візуально зрозуміти ключові слова та вбудовану формулу. Оскільки ви вже мали єдину родзинку на LSH, я доповнив її. З найкращими намірами. Хоча ви можете повернутись. Це ваша відповідь. :)
Regexident

81

I. Метрика відстані

По-перше, кількість функцій (стовпців) у наборі даних не є фактором вибору метрики відстані для використання в kNN. Існує досить багато опублікованих досліджень, спрямованих саме на це питання, і звичайними основами для порівняння є:

  • основний статистичний розподіл ваших даних;

  • взаємозв'язок між функціями, що містять ваші дані (чи незалежні вони - тобто як виглядає матриця коваріації); і

  • простір координат, з якого отримані ваші дані.

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

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

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

Але крім тих випадків, коли ваші дані належать до некартезіанської системи координат, вибір метрики відстані, як правило, не є істотним. (Дивіться цю публікацію в блозі від студента CS, порівнюючи декілька дистанційних показників, вивчаючи їх вплив на класифікатор kNN - квадрат чі дає найкращі результати, але відмінності не великі; Більш всебічне дослідження знаходиться в науковій роботі, Порівняльне вивчення Функції відстані для найближчих сусідів - махаланобіс (по суті євклідовий, нормалізований для врахування коваріації розмірів) був найкращим у цьому дослідженні.

Одне важливе застереження: щоб обчислення метричних обчислень були значимими, ви повинні переробити масштабваші дані - рідко можливо побудувати модель kNN для створення точних прогнозів, не роблячи цього. Наприклад, якщо ви будуєте модель kNN для прогнозування спортивних показників, а вашими змінними очікуваннями є висота (см), вага (кг), жир (%) та пульс спокою (удари в хвилину), то типова точка даних може бути виглядають приблизно так: [180.4, 66.1, 11.3, 71]. Очевидно, що в обчисленні відстані буде домінувати висота, тоді як внесок жирової маси в% буде майже незначним. По-іншому, якби замість цього дані повідомлялися по-різному, щоб маса тіла була в грамах, а не в кілограмах, то початкове значення 86,1 склало б 86 100, що мало б великий вплив на ваші результати, саме це і є Не хочу.

X_new = (X_old - mu) / sigma


II. Структура даних

Якщо ви стурбовані роботою структури kd-tree, A Voronoi Tessellation - це концептуально простий контейнер, але це дозволить різко покращити продуктивність і масштабувати краще, ніж kd-Trees.

дат

Це не найпоширеніший спосіб збереження даних про навчання kNN, хоча застосування VT для цієї мети, а також наступні переваги в роботі є добре задокументованими (див., Наприклад, цей звіт Microsoft Research ). Практичне значення цього полягає в тому, що, якщо ви використовуєте "основну" мову (наприклад, в індексі TIOBE ), тоді вам слід знайти бібліотеку для виконання VT. Я знаю, що в Python і R є кілька варіантів для кожної мови (наприклад, пакет voronoi для R доступний на CRAN )

Використання VT для kNN працює так:

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

Як вибрати центри Вороного? Я використовую два ортогональних настанови. Після випадкового вибору w точок, обчисліть ПТ для ваших навчальних даних. Далі перевірте кількість точок даних, присвоєних кожному центру Вороного - ці значення повинні бути приблизно однаковими (з урахуванням рівномірної щільності точок у вашому просторі даних). У двох вимірах це призведе до того, що ПТ з плитками однакового розміру. Це перше правило, ось друге. Виберіть w за допомогою ітерації - запустіть алгоритм kNN з w як змінним параметром та виміряйте продуктивність (час, необхідний для повернення прогнозу шляхом запиту на VT).

Тож уявіть, що у вас є один мільйон точок даних ..... Якби точки зберігалися в звичайній 2D структурі даних або в kd-дереві, ви б виконували в середньому по кілька мільйонів обчислень відстані для кожногонові точки даних, змінну відповідей яких ви хочете передбачити. Звичайно, ці обчислення проводяться на одному наборі даних. За допомогою V / T пошук найближчого сусіда проводиться в два етапи один за одним, проти двох різних груп даних - спочатку проти центрів Вороного, потім, коли знайдеться найближчий центр, точки всередині комірки відповідають цей центр шукають, щоб знайти фактично найближчого сусіда (за допомогою послідовних обчислень відстані). У поєднанні ці два пошуки набагато швидші, ніж один огляд грубої сили. Це легко зрозуміти: припустимо, що для точок даних 1М вибираєте 250 центрів Вороного, щоб тіселірувати свій простір даних. У середньому кожен осередок Вороного матиме 4000 точок даних. Тож замість того, щоб проводити середні 500 000 обчислень відстані (груба сила), ви виконуєте набагато менше, в середньому всього 125 + 2000.

ІІІ. Обчислення результату (прогнозована змінна відповідь)

Існує два етапи для обчислення прогнозованого значення з набору навчальних даних kNN. Перший - це визначення n або кількості найближчих сусідів, які слід використовувати для цього обчислення. Друга - як зважити їх внесок у передбачуване значення.

З / п / т першого компонента ви можете визначити найкраще значення n, вирішивши оптимізаційну задачу (дуже схожу на оптимізацію найменших квадратів). Ось така теорія; на практиці більшість людей просто використовують n = 3. У будь-якому випадку просто запустити свій алгоритм kNN над набором тестових примірників (для обчислення прогнозованих значень) для n = 1, n = 2, n = 3 тощо і побудувати графік помилки як функції n. Якщо ви просто хочете отримати правдоподібне значення для n, щоб розпочати роботу, знову ж таки, просто використовуйте n = 3.

Другий компонент - це зважування внеску кожного з сусідів (якщо вважати n> 1).

Найпростіша техніка зважування - це просто множення кожного сусіда на коефіцієнт зважування, який є просто 1 / (dist * K), або обернена відстань від цього сусіда до тестового примірника, часто помножене на деяку емпірично отриману константу, K. I Я не прихильник цієї техніки, тому що вона часто перевантажує найближчих сусідів (і, як наслідок, недостатньо важить більш віддалених); значення цього полягає в тому, що даний прогноз може майже повністю залежати від одного сусіда, що в свою чергу підвищує чутливість алгоритму до шуму.

Потрібна краща вагова функція, яка істотно уникає цього обмеження - це гауссова функція , яка в пітоні виглядає приблизно так:

def weight_gauss(dist, sig=2.0) :
    return math.e**(-dist**2/(2*sig**2))

Щоб обчислити передбачуване значення за допомогою коду kNN, ви б ідентифікували n найближчих сусідів до точки даних, змінну відповіді яких ви хочете передбачити ('тестовий екземпляр'), а потім викликаєте функцію weight_gauss один раз для кожного з російських сусідів, передаючи на відстані між кожним сусідом тестовою точкою. Ця функція повертає вагу для кожного сусіда, яка потім використовується як коефіцієнт цього сусіда у підрахунку середньозваженого.


2
Чудова відповідь! Вичерпний і точний щодо мого досвіду.
Тед Даннінг

Приємна відповідь, +1, я додав сюди нову більш недавню відповідь , це добре?
gsamaras

1
"Отже, уявіть, у вас мільйон точок даних ..... Якщо точки зберігалися в звичайній 2D структурі даних або в kd-дереві , ви б виконували в середньому пару мільйонів обчислень відстані для кожного нового пункту даних, відповідь якого змінну, яку ви хочете передбачити. " Не погоджуюсь. Можна довести, що KD-дерева мають O(sqrt(n))складність пошуку в 2D.
Антуан

16

З чим ви стикаєтесь, відоме як прокляття розмірності . Іноді корисно запустити такий алгоритм, як PCA або ICA, щоб переконатися, що вам дійсно потрібні всі 21 розміри і, можливо, знайти лінійну трансформацію, яка дозволить вам використовувати менше 21 з приблизно однаковою якістю результату.

Оновлення: Я зіткнувся з ними у книзі під назвою Обробка біомедицинського сигналу Рангаяном (сподіваюся, що я це правильно пам’ятаю). ICA не є тривіальною технікою, але вона була розроблена дослідниками у Фінляндії, і я думаю, що код Matlab для неї є загальнодоступним для завантаження. PCA - це більш широко використовувана методика, і я вважаю, що ви повинні мати можливість знайти її R або іншу програму. PCA виконується шляхом ітераційного розв’язування лінійних рівнянь. Я робив це занадто давно, щоб пам’ятати, як. =)

Ідея полягає в тому, що ви розбиваєте свої сигнали на незалежні власні вектори (насправді дискретні власні функції) та їх власні значення 21 у вашому випадку. Кожне власне значення показує суму внеску, яку кожна власна функція надає кожному вашому вимірюванню. Якщо власне значення є крихітним, ви можете дуже тісно представляти сигнали, не використовуючи взагалі відповідну власну функцію, і таким чином ви позбудетеся виміру.


+1 Дякую Це дуже цікава пропозиція і має ідеальний сенс. Як остаточний запит, чи знайомі ви з будь-яким практичним підручником (у python чи R чи якоюсь іншою мовою), що пояснює, як це робити інтерактивно (я маю на увазі пояснення крок за кроком увесь процес). Я прочитав декілька документів з вчорашнього дня, але більшість з них здаються невідчутними. Будь-які пропозиції?
Легенда

4
Нітпікінг: ICA не є алгоритмом зменшення розмірів. Він не знає, як оцінити компоненти і не повинен використовуватися як такий.
Гаель Варо

12

Найкращі відповіді хороші, але старі, тому я хотів би додати відповідь 2016 року .


Як було сказано, у просторі з високими розмірами прокляття розмірності ховається за кутом, роблячи традиційні підходи, наприклад, популярне дерево kd, таким же повільним, як і підхід грубої сили. Як результат, ми виявляємо інтерес до приблизного найближчого пошуку сусідів (ANNS) , який на користь певної точності прискорює процес. Ви отримуєте гарне наближення точного NN, при хорошій поширеності.


Гарячі теми, які можуть бути гідними:

  1. Сучасні підходи LSH , такі як Razenshteyn 's.
  2. RKD ліс : Ліс (и) рандомізованих дерев kd (RKD), як описано в FLANN , або в недавньому підході, до якого я входив, kd-GeRaF .
  3. LOPQ, що означає локально оптимізовану квантування продукту, як описано тут . Це дуже схоже на новий підхід Бабенка + Лемптицького .

Ви також можете перевірити мої відповідні відповіді:

  1. Два набори точок високих розмірів: Знайдіть найближчого сусіда в іншому наборі
  2. Порівняння часу виконання запитів найближчих сусідів у різних структурах даних
  3. Реалізація kd-дерева PCL надзвичайно повільна

8

Щоб відповісти на запитання по черзі:

  • Ні, евклідова відстань - це погана метрика у просторі з високими розмірами. В основному у великих розмірах точки даних мають великі відмінності між собою. Це зменшує відносну різницю відстані між даною точкою даних та її найближчою та найдальшою сусідкою.
  • Багато робіт / досліджень є у даних високих розмірів, але більшість матеріалів потребує великої математичної складності.
  • Дерево KD погано впливає на великі розмірні дані ... уникайте цього будь-якими способами

Ось приємний документ, щоб розпочати роботу в правильному напрямку. " Коли в Найближчому сусіді значиме ?" by Beyer et all.

Я працюю з текстовими даними розмірами 20K і вище. Якщо ви хочете отримати поради, пов'язані з текстом, я можу вам допомогти.


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

1
У випадку з текстом ми багато використовуємо косинусну подібність. Я працюю над класифікацією тексту і виявляю, що для великих розмірів SVM з лінійними ядрами здається найбільш ефективним.
BiGYaN

@BiGYaN Як ви визначили свій простір. Я маю на увазі, що базується на базі слова вектор або вбудованому векторі?
користувач3487667

@ user3487667, простір залежить від того, як ви формулюєте свою проблему. Я говорив про просту модель мішків.
BiGYaN

5

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

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

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


Це цікаво. Чи можете ви детальніше розповісти про те, як я міг би використовувати SVM у своєму випадку? Я думав, що k-найближчі сусіди більше схожі на непідконтрольні, а SVM - під наглядом. Будь ласка, виправте мене, якщо я помиляюся.
Легенда

2
Обидва методи контролюються, оскільки ваші дані тренувань анотовані правильними класами. Якщо у вас є лише вектори функцій і не знаєте класів, до яких вони належать, ви не можете використовувати kNN або SVM. Методи навчання без нагляду зазвичай називають алгоритмами кластеризації. Вони можуть ідентифікувати групи подібних даних, але вони не розповідають, що означають групи.
Колін

Дякую за роз’яснення. Ти правий. Це дійсно наглядова техніка. Я просто не усвідомлював, що я називав категоріями, насправді теж були класи :)
Легенда

4

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

Але крім того, kd-дерева добре працюють лише з нормами Lp для всіх, що я знаю, і є ефект концентрації на відстані, який змушує алгоритми, засновані на відстані, деградувати зі збільшенням розмірності.

Для отримання додаткової інформації ви можете прочитати прокляття розмірності та різні його варіанти (у нього більше однієї сторони!)

Я не переконаний, що є багато користі для сліпого наближення найближчих сусідів Евкліда, наприклад, використання LSH або випадкових прогнозів. Можливо, у першу чергу може знадобитися набагато більш точна настройка відстані!


Чи є у вас посилання на перший та другий абзаци?
Чак

Ні, але вони повинні бути досить очевидними із звичайних даних "прокляття розмірності" (ср., Опитування ) та намагайтеся знайти будь-яке kd-дерево, яке підтримує що-небудь інше, ніж евклідове ... підтримка інших відстаней можлива, але не є загальною (ELKI допускає всі відстані Міньковського + квадрат Евкліда, але більшість матиме лише Евклідову). Просто врахуйте, що kd-дерева використовують один вимір лише для обрізки, і порівняйте це з відстані, що включає всі виміри. Крім того, ваші розбиття не зможуть розділитися у кожному вимірі.
Еріх Шуберт

3

Багато що залежить від того, чому ви хочете знати найближчих сусідів. Ви можете заглянути в алгоритм середнього зсуву http://en.wikipedia.org/wiki/Mean-shift, якщо ви дійсно хочете знайти режими вашого набору даних.


2
Наскільки я знаю, середній зсув не підходить для кластеризації даних високих розмірів. К-засоби можуть бути кращим вибором.
fdermishin

3

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


3

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


3

Я зазнав тієї ж проблеми і можу сказати наступне.

  1. Евклідова відстань є хорошою метрикою відстані, проте вона обчислювально дорожча, ніж відстань на Манхеттені , і іноді дає дещо бідніші результати, тому я вибрав би пізніший.

  2. Значення k можна знайти емпірично. Ви можете спробувати різні значення та перевірити отримані криві ROC або інший показник точності / відкликання, щоб знайти прийнятне значення.

  3. І евклідова, і Манхеттенська відстані дотримуються нерівності трикутника , тому ви можете використовувати їх у метричних деревах. Дійсно, KD-дерева сильно погіршують свої показники, коли дані мають більше 10 вимірів (я сам відчував цю проблему). Я знайшов VP-дерева кращим варіантом.


3

KD Дерева чудово працюють за 21 розмір, якщо ви кинете рано, подивившись на 5% усіх балів. FLANN робить це (та інші прискорення), щоб відповідати 128-димним SIFT-векторам. (На жаль, FLANN робить лише евклідову метрику, а швидка і міцна scipy.spatial.cKDTree робить лише метрики Lp; вони можуть бути, а може, і не відповідати вашим даним.

(Якщо ви можете описати свої дані Ndata, Nquery, розподіл даних, це може допомогти людям спробувати подібні дані.)

Додано 26 квітня, час роботи для cKDTree із відсіченням на моєму старому mac ppc, щоб дати дуже грубе уявлення про можливість:

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=1000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.1 % of the 1000000 points, 0.31 % of 188315 boxes; better 0.0042 0.014 0.1 %
3.5 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.253

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=5000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.48 % of the 1000000 points, 1.1 % of 188315 boxes; better 0.0071 0.026 0.5 %
15 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.245

2

Ви можете спробувати криву az order. Це легко для 3-х вимірів.


0

Чи є евклідова відстань хорошим показником для пошуку найближчих сусідів в першу чергу? Якщо ні, які мої варіанти?

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

Алгоритм кластеризації типу k-означає для кластеризації підпростори змішаних числових і категоричних наборів даних

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