2017-04-24 11 views
0

が好き:私はそれぞれの分布を得ることができますRでは、文字列の2つのベクトル間のKL距離の計算方法は?私は、文字列の2つのベクトルを持っている場合

> list1 = c("cat", "dog", "cat", "rabbit", "dog", "cat") 
> list2 = c("dog", "rabbit", "dog", "mouse", "dog", "rabbit", "cat") 

。例えば:私はこれら二つの分布間のKL距離を計算するにはどうすればよい

> dist1 = table(list1)/length(list1) 
> dist2 = table(list2)/length(list2) 
> dist1; dist2 

list1 
     cat  dog rabbit 
0.5000000 0.3333333 0.1666667 
list2 
     cat  dog  mouse rabbit 
0.1428571 0.4285714 0.1428571 0.2857143 

? (dist2をベースラインとして使用する)

私が見たKL関数(例:kl.dist)には同じ長さのベクトルが必要です。

+2

この尺度(カルバック・ライブラー)離散分布のためには、確率の各ペアの商の対数を用います。あなたがそれを見ても(マウスの確率はリスト1ではゼロです)、ゼロのログまたはゼロの除算のログが必要です。どちらも無用です。この距離を計算するには、すべての確率がゼロでない必要があります。 – Gladwell

+0

実際には、ベース分布(ここではdist2)のみが非ゼロである必要があります。 pが0の場合、p * log(p/q)はゼロと定義されます。そのため、私はdist2をベースラインとして使用しています。いずれにせよ、私はまだKL距離の計算方法に興味があります。 – kf913

+0

同じ長さの分布を作成し、欠損値の分布を0に設定するだけではどうですか? –

答えて

0

以下は各ベクトル文字列の分布と一つの列を有するデータフレームを生成する。

library(dplyr) 

list1 <- c("cat", "dog", "cat", "rabbit", "dog", "cat") 
list2 <- c("dog", "rabbit", "dog", "mouse", "dog", "rabbit", "cat") 

dist1 <- table(list1)/length(list1) 
dist2 <- table(list2)/length(list2) 

BothDist <- full_join(as.data.frame(dist1),as.data.frame(dist2), by = c("list1" = "list2")) 
BothDist[is.na(BothDist)] <- 0 

BothDist 
+0

full_joinの場合、名前のない列を参照する方法はありますか? – kf913

+0

私は誤解されるかもしれませんが、あなたは列名を提供する必要があるか、または2つのデータフレームがあなたが参加したい同じ列名を共有する必要があると信じています。列の名前を変更できるので、問題はありません。 –

関連する問題