W przypadku aplikacji uczenia maszynowego moja grupa musi obliczyć odległość euklidesową do tego najbliższego sąsiada w zbiorze dla każdego (dla od 5 do około 100 oraz kilkaset do kilku milionów). Obecnie podejście albo oczywiste z drzewem kd na , które gdy jest wysokie, ajest stosunkowo niski, nigdy nie wygrywa. (Wszystko jest w pamięci.)
Wydaje się jednak, że musi istnieć lepszy sposób niż brutalna siła - przynajmniej taki, który wykorzystuje nierówność trójkąta, a może z hashami wrażliwymi na lokalizację. Racjonalnie ścisłe zbliżenie jest również potencjalnie w porządku.
Badania, które udało mi się znaleźć, wydają się koncentrować na problemie znalezienia pojedynczego najbliższego sąsiada (lub takiego, który jest w przybliżeniu najbliższy). Czy problem, którego szukam, ma inną nazwę, czy jest związek z powiązanym problemem, o którym nie myślałem?
Odpowiedzi:
Oto prosta sztuczka, która może się przydać. Rozważ losową próbkę, która wybiera każdy punkt z prawdopodobieństwem 1 / k. Łatwo jest zweryfikować, że z dużym prawdopodobieństwem dokładnie jeden z najbliższych sąsiadów będzie w próbie. Oblicz najbliższego sąsiada w próbce. Powtórz to O (k log n) razy. Z dużym prawdopodobieństwem k najbliższych punktów wO(klogn) obliczone punkty są najbliższymi sąsiadami twojego zapytania. Zatem znalezienie najbliższego sąsiada jest równoznaczne z robieniemO(klogn) zapytania najbliższego sąsiada.
Krótko mówiąc, daj mi szybką strukturę danych do odpowiadania na zapytania najbliższego sąsiada, a chętnie dam ci szybką strukturę danych k-najbliższego sąsiada.
źródło
Tanim przybliżonym rozwiązaniem wykorzystującym „hash wrażliwy na lokalizację” byłoby przekonwertowanie każdego punktu na jego postać z przeplotem bitowym:
[xxx, rrr, zzz] -> xyzxyzxyz
następnie sortuj Radix do wstępnego przetwarzania.
Wybierz punkt, w którym chcesz zapytać, i idźk wskazuje w obu kierunkach, aby uzyskać rozmiar 2k zestaw; następnie weźkth najbliżej twojego punktu. Zobacz także ten artykuł autorstwa Connora i Kumara.
Zobacz także ten artykuł Callahan i Kosaraju.
źródło