我想使用重要性抽样来估计指数分布的平均值,但是我的代码有问题。
import math
import random
def exp_pdf(l, x):
if x <= 0:
return 0
return math.e ** (-l * x)
def uniform_pdf(hi, lo):
return 1 / (hi - lo)
lo = 0
hi = 1000
def uniform(lo, hi):
r = hi-lo
return lo + r*random.random()
n_iters = 10000
l = 5
def importance_weight(x):
return exp_pdf(l, x) / uniform_pdf(hi, lo) # g(x)/f(x))
running_sum = 0
for _ in range(n_iters):
x = uniform(lo, hi)
running_sum += x*importance_weight(x) # 1/n sum x*g(x)/f(x)
mean = running_sum / n_iters
print(f'mean {mean}, correct mean {1 / l}')
我希望输出为1/5的平均值,但我得到0.0394。 当我改用
running_sum += importance_weight(x)
我实际上得到的是0.2092,它非常接近真实均值,但是1 / n *和g(x)/ f(x)应当是从0到1000的指数距离的整数,应该接近1?