H[p,q] = 1/(q-1) * (1 - sum(p^q))
连续变量的Tsallis熵定义如下:
H[p,q] = 1/(q-1) * (1 - int((p(x)^q dx)
其中p(x)
是数据的概率密度函数,int
是不可或缺的。
我试图在R中实现Tsallis熵。
假设我有以下数据(由beta函数生成,但请考虑分布未知)
set.seed(567)
mystring <- round(rbeta(500, 2,4), 2)
离散变量的Tsallis熵将是:
freqs <- table(mystring) / 500
q = 3
H1 <- 1/(q-1) * (1 - sum(freqs^q))
[1] 0.4998426
我现在想要计算连续变量的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
正如我所料,这两个结果是不同的。但为什么如此不同? 我的主要问题是:用于计算连续变量的Tsallis熵的代码,对吗?请记住,我假设分发未知。
答案 0 :(得分:1)
首先,这是一个统计问题。我鼓励你在stats.stackexchange.com上提问,你可能会得到更好的答案。
话虽如此,为什么你认为价值应该是一样的?您正在从β分布中获取大小为n(n = 500)的随机样本,并尝试通过计算每个大小为dx的k个区域(此处,dx = 0.01和k~100)中的观察分数来离散化它。通常,每个箱中的分数将取决于k,如
p i = p i o / k
其中p i o 是某些基线k = k o 的概率向量。换句话说,你拥有的箱子越多(越小),每箱的obxervations越少。您可以通过绘制具有不同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))
您的freqs
向量为Frequency/500
,但k的效果相同。数字箱当然等于k,所以
总和(p i )= 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熵将取决于用于离散化的箱尺寸。
为了使这个具体化,考虑一个带有10个箱的离散U [0,1]。这是一个长度为10的向量,所有元素都是0.1。在您的示例中使用q = 3,
k <- 10
p <- rep(1/k,k)
sum(p^q)
# [1] 0.01
现在考虑使用100个箱子做同样的事情。这里p是长度为100的向量,所有元素都是0.01。
k <- 100
p <- rep(1/k,k)
sum(p^q)
# [1] 1e-04
最后考虑连续分布。 U [0,1]的pdf = 1(0,1),其他地方为0,因此积分为int(1 ^ 3 dx)= 1.
f <- function(x) dunif(x)^q
integrate(f,0,1)$value
# 1
最后,我们可以证明,整合你的经验密度函数(基于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