逆(CDF)变换采样分配错误

时间:2019-01-28 16:49:28

标签: python numpy random scipy

我正在尝试使用逆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]

任何人都知道为什么这行不通吗? 谢谢。

1 个答案:

答案 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

请注意:

  1. 最好使用没有显式循环的NumPy向量化功能

  2. 从U(0,1)采样的(1-R) -> R的替换R对于NumPy RNG不起作用-它返回半封闭范围[0 ... 1]中的值,这意味着您可能会不时收到log(0)和FP异常。

相关问题