Евклидово расстояние вычисления в R не имеет смысла - PullRequest
10 голосов
/ 18 октября 2011

(Предисловие: я не статистик и не программист. Я работаю в гуманитарных науках, так что помилуй мою душу).

Мне нужно вычислить евклидово расстояние между сериями точек в R. Я использовал dist () следующим образом:

> x <- c(0,0)
> y <- c(0,10)
> dist(rbind(x,y))
   x
y 10

Пока все хорошо. Но когда я смотрел на свои результаты (с реальными числами), они были ужасно отключены. Настолько, что я решил, что мой R-скрипт собирает данные из неправильных столбцов. Но я проверил, а это не так.

Так что я начал играть с игрушечными номерами, и меня ждал сюрприз. Приведенный выше пример (вертикальная линия) работает правильно, как и следующий (горизонтальная линия):

> x <- c(0,10)
> y <- c(0,0)
> dist(rbind(x,y))
   x
y 10

Но когда линия, в которой фигурируют две точки, диагональна, возникает странность:

> x <- c(0,10)
> y <- c(0,10)
> dist(rbind(x,y))
  x
y 0

Расстояние 0? А? Это не может быть правдой.

И когда точки совпадают (это вполне возможно по моим данным), мы спускаемся по кроличьей норе:

> x <- c(0,0)
> y <- c(10,10)
> dist(rbind(x,y))
     x
y 14.14214

Разве это не должно быть 0? В конце концов, точки идентичны, поэтому между ними не может быть расстояния.

На всякий случай, если что-то не так с dist (), я попытался реализовать формулу вручную, следуя Википедии. Те же результаты:

> sqrt(sum((x - y) ^ 2))
[1] 14.14214

Как я уже говорил выше, мой математический фон минимален, поэтому я полностью ожидаю, что ошибка здесь моя. Если да, пожалуйста, объясните, что это такое и как это исправить. Но с того места, где я стою сейчас, кажется, что что-то не так.

И что хуже всего, я не могу анализировать свои данные.

Ответы [ 3 ]

15 голосов
/ 18 октября 2011

Похоже, вы хотите dist(cbind(x, y)), а не dist(rbind(x, y)).

9 голосов
/ 18 октября 2011

dist вычисляет матрицу расстояний между каждой парой строк ее аргумента. Если ваши строки идентичны, как в вашем первом «странном» примере, тогда расстояние действительно будет равно 0. Если ваши строки постоянны 0 и 10, как во втором примере, тогда расстояние действительно будет sqrt ((10- 0) ^ 2 + (10-0) ^ 2) = 14,142 ...

7 голосов
/ 18 октября 2011

Что вы думаете, что делаете, когда запускаете это:

x <- c(0,10)
y <- c(0,0)
dist(rbind(x,y))

означает, что вы определили две точки (0,0) и (10,0) и попросили R рассчитать расстояние между этими двумя точками.

Но на самом деле вы даже не просили R сделать это!

Когда вы rbind векторы x и y вместе, вы получите матрицу:

rbind(c(0,10),c(0,0))
     [,1] [,2]
[1,]    0   10
[2,]    0    0

Когда вы вызываете dist, вычисляется расстояние между строками этой матрицы. Следовательно, расстояние между ними равно 10.

Надеюсь, теперь это имеет смысл!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...