Насколько я понял, вы хотите реализовать выборку обратного преобразования для дискретных переменных , которая работает так:
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 , на которое я рекомендую вам взглянуть, поскольку оно улучшит ваш код, визуально говоря.