Comment obtenir le deuxième plus proche voisin entre deux motifs de points dans R?

12

Existe-t-il un moyen d'obtenir les distances pour le deuxième plus proche voisin entre deux motifs de points dans R? Le paquet spatstat a une fonction appelée nncross mais il ne s'applique qu'aux voisins les plus proches entre deux modèles et j'ai besoin des distances aux seconds voisins les plus proches.

RK
la source

Réponses:

9

La fonction get.knnx dans le package FNN peut calculer les N voisins les plus proches dans les modèles de points.

x1 = cbind(runif(10),runif(10))
x2 = cbind(runif(10),runif(10))
nn = get.knnx(x1,x2,2)

maintenant nn $ nn.index est une matrice telle que nn $ nn.index [i, j] est la ligne en x1 des deux voisins les plus proches de la ligne i en x2 - triée de sorte que la plus proche soit [i, 1], et le prochain voisin est [i, 2].

La fonction renvoie également les distances pour vous et dispose de quelques options pour calculer les index spatiaux pour des recherches très rapides.

Spacedman
la source
Merci. Ran dans un peu de problème cependant. Mes données sont de classe 'ppp' (à utiliser avec spatstat). Lorsque je le branche sur get.knnw, j'obtiens l'erreur suivante> Erreur dans get.knnx (rp, ponderosa, 2): les listes doivent être dupliquées en .C
RK
Obtenez simplement les coordonnées en utilisant as.data.frame sur votre objet ppp.
Spacedman
Nndist et nnwhich seraient-ils également prêts pour cette tâche? Je viens de remarquer ces deux fonctions sur la liste r-sig-geo aujourd'hui ...
Roman Luštrik
nndist et nn qui calculent uniquement les distances les plus proches dans un modèle de point unique (ce que fait get.knn), pas d'un type de points à un autre type de points (ce que fait get.knnx). En outre, get.knn est deux fois plus rapide que nndist si vous utilisez algorithm = "kd_tree".
Spacedman
@Spacedman J'ai compris. Merci mec. Je viens de voir crossdist. Il semble fonctionner comme get.knnx. J'essaierai aussi. J'ai fini par utiliser cbind puis à obtenir les coordonnées X et Y avant de lire votre commentaire. Merci beaucoup. R débutant ici. Surtout un gars Python.
RK
6

Je viens de découvrir que spatstat a une fonction crossdist .

La description

Calcule les distances entre des paires de «choses» tirées de deux ensembles de données différents.

Il prend deux modèles de points X et Y en entrée et renvoie la matrice dont l'entrée [i, j] est la distance de X [i] à Y [j]. Pour obtenir le deuxième voisin le plus proche à l'aide de crossdist:

xdistances <- crossdist(X, Y)  #Get all cross distances    

nn = numeric() 
for (i in 1:nrow(X)) {   
  xdistance <- sort(xdistances[i,], partial=2)[2]   
  nn <- append(nn, xdistance)
}

Je sais que j'ai déjà accepté la réponse de Spacedman mais je voudrais partager comment je l'ai fait d'une autre manière.

RK
la source
0

La fonction nndistdans le spatstatpackage a un argument kqui détermine l'ordre des voisins. Pour obtenir la deuxième distance du voisin le plus proche, utilisez k=2. Pour obtenir à la fois le premier et le second voisins, utilisez k=1:2.

Adrian Baddeley
la source