title: Vantage point tree
text: # Vantage point tree
  
  Un arbre à points de vue (ou vp-tree, abréviation de l'appellation anglaise vantage point tree) est un arbre métrique permettant de partitionner n'importe quel espace de données pourvu d'une métrique. Le processus de construction de l'arbre consiste à sélectionner un point (ledit "point de vue" ou "point d'observation / de référence", vantage point en anglais), puis à diviser l'espace en deux sous-espaces : un sous-espace gauche (ou intérieur) contenant l'ensemble des points à une distance du point pivot inférieure à un certain seuil, et un sous-espace droit (ou extérieur) contenant l'ensemble des points ne remplissant pas cette condition. Le processus est appliqué de manière récursive, produisant des sous-espaces de plus en plus petits. Le vp-tree résultant est une structure de données arborescente telle qu'une proximité dans l'arbre est représentative d'une proximité dans l'espace ainsi partitionné.
  
  Ce processus de partitionnement itératif est similaire à celui d'un k-d tree, mais utilise des partitions circulaires (ou sphériques, hypersphériques, etc.) plutôt que rectilignes. Dans un espace euclidien bidimensionnel, il produit un découpage en régions dont la forme est semblable à des coquilles sphériques (voir Figure 1. et Figure 2. dans (Yianilos, 1993)).
  
  ## Histoire
  
  La première mention de cette méthode remonte à 1991 : elle est présentée sous le nom d'arbre métrique dans un article publié par Jeffrey Uhlmann. Toutefois, on doit l'appellation vantage point tree à Peter Yianilos, qui affirme dans un papier datant de 1993 avoir formalisé cette méthode indépendamment des recherches de J. K. Uhlmann. Dans cette publication, il introduit trois versions du vp-tree (vp-tree, $vp^s-tree,$ $vp^{sb}-tree).$
  
  En 1999, T. Bozkaya et M. Ozsoyoglu proposent les arbres à points de vue multiples (ou mvp-tree, abréviation de l'appellation anglaise multivantage point tree). Les mvp-trees sont une généralisation des vp-trees. Cette approche a été développée afin d'améliorer les propriétés des vp-trees lors de requêtes de recherche de similarité sur de grands espaces métriques. La différence majeure est l'utilisation de plus d'un point de référence pour partitionner l'espace à chaque $niveau^,.$
  
  En 2009, Nielsen et al créent les bvp-trees (ou Bregman ventage point trees) et étendent ainsi les vp-trees à des espaces non métriques en utilisant les divergences de Bregman.
  
  ## Construction
  
  La construction la plus simple d'un vp-tree consiste à partitionner l'espace à l'aide de coupes sphériques de la façon suivante :
  
  À chaque nouveau nœud, sélectionner un point pivot v ("vantage point") parmi les points du nœud ;
  
  Calculer les distances de tous les autres points (c.-à-d. les points qui seront indexés sous ce nœud) au point pivot ;
  
  Calculer la distance médiane $dist_{m}$ et l'utiliser comme distance seuil, de façon que la moitié des points se trouve à l'intérieur de la boule de centre v et de rayon $dist_{m}$, et l'autre moitié à l'extérieur ;
  
  Associer les points qui se trouvent à l'intérieur de la boule au sous-arbre de gauche, et ceux se trouvant à l'extérieur au sous-arbre de droite ;
  
  Construire de manière récursive les branches de niveau inférieur.
  
  Le vp-tree est une structure de données intéressante car elle ne nécessite aucune connaissance des points autre que le résultat de l'évaluation de la fonction de distance qui satisfait les propriétés de l'espace métrique. Cette méthode d'indexation basée uniquement sur la distance peut donc aussi être utilisée dans des espaces métriques non standards (et notamment : non euclidens). Elle ne fait aucune hypothèse sur la géométrie de l'espace de données.
  
  ## Recherche du plus proche voisin
  
  Un vp-tree peut être utilisé pour trouver le plus proche voisin ${x}_{best}$ d'un point $x_{1}$. Cette recherche peut être couplée à une condition de distance maximale $\tau$ qu'un point voisin doit respecter pour être considéré comme "suffisamment proche".
  
  L'algorithme de recherche est récursif. Une implémentation possible est la $suivante^,$ :
  
  À chaque nœud, de point pivot v ("vantage point") et de distance seuil t ("threshold"), calculer la distance $dist(x_{1},v)$ de $x_{1}$ à v ;
  
  Si $dist(x_{1},v)\leq \tau$, stocker les nouvelles valeurs : ${x}_{best}=v$, $\tau =dist(x_{1},{x}_{best})$ ;
  
  Si $dist(x_{1},v)+t\leq \tau$, alors tous les points du sous-arbre de gauche sont à une distance inférieure ou égale à $\tau$ de $x_{1}$. Chercher de manière récursive dans le sous-arbre de gauche (intérieur de la boule) ;
  
  Si $dist(x_{1},v)\leq t+\tau$, chercher de manière récursive dans le sous-arbre de gauche (intérieur de la boule) ;
  
  Si $dist(x_{1},v)\geq t-\tau$, chercher de manière récursive dans le sous-arbre de droite (extérieur de la boule).
  
  Le pire des cas arrive lorsque $t-\tau \leq dist(x_{1},v)\leq t+\tau$, c'est-à-dire lorsque l'ensemble des points candidats (i.e qui pourraient satisfaire la requête) intersecte à la fois la boule associée au sous-arbre gauche et la boule associée au sous-arbre droit. Dans ce cas, il faut chercher de manière récursive dans les deux sous-arbres : aucun élagage de l'arbre n'est possible.
  
  ## Complexité
  
  La méthode de construction la plus simple a une complexité de O(n log n). Pour chaque élément, log n niveaux sont parcourus pour trouver son emplacement.
  
  La temps d'exécution d'une recherche d'un unique plus proche voisin est d'environ O(log n).
  
  Le temps nécessaire au parcours d'un vp-tree pour un ensemble de données, peut varier considérablement en fonction des spécificités de l'algorithme utilisé et du choix des paramètres. L'article de S. Brin détaille les performances de plusieurs variantes algorithmiques du vp-tree, pour plusieurs valeurs de paramètres, afin d'étudier le coût de chacune d'entre elles. Le coût est mesuré en nombre de calculs de distance.
  
  Le coût en termes d'espace de stockage pour un vp-tree est linéaire (environ n). Chaque point de données est stocké et chaque élément de chaque nœud interne (c.-à-d. non feuille) nécessite un pointeur vers ses nœuds descendants. (Voir S. Brin pour plus de détails sur le choix de l'implémentation. Le paramètre codant pour le nombre d'éléments à chaque nœud joue un rôle important. )
  
  Notez que certains outils d'espace métrique nécessitent le calcul d'une matrice de distances par paires, de coût $O(n^2).$ Ce n'est pas nécessaire avec les vp-trees.
  
  