2010-10-06 6 views
4

Je souhaite utiliser KDTree de scipy.spatial pour trouver les paires de voisins les plus proches dans un tableau à deux dimensions (essentiellement une liste de listes où la dimension de la liste imbriquée est 2). Je génère ma liste de listes, la place dans le tableau de numpy, puis crée l'instance de KDTree. Cependant, chaque fois que j'essaie de lancer une "requête", je reçois inévitablement des réponses bizarres. Par exemple, lorsque je tape:Problème de type de données utilisant scipy.spatial

tree = KDTree(array) 
nearest = tree.query(np.array[1,1]) 

affiche le plus proche (0,0, 0). Actuellement, j'utilise un tableau qui est fondamentalement y = x pour la gamme (1,50) donc je m'attends à ce que je devrais obtenir le plus proche voisin de (2,2) pour (1,1)

est-ce que je fais mal, gourous scipy?

EDIT: Sinon, si quelqu'un peut me diriger vers un paquet KDTree pour Python qu'ils ont utilisé pour les recherches de plus proches voisins d'un point donné, j'aimerais beaucoup en entendre parler.

Répondre

7

J'ai utilisé scipy.spatial auparavant, et il semble être une amélioration intéressante (surtout par rapport à l'interface) par rapport à scikits.ann.

Dans ce cas, je pense que vous avez confondu le retour de votre appel tree.query(...). De l'scipy.spatial.KDTree.querydocs:

Returns 
------- 

d : array of floats 
    The distances to the nearest neighbors. 
    If x has shape tuple+(self.m,), then d has shape tuple if 
    k is one, or tuple+(k,) if k is larger than one. Missing 
    neighbors are indicated with infinite distances. If k is None, 
    then d is an object array of shape tuple, containing lists 
    of distances. In either case the hits are sorted by distance 
    (nearest first). 
i : array of integers 
    The locations of the neighbors in self.data. i is the same 
    shape as d. 

Donc dans ce cas lorsque vous interrogez le plus proche de vous [1,1] obtenez:

distance to nearest: 0.0 
index of nearest in original array: 0 

Cela signifie que [1,1] est la première ligne de vos données originales array, ce qui est attendu étant donné vos données est y = x on the range [1,50].

La fonction scipy.spatial.KDTree.query a beaucoup d'autres options, donc si par exemple, vous vouliez vous assurer d'obtenir le plus proche voisin qui ne s'essayer:

tree.query([1,1], k=2) 

Cela renverra les deux voisins les plus proches , auquel vous pouvez appliquer une logique supplémentaire de telle sorte que la distance retournée soit nulle (le point demandé est l'un des éléments de données utilisés pour construire l'arbre) le second plus proche voisin est pris plutôt que le premier.

+0

Merci bien. Fait beaucoup plus de sens maintenant! – jlv

Questions connexes