Я пытаюсь понять, что происходит с моими расчетами расстояния в Канберре. Я пишу свою собственную простую функцию canberra.distance
, однако результаты не согласуются с функцией dist
. Я добавил опцию na.rm = T
к моей функции, чтобы иметь возможность рассчитать сумму при нулевом знаменателе. Из ?dist
Я понимаю, что они используют аналогичный подход: Terms with zero numerator and denominator are omitted from the sum and treated as if the values were missing.
canberra distance - непоследовательные результаты
canberra.distance <- function(a, b){
sum((abs(a - b))/(abs(a) + abs(b)), na.rm = T)
}
a <- c(0, 1, 0, 0, 1)
b <- c(1, 0, 1, 0, 1)
canberra.distance(a, b)
> 3
# the result that I expected
dist(rbind(a, b), method = "canberra")
> 3.75
a <- c(0, 1, 0, 0)
b <- c(1, 0, 1, 0)
canberra.distance(a, b)
> 3
# the result that I expected
dist(rbind(a, b), method = "canberra")
> 4
a <- c(0, 1, 0)
b <- c(1, 0, 1)
canberra.distance(a, b)
> 3
dist(rbind(a, b), method = "canberra")
> 3
# now the results are the same
пар 0-0 и 1-1, кажется проблематичным. В первом случае (0-0) и числитель, и знаменатель равны нулю, и эта пара должна быть опущена. Во втором случае (1-1) числитель равен 0, а знаменатель - нет, и тогда он также равен 0, и сумма не должна меняться.
Что мне здесь не хватает?
РЕДАКТИРОВАТЬ: Для того, чтобы быть в соответствии с определением R, функция canberra.distance
может быть изменена следующим образом:
canberra.distance <- function(a, b){
sum(abs(a - b)/abs(a + b), na.rm = T)
}
Однако результаты являются такими же, как и раньше.
Я думаю, что вы, возможно, наткнулись на ошибку в базе R. Я не уверен, но [Wolfram Alpha соглашается с вами] (https://www.wolframalpha.com/input/?i=CanberraDistance%5B% 7Б1 + 0, + 1, + 0% 7D +% 7B0 + 1, + 0 + 0% 7D% 5D). К сожалению, я не могу найти авторитетную ссылку, но ваша реализация кажется правильной согласно Wikipedia и Wolfram. –
Фактически, [документация 'dist'] (https://stat.ethz.ch/R-manual/R-devel/library/stats/html/dist.html) определяет расстояние Канберры как * sum (| x_i - y_i |/| x_i + y_i |) * (который отличается от вашего и Wolfram's). Он также отмечает, что «[t] его предназначено для неотрицательных значений (например, подсчетов): принятие абсолютного значения знаменателя является модификацией 1998 R, чтобы избежать отрицательных расстояний». - Таким образом, определение R документировано как другое. –
@ KonradRudolph Спасибо за ваш ответ! Я редактировал свой пост. С определением R из-за несоответствий расстояния в Канберре остаются, поэтому я не думаю, что это проблема. – Adela