R에서 두 점 패턴 사이에서 가장 가까운 두 번째 이웃을 얻는 방법은 무엇입니까?


12

R의 두 점 패턴 사이에서 가장 가까운 두 번째 이웃의 거리를 얻는 방법이 있습니까? spatstat 패키지에는 nncross라는 함수가 있지만 두 패턴 사이의 가장 가까운 이웃에만 적용되며 두 번째로 가장 가까운 이웃까지의 거리가 필요합니다.

답변:


9

패키지 FNN의 get.knnx 함수는 포인트 패턴으로 N- 최근 접 이웃을 계산할 수 있습니다.

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

이제 nn $ nn.index는 nn $ nn.index [i, j]가 x2의 i 행에 가장 가까운 두 이웃의 x1에있는 행입니다-가장 가까운 [i, 1]이되도록 정렬되었습니다. 다음 이웃은 [i, 2]입니다.

이 함수는 또한 거리를 반환하며 매우 빠른 검색을 위해 공간 인덱스를 계산할 수있는 옵션이 있습니다.


감사. 그래도 약간의 문제가 발생했습니다. 내 데이터는 'ppp'클래스입니다 (spatstat와 함께 사용). 내가 get.knnw에 연결하면, 나는 get.knnx에 다음과 같은 오류> 오류 (RP, 폰, 2) : 목록 .C에 복제해야
RK

ppp 객체에서 as.data.frame을 사용하여 좌표를 얻으십시오.
Spacedman

nndist와 nn이이 작업에 적합합니까? 오늘 r-sig-geo 목록에서이 두 기능을
보았습니다

nndist 및 nn은 한 유형의 점에서 다른 유형의 점 (get.knnx가 수행하는 것)이 아닌 단일 점 패턴 (get.knn이하는 것) 내에서 가장 가까운 거리 만 계산합니다. 또한 algorithm = "kd_tree"를 사용하면 get.knn은 nndist보다 두 배 빠릅니다.
Spacedman

@Spacedman 고마워요 방금 교차 거리를 보았습니다. get.knnx처럼 작동하는 것 같습니다. 시도해 볼 것입니다. 귀하의 의견을 읽기 전에 cbind를 사용한 다음 X 및 Y 좌표를 얻었습니다. 고마워 R 초보자입니다. 주로 파이썬 사람입니다.
RK

6

spatstatcrossdist 함수 가 있다는 것을 알았습니다 .

기술

서로 다른 두 데이터 집합에서 가져온 '사물'쌍 사이의 거리를 계산합니다.

두 점 패턴 X와 Y를 입력으로 취하고 [i, j] 항목이 X [i]에서 Y [j]까지의 거리 인 행렬을 반환합니다. 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)
}

나는 이미 Spacedman의 답변을 수락했지만 다른 방식으로 어떻게했는지 공유하고 싶습니다.


0

함수 nndistspatstat패키지 인수 가지고 k이웃의 순서를 결정한다. 두 번째로 가까운 이웃 거리를 얻으려면을 사용하십시오 k=2. 첫 번째 이웃과 두 번째 이웃을 모두 얻으려면을 사용하십시오 k=1:2.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.