我正在寻找生成二项式分布。我想要一个二项分布,但我希望它以零为中心(我知道这对于二项分布的定义没有多大意义,但仍然是我的目标。)
我发现在 python 中这样做的唯一方法是:
def zeroed_binomial(n,p,size=None):
return numpy.random.binomial(n,p,size) - n*p
这个发行版有真名吗?这段代码是否真的给了我想要的东西(我怎么知道)?是否有更清洁/更好/规范/已经实施的方式来做到这一点?
我正在寻找生成二项式分布。我想要一个二项分布,但我希望它以零为中心(我知道这对于二项分布的定义没有多大意义,但仍然是我的目标。)
我发现在 python 中这样做的唯一方法是:
def zeroed_binomial(n,p,size=None):
return numpy.random.binomial(n,p,size) - n*p
这个发行版有真名吗?这段代码是否真的给了我想要的东西(我怎么知道)?是否有更清洁/更好/规范/已经实施的方式来做到这一点?
如果你想要一个以 0 为中心的“离散”正态分布,你正在做的事情很好。如果你想要整数值,你应该n*p
在减去之前四舍五入。
但是二项分布的极限只是当n
变大并且有p
界远离0或1时的正态分布。既然n*p
除了某些值之外不会是整数,为什么不直接使用正态分布呢?
模块中实现的概率分布允许您通过在构造函数中指定关键字scipy.stats
来任意移动分布。loc
要获得均值偏移接近 0 的二项分布,您可以调用
p = stats.binom(N, p, loc=-round(N*p))
(确保使用loc
离散分布的整数值。)
这是一个例子:
p = stats.binom(20, 0.1, loc=-2)
x = numpy.arange(-3,5)
bar(x, p.pmf(x))
编辑:
要生成实际的随机数,请使用模块rvs()
中每个随机分布附带的方法。scipy.stats
例如:
>>> stats.binom(20,0.1,loc=-2).rvs(10)
array([-2, 0, 0, 1, 1, 1, -1, 1, 2, 0])