Tom*_*aso 5 r entropy information-theory
离散变量的Tsallis 熵定义为:
H[p,q] = 1/(q-1) * (1 - sum(p^q))
Run Code Online (Sandbox Code Playgroud)
连续变量的 Tsallis 熵定义为:
H[p,q] = 1/(q-1) * (1 - int((p(x)^q dx)
Run Code Online (Sandbox Code Playgroud)
其中p(x)
是数据的概率密度函数,并且int
是积分。
我正在尝试在 R 中实现 Tsallis 熵。
假设我有以下数据(由 beta 函数生成,但考虑分布未知)
set.seed(567)
mystring <- round(rbeta(500, 2,4), 2)
Run Code Online (Sandbox Code Playgroud)
离散变量的 Tsallis 熵为:
freqs <- table(mystring) / 500
q = 3
H1 <- 1/(q-1) * (1 - sum(freqs^q))
[1] 0.4998426
Run Code Online (Sandbox Code Playgroud)
我现在想要计算连续变量的 Tsallis 熵:
PDF <- density(mystring)
library(sfsmisc)
xPDF <- PDF$x
yPDF <- PDF$y
H1 <- 1/(q-1) * (1 - integrate.xy(xPDF, yPDF^q))
[1] -0.6997353
Run Code Online (Sandbox Code Playgroud)
正如我所料,两个结果是不同的。但为什么如此不同呢?我的主要问题是:计算连续变量 Tsallis 熵的代码正确吗?请记住,我假设分布未知。
首先,这是一个统计问题。我鼓励您在stats.stackexchange.com上提问,您可能会得到更好的答案。
话虽如此,您为什么认为这些值应该相同?您从 beta 分布中随机抽取一个大小为 n (n = 500) 的样本,并尝试通过计算大小为 dx 的 k 个箱中每个观测值的分数(此处,dx = 0.01 和 k ~ 100)来对其进行离散化。一般来说,每个 bin 中的分数取决于 k,如下所示
pi = pi o / k
其中 p i o是某个基线 k = k o的概率向量。换句话说,您拥有的箱越多(越小),每个箱的观察次数就越少。您可以通过绘制具有不同 k 的直方图(使用breaks=k
)来看到这一点。
par(mfrow=c(1,3))
hist(mystring,breaks=10, ylim=c(0,100))
hist(mystring,breaks=50, ylim=c(0,100))
hist(mystring,breaks=100, ylim=c(0,100))
Run Code Online (Sandbox Code Playgroud)
你的freqs
向量是Frequency/500
,但 k 的效果是相同的。bin 的数量当然等于 k,所以
总和( pi ) = 1
独立于 k。但是在 Tsallis 熵的计算中,您不是对 p i求和,而是对 p i q求和(在您的情况下 q=3)。所以
sum( p i q ) ~ sum( [ p i o /k ] q ) ~ (1 / k q ) * sum( [ p i o ] q )
正弦对 k 项求和,当 q = 1 时,结果将不取决于 k,但对于任何其他 q,总和将取决于 k。换句话说,根据离散化连续分布计算出的 Tsallis 熵将取决于用于离散化的 bin 大小。
为了使这一点具体化,请考虑具有 10 个 bin 的离散化 U[0,1]。这个 aa 向量的长度为 10,所有元素 = 0.1。在您的示例中使用 q=3 ,
k <- 10
p <- rep(1/k,k)
sum(p^q)
# [1] 0.01
Run Code Online (Sandbox Code Playgroud)
现在考虑 100 个垃圾箱的同样情况。这里 p 是长度为 100 的向量,所有元素 = 0.01。
k <- 100
p <- rep(1/k,k)
sum(p^q)
# [1] 1e-04
Run Code Online (Sandbox Code Playgroud)
最后考虑连续分布。U[0,1] = 1 在 (0,1) 上的 pdf,其他地方为 0,因此积分为 int(1^3 dx) = 1。
f <- function(x) dunif(x)^q
integrate(f,0,1)$value
# 1
Run Code Online (Sandbox Code Playgroud)
最后,我们可以证明,积分经验密度函数(基于 dbeta)给出的答案与直接积分分布函数的答案大致相同:
library(sfsmisc)
PDF <- density(mystring)
H2 <- 1/(q-1) * (1 - integrate.xy(PDF$x, PDF$y^q))
H2
# [1] -0.6997353
g <- function(x) dbeta(x,2,4)^q
H3 <- 1/(q-1) * (1 - integrate(g,-Inf,Inf)$value)
H3
# [1] -0.8986014
Run Code Online (Sandbox Code Playgroud)