我正在尝试理解我的坎贝拉距离计算的情况。我编写了自己简单的
然而,结果与之前相同。
canberra.distance
函数,但结果与dist
函数不一致。我在函数中添加了选项na.rm = T
,以便在分母为零时能够计算总和。从?dist
中我了解到,它们使用类似的方法:分子和分母为零的术语被省略在总和之外,并被视为缺失值。
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,因此这个项也为 0,总和应该保持不变。
我在这里错过了什么吗?
编辑:
为了与 R 定义相一致,函数 canberra.distance
可以修改如下:
canberra.distance <- function(a, b){
sum( abs(a - b) / abs(a + b), na.rm = T )
}
然而,结果与之前相同。
dist
的文档将Canberra距离定义为*sum(|x_i - y_i| / |x_i + y_i|)*(这与您和Wolfram的定义不同)。它还指出:“[t]这适用于非负值(例如计数):取分母的绝对值是1998年R修改的一项,以避免负距离。”-因此,R的定义已记录为不同。 - Konrad Rudolph