Я хочу использовать выборку важности, чтобы оценить среднее экспоненциального распределения, но с моим кодом что-то не так.
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?