2010-04-14 5 views
4

J'ai un ensemble de vecteurs. Pour un vecteur dans cet ensemble, j'aime trouver le sous-ensemble le plus proche de ce vecteur. Quel algorithme peut le faire.Algorithmes pour trouver le vecteur le plus proche

+1

Vos vecteurs représentent-ils des "points" ou des "directions"? Je demande parce que la mesure de distance cosinus mentionnée dans certaines réponses normalisera l'amplitude, ce qui peut ne pas être ce que vous voulez si vous cherchez une distance euclidienne (ou une autre norme de Minkowski). Si c'est le cas, vous voulez un algorithme conventionnel du plus proche voisin, kd-trees, clustering k-means, etc.) – tzaman

Répondre

3

utiliser la similitude de cosinus (http://en.wikipedia.org/wiki/Cosine_similarity) parmi les vecteurs, puis les trier.

+0

+1 Je n'allais mentionner que le produit scalaire. Je n'ai pas pensé aux longueurs de vecteurs. Merci de me sauver du ridicule;) –

+0

nous ne savons pas ce qu'il veut comme distance –

3

Cette classe d'algorithmes est appelée Plus proche voisin ou K Plus proche voisin.

Le cosine similarity comme dit excepeiont fonctionnera si la direction du vecteur est importante. Si le vecteur représente une position dans un espace, alors n'importe quelle métrique pour représenter une distance dans l'espace fonctionnera.

Par exemple le Euclidean distance: prenez la racine carrée de la somme des carrés de différence dans chaque dimension. Cela vous donnera une distance pour chaque vecteur, puis triera votre ensemble de vecteurs croissant sur cette distance.

Ce processus sera O (N) dans le temps. Si cela est trop lent pour vous, vous pourriez vouloir regarder quelques algorithmes communs K Nearest Neighbour.

1

Si votre problème est lié à une grande quantité de données:

I a publié un algorithme connexe sur ddj.com, qui trouve la ligne la plus proche à un point donné :

Accelerated Search For the Nearest Line

Vous Il faudrait modifier cet algorithme, c'est-à-dire en convertissant le vecteur donné en un certain nombre de points. Cela permettra de réduire le nombre de possibles matchs de manière drastique. Le match exact doit alors être vérifiée pour chaque match possible par

  • Trouver le point de coupe des deux vecteurs ou
  • Get distance de début de vecteur et point final pour le match possible, comme décrit dans l'article
Questions connexes