私はキャンベラ距離の計算で何が起こっているのか理解しようとしています。私は自分の簡単なcanberra.distance
関数を書いていますが、結果はdist
と一貫していません。ゼロ分母があるときに合計を計算できるように、私は関数にオプションna.rm = T
を追加しました。 0-0と1-1は、問題があると思われるTerms with zero numerator and denominator are omitted from the sum and treated as if the values were missing.
キャンベラ距離 - 矛盾する結果
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
ペア:?dist
から私は、彼らが同様のアプローチを使用することを理解しています。最初のケース(0-0)では、分子と分母の両方がゼロに等しく、このペアを省略する必要があります。第2の場合(1-1)の分子は0であるが、分母はそうではないので、その項もまた0であり、その和は変化してはならない。
私はここで何が欠けていますか?
EDIT: 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% 7B1、+ 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のものとは異なります)。また、負の値(例えば、カウント)を意図していることに注意してください:負の距離を避けるために、分母の絶対値をとるのは1998年の修正です。 " - Rの定義は異なると文書化されています。 –
@KonradRudolphご返信ありがとうございます!私は自分の投稿を編集しました。キャンバラ距離のR定義では、不一致が残っているので、これは問題ではないと私は考えています。 – Adela