Обратный метод для дискретных переменных в Python - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь сделать обратный метод для дискретной переменной, но ничего не получаю (если я распечатываю образец, я получаю только одно число, а не образец).Как мне сделать это правильно?

import numpy as np
import numpy.random as rd
import matplotlib.pyplot as plt
def inversao_discreto(p,M):
    amostra=np.zeros(M)
    acum=np.zeros(len(p))
    acum[:]=p
    for i in range(1, len(acum)):
        acum[i]+=acum[i-1]
    r=rd.random_sample(M)
    for i in range(M):
        i=0
        k=0
        while(r[k]>acum[i]):
            i+=1
            amostra=i
    return amostra
model=np.array([0.1,0.2,0.1,0.2,0.4])
sample=inversao_discreto(model,10000)    

1 Ответ

0 голосов
/ 23 сентября 2019

Насколько я понял, вы хотите реализовать выборку обратного преобразования для дискретных переменных , которая работает так:

Given a probability distribution `p`
Given a number of samples `M`
Calculate the cumulative probability distribution function `acum` from `p`
Generate `M` uniformly distributed samples and store into `r`
For each sample `r[i]`
    Get the index where the cumulative distribution `acum` is larger or equal to the sample `r[i]`
    Store this value into `amostra[i]`

Если мойпонимание правильное, тогда ваш код почти .Ваша ошибка только в последнем цикле for.Ваша переменная i отслеживает положение ваших образцов, хранящихся в r.Затем k будет отслеживать, где в аккумуляторе acum вы сравниваете r с.Вот псевдокод:

For each sample `r[i]`
    Start with `k = 0`
    While `r[i] > acum[k]`
        Increment `k`
    Now that `r[i] <= acum[k]`, store `k` into `amostra[i]`

Перевод его на Python:

for i in range(M):
    k = 0

    while (r[i] > acum[k]):
        k += 1

    amostra[i] = k

Итак, код исправлен:

import numpy as np
import numpy.random as rd

def inversao_discreto(p, M):
    amostra = np.zeros(M)
    acum = np.zeros(len(p))
    acum[:] = p

    for i in range(1, len(acum)):
        acum[i] += acum[i - 1]

    r = rd.random_sample(M)

    for i in range(M):
        k = 0

        while (r[i] > acum[k]):
            k += 1

        amostra[i] = k

    return amostra

model = np.array([0.1, 0.2, 0.1, 0.2, 0.4])
sample = inversao_discreto(model, 10000)

Я пытался изменитькак можно меньше кода, чтобы он работал, так как вы относительно новичок в Python.Большинство изменений, которые я реализовал, были основаны на этом Руководстве по стилю для кода Python , на которое я рекомендую вам взглянуть, поскольку оно улучшит ваш код, визуально говоря.

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