Jak uzyskać drugiego najbliższego sąsiada między dwoma wzorcami punktowymi w R?


12

Czy istnieje sposób na uzyskanie odległości dla drugiego najbliższego sąsiada między dwoma wzorcami punktowymi w R? Pakiet spatstat ma funkcję o nazwie nncross, ale dotyczy tylko najbliższych sąsiadów między dwoma wzorami i potrzebuję odległości do drugich najbliższych sąsiadów.

Odpowiedzi:


9

Funkcja get.knnx w pakiecie FNN może obliczyć N najbliższych sąsiadów we wzorcach punktowych.

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

teraz nn $ nn.index jest macierzą taką, że nn $ nn.index [i, j] jest rzędem w x1 dwóch najbliższych sąsiadów do rzędu i w x2 - posortowanym tak, że najbliższym jest [i, 1], i następnym sąsiadem jest [i, 2].

Funkcja zwraca również odległości i ma kilka opcji obliczania indeksów przestrzennych w celu bardzo szybkiego wyszukiwania.


Dzięki. Wpadłem jednak na pewien problem. Moje dane należą do klasy „ppp” (do użytku ze spatstat). Po podłączeniu go do get.knnw pojawia się następujący błąd> Błąd w get.knnx (rp, ponderosa, 2): listy muszą być zduplikowane w .C
RK

Po prostu pobierz współrzędne, używając as.data.frame na obiekcie ppp.
Spacedman

Czy nndist i nn, który również byłby gotowy na to zadanie? Właśnie zauważyłem dziś te dwie funkcje na liście r-sig-geo ...
Roman Luštrik

nndist i nn, które obliczają tylko najbliższe odległości w ramach jednego wzorca punktowego (co robi get.knn), a nie od jednego rodzaju punktów do innego rodzaju punktów (co robi get.knnx). Również get.knn jest dwa razy szybszy niż nndist, jeśli użyjesz algorytmu = "kd_tree".
Spacedman

@Spacedman Rozumiem. Dzięki. Właśnie widziałem crossdist. Wygląda na to, że działa jak get.knnx. Spróbuje również. Skończyło się na użyciu cbind, a następnie uzyskaniu współrzędnych X i Y, zanim przeczytałem twój komentarz. Wielkie dzięki. R nowicjusz tutaj. Głównie facet w Pythonie.
RK

6

Właśnie odkryłem, że spatstat ma funkcję crossdist .

Opis

Oblicza odległości między parami „rzeczy” pobranych z dwóch różnych zestawów danych.

Jako dane wejściowe przyjmuje dwa wzorce punktowe X i Y i zwraca macierz, której wejście [i, j] to odległość od X [i] do Y [j]. Aby uzyskać drugiego najbliższego sąsiada za pomocą 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)
}

Wiem, że już zaakceptowałem odpowiedź Spacedmana, ale chciałbym podzielić się tym, jak to zrobiłem w inny sposób.


0

Funkcja nndistw spatstatpakiecie ma argument, kktóry określa kolejność sąsiadów. Aby uzyskać odległość drugiego najbliższego sąsiada, użyj k=2. Aby uzyskać zarówno pierwszego, jak i drugiego sąsiada, użyj k=1:2.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.