在R中,如何计算字符串的两个向量之间的KL距离?

在R中,如何计算字符串的两个向量之间的KL距离?,r,R,如果我有两个字符串向量,比如: > 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) >

如果我有两个字符串向量,比如:

> 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)需要相同长度的向量。

以下内容将生成一个数据帧,其中一列包含每个向量字符串的分布:

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
库(dplyr)

清单1离散分布的这种度量(Kullback-Leibler)使用每对概率的商的对数。无论您以何种方式看待它(因为列表1中的鼠标概率为零),您要么想要0的对数,要么想要除以0的对数,这两者在这里都是无用的。要计算此距离,所有概率都必须为非零。实际上,只有基本分布(此处为dist2)需要为非零。如果p为0,则p*log(p/q)定义为零。这就是为什么我使用dist2作为基线。在任何情况下,我仍然对如何计算KL距离感兴趣。为什么不让你的分布长度相等,并将缺失值的分布设置为0?好的。然后,我认为您只需删除两个列表中不存在的任何条目,并对截断向量运行标准kl.dist函数。谢谢Ian,Gladwell。那么,如何基于元素列表(例如,“猫”、“狗”…)创建分发?桌子似乎没有这样做。我可以一个接一个地遍历每个元素,但是对于一长串的字符串向量来说,这太长了。对于full_join,有没有方法引用没有名称的列?我可能弄错了​ 但我相信您要么需要提供列名,要么让两个数据帧共享您希望加入的相同列名。这不会引起任何问题,因为您可以随时重命名列。