Calcul de la distance au kième voisin le plus proche pour tous les points de l'ensemble

9

Pour une application d'apprentissage automatique, mon groupe doit calculer la distance euclidienne au ème voisin le plus proche dans un ensemble pour chaque (pour entre 5 et environ 100 , et quelques centaines à quelques millions). Nous utilisons actuellement soit l'approche par force brute , soit l'approche évidente avec un arbre kd sur , qui lorsque est élevé etest relativement faible ne gagne jamais. (Tout est en mémoire.)X x ( X Y ) R d d | X | | Y | O ( d | X | | X Y | ) X d | X |kXx(XY)Rdd|X||Y|O(d|X||XY|)Xd|X|

Il semble qu'il doit y avoir un meilleur moyen que la force brute, au moins un qui tire parti de l'inégalité du triangle, ou peut-être avec des hachages sensibles à la localité. Une approximation raisonnablement serrée est également potentiellement acceptable.

La recherche que j'ai pu trouver semble se concentrer sur le problème de trouver le seul voisin le plus proche (ou celui qui est approximativement le plus proche). Le problème que je recherche a-t-il un autre nom ou existe-t-il un lien avec un problème connexe auquel je n'ai pas pensé?

Dougal
la source
2
Les arbres kd tirent parti de l'inégalité du triangle. Avez-vous essayé d'utiliser d'autres arbres de partitionnement de données spatiales? Une autre chose que vous pourriez examiner (je ne sais rien de votre algorithme d'apprentissage automatique) si les points spécifiques ont tendance à avoir une structure, ce qui pourrait vous aider à trouver rapidement des hyperplans et à les utiliser dans un arbre de type kd au lieu de la médiane par personne habituelle coordonner la répartition qui fonctionne mal dans les dimensions élevées.
Ross Snider
@RossSnider merci pour les suggestions. Et bien sûr, les arbres KD utilisent l'inégalité du triangle, mais je pensais à quelque chose qui serait plus rapide que la force brute. :) Quels autres types d'arbres de partitionnement de données spatiales recommanderiez-vous? De la liste de Wikipédia, seuls les arbres vp peuvent sembler applicables, et ils ne semblent pas être meilleurs que les arbres kd pour la distance euclidienne. Et je vais réfléchir à la meilleure façon de définir des hyperplans de séparation spécifiques aux problèmes, mais cela ne me vient pas à l'esprit.
Dougal
Je suppose que j'espérais que le fait que nous sachions que nous évaluons cela pour l'ensemble de (ainsi que pour d'autres points) permettrait une sorte d'aide dans l'algorithme. Je ne suis pas sûr que ce soit le cas, cependant. X
Dougal
qu'est-ce que dans vos applications? k
Suresh Venkat
1
@SureshVenkat Nous utilisons généralement un d'environ 3, parfois un peu plus grand. k
Dougal

Réponses:

10

Voici une astuce simple qui pourrait être utile. Prenons un échantillon aléatoire qui sélectionne chaque point avec une probabilité de 1 / k. Il est facile de vérifier qu'avec une bonne probabilité, exactement l'un de vos k voisins les plus proches se trouverait dans l'échantillon. Calculez le plus proche voisin dans l'échantillon. Répétez cette O (k log n) fois. Avec une probabilité élevée, les k points les plus proches des points calculés sont les k voisins les plus proches de votre requête. Ainsi, trouver le k voisin le plus proche équivaut à effectuer requêtes du voisin le plus proche.O ( k log n )O(klogn)O(klogn)

En bref, donnez-moi une structure de données rapide pour répondre aux requêtes du plus proche voisin, et je serais heureux de vous donner une structure de données rapide de k-plus proche voisin.

Sariel Har-Peled
la source
Joli tour. Vous devriez également pouvoir réutiliser les échantillons pour différents points de requête, non? Donc, pour calculer le -voisin le plus proche pour chaque point de l'ensemble, je n'ai qu'à construire la structure de données fois. O ( k log n )kO(klogn)
Dougal
1
La réutilisation des échantillons est délicate, car vous exigez alors qu'un échantillon fixe fonctionne pour N'IMPORTE QUELLE requête (la quantification est inversée) et donc les probabilités changeraient. L'idée générale serait alors de construire un ensemble d'échantillons de plus grande taille (cela dépend des #queries) et de les utiliser, si c'est un problème.
Suresh Venkat
@SureshVenkat Ah, bien sûr. Je vais m'asseoir et trouver les probabilités réelles. Merci tout le monde!
Dougal
Si vous faites des échantillons , chaque requête réussit avec une probabilité 1 - δ . Notez que cette astuce est légèrement meilleure qu'elle ne le semble à première vue - vous avez O ( k log n ) échantillons, chacun d'eux de taille O ( n / k ) (avec une forte probabilité si k n'est pas trop grand). Ce qui signifie un meilleur temps de requête pour chacun des échantillons. O(klog(1/δ))1δO(klogn)O(n/k)k
Sariel Har-Peled
3

Une solution approximative bon marché utilisant un "hachage sensible à la localité" serait de convertir chaque point en sa forme entrelacée de bits:

[xxx, aaaa, zzz] -> xyzxyzxyz

puis tri radix pour le prétraitement.

k2kkth

Voir également cet article de Callahan et Kosaraju.

Chad Brewbaker
la source