考虑一个接近0 的小形状参数,例如。在0到之间的范围内,大约为,因此Gamma pdf大约为。这可以集成到近似CDF中,。取反,我们看到一个幂:一个巨大的指数。对于这会引起下溢的可能性(双精度值小于或等于)。这是下溢的概率图,是底数的十进制对数的函数α = 1 / 100 α ë - α 1 X α - 1 d X / Γ (α )˚F α(X )= X ααα=1/100αe−α1xα−1dx/Γ(α) 1/αα=1/10010-300αFα(x)=xααΓ(α)1/αα=1/10010−300α:
一种解决方案是利用这种近似来生成log(Gamma)变量:实际上,尝试生成Gamma变量,如果它太小,则根据此近似功率分布生成其对数(如下所示)。(重复执行此操作,直到对数在下溢范围内,以便它可以有效替代原始下溢变量。)对于Dirichlet计算,请从每个对数值中减去所有对数的最大值:这将隐式重新缩放所有比例Gamma变量,因此不会影响Dirichlet值。将所得的任何太小(例如小于-100)的对数视为真实零的对数。对其他日志求幂。现在,您可以继续进行而不会发生下溢。
这将花费比以前更长的时间,但至少它会起作用!
要生成形状参数为的近似对数伽玛变量,请预先计算。这很容易,因为有一些算法可以直接计算log Gamma的值。生成0和1之间的均匀随机浮子,取其对数,除以,并添加到它。Ç = 日志(Γ (α ))+ 日志(α )ααC=log(Γ(α))+log(α)αC
因为scale参数只是重新缩放变量,所以在这些过程中将其容纳起来没有问题。如果所有比例参数都相同,则甚至不需要它。
编辑
OP在另一个答复中描述了一种方法,其中将统一变量(变量)的幂乘以变量。这是可行的,因为这两个变量的联合分布的pdf等于。为了找到的pdf,我们将,除以雅可比,然后积分出。积分的范围必须从到因为,因此1/αB(α)Γ(α+1)(αxα−1)(yαe−ydy/Γ(α+1))z=xyy→z/xxxz∞0≤y≤1
pdf(z)=αΓ(α+1)∫∞z(xα/x)e−x(z/x)α−1dxdz=1Γ(α)zα−1e−zdz,
这是分布的pdf 。Γ(α)
整点是,当,从得出的值不太可能下溢,并且通过将其对数和乘以独立均变量的对数来求和,将具有变量的对数。该对数可能非常负,但是我们将绕过其对数的构造,该对数将以浮点表示形式下溢。0<α<1Γ(α+1)1/αΓ(α)