Як отримати другого найближчого сусіда між двома точковими шаблонами в R?


12

Чи є спосіб отримати відстань для другого найближчого сусіда між двома точковими візерунками в R? У пакеті spatstat є функція nncross, але вона стосується лише найближчих сусідів між двома шаблонами, і мені потрібні відстані до другого найближчого сусіда.

Відповіді:


9

Функція get.knnx в пакеті FNN може обчислити 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] - це рядок у x1 двох найближчих сусідів до рядка i в x2 - відсортований так, що найближчий дорівнює [i, 1], і наступний сусід - [i, 2].

Функція також повертає відстані для вас і має деякі варіанти обчислення просторових індексів для дуже швидкого пошуку.


Дякую. Хоча зіткнувся з проблемою. Мої дані класу 'ppp' (для використання зі шпателем). Коли я підключаю його до get.knnw, я отримую таку помилку> Помилка в get.knnx (rp, ponderosa, 2): списки повинні бути дубльовані у .C
RK

Просто вийдіть координати, використовуючи as.data.frame на вашому ppp-об’єкті.
Розміщений

Чи буде також nndist і nnwich, що також вирішили би це завдання? Щойно помітив ці дві функції в списку r-sig-geo сьогодні ...
Роман Луштрик

nndist і nnwh, які обчислюють лише найближчі відстані в межах однієї точкової картини (саме це і робить get.knn), а не від одного типу точок до іншого типу точок (що і робить get.knnx). Крім того, get.knn є вдвічі швидшим, ніж nndist, якщо ви використовуєте алгоритм = "kd_tree".
Розміщений

@Spacedman Зрозумів. Спасибі людина. Я щойно бачив кросдист. Здається, працює як get.knnx. Спробую і це. Я закінчив використовувати cbind, а потім отримав координати X і Y, перш ніж прочитати ваш коментар. Дуже дякую. R новачок тут. Переважно хлопець Python.
РК

6

Я тільки що виявив , що spatstat має crossdist функцію.

Опис

Обчислює відстані між парами "речей", взятих з двох різних наборів даних.

Він бере два точкові візерунки X і Y як вхідні дані і повертає матрицю, запис [i, j] - це відстань від X [i] до Y [j]. Щоб отримати другого найближчого сусіда за допомогою кросдіста:

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

Функція nndistв spatstatпакеті має аргумент, kякий визначає порядок сусідів. Щоб отримати другу сусідню відстань, використовуйте k=2. Щоб отримати і першого, і другого сусідів, використовуйте k=1:2.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.