如何在 Pharo 中采样概率分布

How to sample probability distributions in Pharo

我想生成 n 个不同概率分布(正态分布、对数正态分布、泊松分布、均匀分布)的随机样本。即 R 中的 rnormrlnormrpoisrunif.

我如何在 Pharo 中做到这一点?知道如何计算密度也很有用 (dnorm, dlnorm, dpois, dunif)

好的,我在这里留下一个答案作为记录,推荐使用 PolyMath。

加载 PolyMath 执行:

Metacello new
        repository: 'github://PolyMathOrg/PolyMath/src';
        baseline: 'PolyMath';
        load

似乎存在两种不同类型的对象:PMProbabilityDensity 和 PMNumberGenerator,它们都有各自的子类。 您可以使用密度对象来获取密度和生成随机样本,或者您可以使用数字生成器来生成随机样本。

因此,对于正态分布,如果使用密度对象,您可以使用以下方式进行采样:

PMNormalDistribution new random "N(0,1)"
PMNormalDistribution new initialize: mu sigma: sigma; random

或获取点 x 处的密度:

PMNormalDistribution new initialize: 0 sigma: 1; value: x.

完全相同的模式适用于对数正态和均匀:

PMUniformDistribution new initialize: from to: to; random
PMUniformDistribution new initialize: from to: to; value: x

PMLogNormalDistribution new initialize: mu sigma: sigma
PMLogNormalDistribution new initialize: mu sigma: sigma; value: x

很遗憾,我找不到泊松分布的密度对象。 现在,您仍然可以生成它的样本:使用数字生成器对象,您可以生成泊松和法线样本(并间接记录法线):

PMPoissonGenerator new lambda: lambda; next.

PMGaussianGenerator new next.
PMGaussianGenerator new standardDeviation: 2; mean: 5; next.
(PMGaussianGenerator new standardDeviation: 2; mean: 5; next) exp. "log normal"