我正在使用EnumeratedIntegerDistribution从我的一组键中生成样本。
如何以编程方式计算离散概率'阵列。 例如,我可能想要一个近似的正常'分发或Zipf的发行。
int[] keys = keyDomain(domainMin, domainMax);
double[] discreteProbabilities = new double[] { ?, ?, ?, ?, .... };
EnumeratedIntegerDistribution distribution = new EnumeratedIntegerDistribution(keys, discreteProbabilities);
int numSamples = 100;
int[] samples = distribution.sample(numSamples);
答案 0 :(得分:1)
只要您的分布是真正离散的并且在您的范围内的整数上定义(例如Poisson分布),只要您有一些可以为其计算的公式,分配您的discreteProbabilities []数组就没有问题。您范围内每个整数值的概率,然后由于您要限制范围,您可以将指定的概率除以它们的总和,以便在您的范围内得到真实的分布,即sum = 1.
但是,如果您的分布是“连续的”,即样本可以是某个范围内的任何浮点数/实数值,那么事情就更复杂了。您必须决定如何将此分布转换为您范围内整数的分布。一种方法是简单地在整数值处评估概率密度函数(例如,对于正态分布基本上为exp(-x ^ 2/2)),然后除以整数范围的总和。但是,如果您假设例如,这可能不太现实您将样本四舍五入到最接近的整数值以获取采样的整数值。如果你想这样做,那么你应该计算连续概率密度的积分(例如,如果没有反导数的公式,则使用数值积分),其中积分在n-0.5和n +之间0.5范围内的每个整数n。那么这是整数n的概率值,与之前类似,除以整数范围的总和,使概率加起来为1.