我想在R中找到两个分布的JS分歧。wikipedia说Jensen-Shannon散度以1为界,假设一个使用基数2对数。我希望我得到的JS差异介于0和1之间。我在R中使用KLdiv函数来查找JS:
JSD(P || Q)= 1/2*D(P || M) + 1/2*D(Q || M)
Kullback-Leibler分歧KLdiv(P,M)= D(P || M)
但我想指明我需要2对数的基数。看起来KLdiv不允许我指定我想要使用的日志。关于如何做到这一点的任何线索?
好的,这是用于在两个发行版之间查找JSdivergence的R代码。
library(flexmix)
m <- 0.5 *(dist1 + dist2) #JSD(P||Q)=0.5*D(P||M) + 0.5*D(Q||M), where M=0.5*(P+Q)
Dpm <- KLdiv(cbind(dist1,m))
Dqm <- KLdiv(cbind(m,dist2))
js <- 0.5*Dpm + 0.5*Dqm
我想要一个介于0和1之间的JS值,只有当我以2对数为基数时才可以使用wiki。如何使用我现有的R代码
答案 0 :(得分:2)
一般来说,它认为
意味着如果你想计算b的对数来建立一个但是你只有一个函数来计算任何数的对数到基数x,你仍然可以很容易地得到该数的对数来基于a。
因此:
因此,如果您想确定相对于基数x的KL偏差,您只需将计算KL偏差的结果与基数e
除以x的对数到基数e
(或者KLdiv实施的任何基础)。
其次,通过查看你的R代码,我想你可能想重新阅读JS分歧,特别是M的定义。