2017-04-24 43 views
0

如果我有一個字符串2個載體,如:在R中,如何計算KL的兩個向量之間的距離?

> 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) 
> 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 

如何計算這兩個分佈之間的KL距離? (使用dist2作爲基線。)

我見過的KL函數(例如kl.dist)需要相同長度的向量。

+2

該措施(的Kullback-Leibler距離),用於離散分佈使用商的對數對於每對概率。無論你如何看待它(因爲列表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

我可能會弄錯,但我相信你需要提供列名,或者讓兩個數據框共享你希望加入的列名。這不應該導致任何問題,因爲您總是可以重命名您的列。 –

相關問題