python中的简单重要性采样示例

时间:2019-07-08 01:22:45

标签: python statistics

我想使用重要性抽样来估计指数分布的平均值,但是我的代码有问题。

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?

0 个答案:

没有答案