我正在尝试使用逆CDF方法来模拟几何分布,但是我得到的结果略有错误,我不确定为什么。
更具体地说,形状因子p = 0.8的几何分布应具有以下特征:
mean: 1.25
variance: 0.31
但是,运行下面的代码,我得到了:
mean: 0.6224363901913519
var: 0.391813011265263
[Finished in 0.3s]
如您所见,与预期的平均值相比,我得到了截然不同的平均值。
np.log(uniform [i])/ np.log(1-p)是求解方程式的结果: 对于X而言,对于X,F(X)= R,F(X)=几何分布的CDF = 1-(1- p)^ k。
R是间隔(0,1)上的均匀分布。
因此解决它会导致以下结果:
X = ln(1-R)/ ln(1-p)
但是,由于1-R和R都均匀地分布在(0,1)上,因此我们可以进行以下简化:
X = ln(R)/ ln(1-p)
以上公式正确无误,应得出几何分布样本。
import numpy as np
n = 10000
p = 0.8
geo_dist = np.zeros(n,dtype = np.float64)
uniform = np.random.uniform(0, 1, n)
for i in range(n):
geo_dist[i] = np.log(uniform[i])/np.log(1-p)
print("mean: " +str(geo_dist.mean()))
print("var: " +str(geo_dist.var()))
我试图通过使用np.float64来提高计算精度,这是拼命尝试来修复应该是平凡的脚本,但无济于事。
我还尝试使用scipy uniform.rvs()而不是np.uniform生成均匀分布,问题仍然存在。
如果p = 0.5:
expected mean: 2
expected variance : 2
但是,我编写的代码具有以下结果:
mean: 1.4440009653569306
var: 2.0421079966161093
[Finished in 0.3s]
任何人都知道为什么这行不通吗? 谢谢。
答案 0 :(得分:2)
您实际上是在采样连续exponential distribution时,λ等于-1 / ln(1-p)
好的,这是正确采样的代码,将上限应用于指数输出
import numpy as np
N = 100000
p = 0.8
q = np.random.random(N)
g = np.ceil(np.log(1.0 - q)/np.log(1.0-p))
print(np.mean(g))
print(np.var(g))
可打印
1.25055
0.3146946975
请注意:
最好使用没有显式循环的NumPy向量化功能
从U(0,1)采样的(1-R) -> R
的替换R
对于NumPy RNG不起作用-它返回半封闭范围[0 ... 1]中的值,这意味着您可能会不时收到log(0)和FP异常。