1

我想在 R 中找到两个分布的 JS 散度。维基百科说 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 不允许我指定要使用的日志。关于如何做到这一点的任何线索?

好的,这是在 2 个分布之间查找 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 值,根据wiki,只有当我采用以 2 为底的对数时才有可能。如何使用现有的 R 代码执行此操作

4

1 回答 1

2

一般来说,它认为

在此处输入图像描述

这意味着如果您想计算 b 以 a 为底的对数,但您只有一个函数可以计算任何数字以 x 为底的对数,您仍然可以轻松地获得该数字以 a 为底的对数。

因此:

在此处输入图像描述

因此,如果您想确定关于基数 x 的 KL 散度,您只需将计算与基数的 KL 散度的结果除以ex 到基数的对数 e(或 KLdiv 的实现使用的任何基数)。

顺便说一句,您忘记提及您使用的是哪个 KLdiv 函数。

其次,通过查看您的 R 代码,我认为您可能想重新阅读 JS 分歧,特别是 M 的定义。

于 2012-07-01T18:13:07.977 回答