Come ottenere il secondo vicino più vicino tra due schemi di punti in R?


12

C'è un modo per ottenere le distanze per il secondo vicino più vicino tra due schemi di punti in R? Il pacchetto spatstat ha una funzione chiamata nncross ma si applica solo ai vicini più vicini tra due schemi e ho bisogno delle distanze dai secondi vicini più vicini.

Risposte:


9

La funzione get.knnx nel pacchetto FNN può calcolare i vicini N-più vicini in schemi di punti.

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

ora nn $ nn.index è una matrice tale che nn $ nn.index [i, j] è la riga in x1 dei due vicini più vicini alla riga i in x2 - ordinata in modo che il più vicino sia [i, 1] e il prossimo vicino è [i, 2].

La funzione restituisce anche le distanze per te e ha alcune opzioni per calcolare gli indici spaziali per ricerche molto veloci.


Grazie. Ho riscontrato un po 'di problemi. I miei dati sono di classe 'ppp' (per l'uso con spatstat). Quando lo collego a get.knnw, ottengo il seguente errore> Errore in get.knnx (rp, ponderosa, 2): gli elenchi devono essere duplicati in .C
RK

Ottieni le coordinate usando as.data.frame sul tuo oggetto ppp.
Spacedman

Nndist e nnche sarebbero anche all'altezza di questo compito? Ho appena notato queste due funzioni nell'elenco r-sig-geo oggi ...
Roman Luštrik,

nndist e nn che calcolano solo le distanze più vicine all'interno di un singolo schema di punti (che è ciò che fa get.knn), non da un tipo di punti a un altro tipo di punti (che è ciò che fa get.knnx). Inoltre, get.knn è due volte più veloce di nndist se usi algoritmo = "kd_tree".
Spacedman

@Spacedman Capito. Grazie uomo. Ho appena visto crossdist. Sembra funzionare come get.knnx. Ci proverò pure. Ho finito per usare cbind e quindi ottenere le coordinate X e Y prima di leggere il tuo commento. Molte grazie. R principiante qui. Principalmente un ragazzo Python.
RK,

6

Ho appena scoperto che spatstat ha una funzione crossdist .

Descrizione

Calcola le distanze tra coppie di "cose" prese da due diversi set di dati.

Prende due modelli di punti X e Y come input e restituisce la matrice la cui voce [i, j] è la distanza da X [i] a Y [j]. Per ottenere il secondo vicino più vicino usando 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)
}

So di aver già accettato la risposta di Spacedman ma vorrei condividere il modo in cui l'ho fatto in un altro modo.


0

La funzione nndistnel spatstatpacchetto ha un argomento kche determina l'ordine dei vicini. Per ottenere la seconda distanza vicina più vicina, usare k=2. Per ottenere sia il primo che il secondo vicino, usa k=1:2.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.