最大熵采样器

机器算法验证 采样 kullback-leibler 最大熵
2022-03-23 17:55:47

我想从固定为给定值均值(=0)、标准差(=1)、偏度(=0)和峰度的分布中采样。我还希望这个分布尽可能一般,即使 Kullback-Leibler 与均匀分布的散度尽可能小(这个条件相当于最大熵原理),就像峰度 = 3 的正态分布一样。

我知道,在一般情况下,很可能没有希望为这种分发提供封闭形式。我只对从中取样感兴趣。我接受合理的数值近似。

我不太关心效率——我可以等待大约 2 天才能获得 2000 个样品。

几年前,我写了一种遗传算法来解决这个问题:

  1. 从从均匀分布中抽取的 2000 个值的随机样本开始,这将在以后称为总体。
  2. 通过首先从总体中删除 200 个样本的随机子样本,然后重新插入从均匀分布中采样的相同数量的随机数,创建总体的许多(大约 100 个)变体。
  3. 找到具有尽可能接近目标参数的均值、标准偏差、偏度和峰度的变体(度量的选择对这个算法来说不应该是关键的,因为所有条件都是相互独立的)。
  4. 继续第 2 步,人口是第 3 步中最佳选择的变体。

该算法很慢,但最终它产生了我所理解的最大熵分布的良好近似值。

这个算法正确吗?或者有没有更好的方法来获得一般的尖峰分布?

2个回答

您可以寻找具有所需前四个矩和可能的最大熵的离散分布。然后,您可以插入累积分布函数以从中采样。

在 R 中,可以按如下方式完成。

kurtosis <- 3
n <- 100
x <- seq(-5,5,length=n)
dx <- mean(diff(x))
# Opposite of the Entropy, to minimize
f <- function(p) sum( p * log(p) )
# The first moments
g <- function(p) c( sum(p)*dx, sum(x*p)*dx, sum(x^2*p)*dx, sum(x^3*p)*dx, sum(x^4*p)*dx )
# Maximize the entropy subject to those constraints
library(Rsolnp)
r <- solnp( 
  rep(1/n,n), 
  f,           # Function to minimize
  eqfun = g,   # Equality constraints
  eqB   = c(1, mean=0, var=1, skewness=0, kurtosis),
  LB=rep(0,n), UB=rep(1,n) 
)
# Beware: it is not very precise at the boundaries of the interval
plot(x, r$pars, type="l", log="y", las=1)
lines(x, dnorm(x), lty=3)
# Sample from the corresponding distribution
q <- approxfun( c(0,cumsum(r$pars)*dx), c(x[1]-dx,x) )
r <- function(n) q(runif(n))
qqnorm(r(1e4))

如果您只有峰度问题需要解决,您可以使用 Studentt-分布与ν具有峰态的自由度6/(ν4)为了ν>4. 您还需要将方差标准化为 1(它等于ν/(ν2)对于原始的学生分布)。

如果你对离散分布没问题,你可以有一个支持的分布{1/2,x,x,1/2}有相应的概率(1p)/2,p/2,p/2,(1p)/2. 它有 0 个奇数时刻,它的方差是px2+(1p)/4=1/4+p(x21/4),所以之间的关系xp将会

p(x21/4)=3/4,p=34x21,x=34p+14.
最后,它有第四个时刻
1/16(1p)/2+px4=1p32+(3p+1)216p=19p2+11p+232p,
由于单位方差,这也是它的峰度,对于0p1.