Простой пример важности в Python - PullRequest
0 голосов
/ 08 июля 2019

Я хочу использовать выборку важности, чтобы оценить среднее экспоненциального распределения, но с моим кодом что-то не так.

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...