仅使用正数生成高斯分布

21

有没有办法随机生成一组正数,使它们的平均值和标准差符合预期?

我有一个生成高斯分布数字的算法,但是我不知道如何处理负数以保持平均值和标准差。
看起来泊松分布可能是个好的近似方法,但它只需要一个平均值。

编辑:回复中出现了一些混淆,所以我想澄清一下。

我有一组数字,可以给我一个平均值和一个标准差。我希望随机生成一组大小相同的数字,其平均值和标准差与原来的数字等价。通常,我会使用高斯分布来实现这一点,但在这种情况下,我有一个额外的约束条件,即所有值必须大于零。

我正在寻找的算法不需要基于高斯分布(根据迄今为止的评论,它可能不应该是),也不需要完美。结果数字集的平均值/标准差略有不同都没有关系--我只是想要通常基本相近的东西。


4
高斯分布的定义是否包括负数,即使您的均值非常大(正数),左侧的尾巴仍将延伸到负无穷? - Rahel Lüthy
@netzwerg: 你是正确的。这就是为什么我正在尝试找到另一种方法。 - Whatsit
@schnaader:我尝试过的算法涉及基于高斯分布生成数字,并采取额外步骤来消除负数。例如,取负数的绝对值。 - Whatsit
如果您的标准差为0且平均值为正数,那就可以了。 - hughdbrown
双边有界:http://stats.stackexchange.com/questions/87054/what-is-the-equivalent-of-normal-distribution-in-an-interval - Ciro Santilli OurBigBook.com
显示剩余3条评论
7个回答

9
你可能在寻找对数正态分布,就像David Norman所建议的那样,或者指数分布二项分布,或其他一些分布。如果你有一个生成某个分布的算法,它可能不适用于生成符合另一个分布的数字。但只有你知道你的数字实际上是如何分布的。
对于正态分布,随机变量的范围从负无穷到正无穷,因此,如果你只想要正数,那么它就不是高斯分布。
不同的分布也具有独特的属性,例如,在泊松分布中,标准差总是等于均值。(这就是为什么你的库函数不需要标准差参数,只需要均值)。
在最坏的情况下,你可以生成一个0到1之间的随机实数,并自行计算概率密度函数。(根据分布的不同,这可能比说起来容易得多)。

2
最简单的方法是:1)取每个原始数据点的对数,2)获取其平均值和标准差,3)使用该平均值和标准差生成高斯正态分布随机数,4)对每个数字进行指数运算。结果应与您开始的相似。(生成高斯随机数的简单方法是将+/-0.5范围内的12个均匀随机数相加。) - Mike Dunlavey
我以前见过这种做法。HP41C计算器的PPC Rom有一个程序,可以生成具有高斯分布的随机数,但我不再拥有手册,因此无法查找公式。但是,这是一种将从零到一的一组均匀分布的随机数转换为具有高斯分布的数字的公式。 - MiguelMunoz

8

首先,您无法仅从高斯分布中生成正值。

其次,我是否正确理解,您正在尝试生成具有给定平均值和标准偏差的随机分布?任何分布都可以吗?如果是这样,让平均值 = m,标准偏差 = s。我假设 m - s > 0

let n = random integer modulo 2;
if n equals 0 return m - s
else return m + s

这个过程返回的值将具有平均值为m,标准差为s

我怀疑你的建议不会满足他的需求,但我还是要因为一个有趣的问题回答给它+1。也就是说,你的答案有一个缺陷:如果 m < s,则你的分配将不是正的。 - Mathias
1
@Mathias:我说过“我假设 m - s > 0”。 - jason
这是一个有趣的答案。不幸的是,在我的情况下,并不总是m > s成立。我也希望生成的值有更多的变化,尽管我在问题中没有提到。不过,对于这个新颖的解决方案还是点赞。 - Whatsit
1
@Jason:我尝试保持你解决方案的精神(满足要求的最简分布),并为任何小于m和s的情况找到了一般解决方案... - Mathias

8

5
为什么不使用重采样方法?如果您的样本中有n个数字,只需从样本中进行n次带放回的随机抽取。生成的集合的期望均值和方差与原始样本大致相同,但通常会稍有不同。
话虽如此,如果不知道为什么需要更多的随机数,则无法确定正确答案。人们会想知道您是否试图解决错误的问题...

1
重新采样是一个有趣的建议。在他最初的陈述中,Whatsit并没有说他有一个样本,他只提到了他有一个均值+方差。从样本中进行抽样不仅会复制均值和方差,而且还将根据定义匹配分布的形状...如果Whatsit想要运行模拟,这将是一个好主意。 - Mathias
我有一个类似的问题。如果我们重新采样(我假设每次得到负值时,我们只是忽略它并在其位置上取另一个样本),那么会改变分布的含义吗?这是否会导致不同的均值和方差? - sand

4

我忍不住了 - 我真的很喜欢Jason的角度,但他的答案只涵盖了m>s的情况,所以我按照他的思路得出了一个通用解决方案。
给定m、s和正项的最简单分布是:

概率为p,返回0
概率为(1-p),返回m / (1-p)
其中 (1-p) = m^2 / (m^2 + s^2)

证明:对于一个具有两个结果lowX和highX的分布X,其概率分别为p和(1-p),
m = E[X] = p x lowX + (1-p) x highX
s^2 = 方差(X) = E[X^2] - E[X]^2 = p x lowX^2 + (1-p) x highX^2 - m^2

将lowX设为0并解出highX和p。


谢谢 - 鉴于你回答的精神,我想你会欣赏 :) - Mathias

3
您可以使用任何具有正支持并且可以通过均值和方差指定的分布。例如,
  • 一些单参数分布通常不起作用。例如,除非您的方差始终是其均值的两倍,否则卡方分布将无法工作。同样,指数分布将无法工作,除非您的方差等于您的平方均值。
  • 某些双参数分布在某些情况下可能无法使用。除非方差小于均值,否则二项分布将无法工作。同样,非中心卡方分布将无法工作,除非您的方差大于2倍的均值且小于4倍的均值!
  • 然而对数正态分布和伽马分布在所有情况下都适用。

1

如果我理解正确,您想从具有正支持的分布中生成随机数。有许多可能的选择。最简单的是卡方分布:

http://en.wikipedia.org/wiki/Chi-square_distribution(它只是两个平方高斯分布的总和)

所有不对称分布(指数分布、威布尔分布、帕累托分布、逆高斯分布、对数正态分布、伽马分布)

来自偏斜家族的所有分布(偏斜正态分布、偏斜学生分布等)

上述所有函数都满足任何从它们中任何一个绘制的随机数始终为正数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接