Имам база данни с 500 000 точки в 100-измерно пространство и искам да намеря най-близките 2 точки. Как го правя?
Актуализация: Пространството е евклидово, съжалявам. И благодаря за всички отговори. BTW това не е домашна работа.
Имам база данни с 500 000 точки в 100-измерно пространство и искам да намеря най-близките 2 точки. Как го правя?
Актуализация: Пространството е евклидово, съжалявам. И благодаря за всички отговори. BTW това не е домашна работа.
Можете да опитате ANN библиотека, но това дава надеждни резултати само до 20 измерения .
Има глава в Въведение в алгоритмите, посветена на намирането на две най-близки точки в двумерното пространство в O( n*logn) време. Можете да го разгледате в google books. Всъщност го предлагам на всички, тъй като начинът, по който прилагат техниката "разделяй и владей" към този проблем, е много прост, елегантен и впечатляващ.
Въпреки че не може да се разшири директно към вашия проблем (тъй като константата 7
ще бъде заменена с 2^101 - 1
), трябва да е добре за повечето набори от данни. Така че, ако имате разумно случаен вход, това ще ви даде O(n*logn*m)
сложност, където n
е броят на точките, а m
е броят на измеренията.
редактиране
Това е всичко, ако приемем, че имате евклидово пространство. Т.е. дължината на вектора v
е sqrt(v0^2 + v1^2 + v2^2 + ...)
. Ако обаче можете да изберете показател, може да има и други опции за оптимизиране на алгоритъма.
Използвайте kd дърво. Разглеждате проблем с най-близкия съсед и има силно оптимизирани структури от данни за справяне с този точен клас проблеми.
http://en.wikipedia.org/wiki/Kd-tree
P.S. Забавен проблем!
Изпълнете PCA на вашите данни, за да конвертирате вектори от 100 измерения в 20 измерения. След това създайте K-най-близко съседно дърво (KD-Tree) и вземете най-близките 2 съседи въз основа на евклидово разстояние.
Като цяло, ако не. на измеренията са много големи, тогава трябва да използвате подход с груба сила (паралелно + разпределено/намаляване на картата) или подход, базиран на клъстериране.
Използвайте структурата от данни, известна като KD-TREE. Ще трябва да разпределите много памет, но може да откриете една или две оптимизации по пътя въз основа на вашите данни.
http://en.wikipedia.org/wiki/Kd-tree.
Мой приятел работеше върху докторската си теза преди години, когато срещна подобен проблем. Работата му беше от порядъка на 1 милион точки в 10 измерения. Създадохме kd-дърво библиотека, за да го решим. Може да успеем да изкопаем кода, ако искате да се свържете с нас офлайн.
Ето неговата публикувана статия: http://www.elec.qmul.ac.uk/people/josh/documents/ReissSelbieSandler-WIAMIS2003.pdf