Как сделать выборку из пошаговой функции в python / scipy / numpy и т. Д.? - PullRequest
0 голосов
/ 26 июня 2019

Если у меня есть ребра и счетчики для каждого бина, есть ли хороший лаконичный способ выборки из функции плотности вероятности, из которой это следует?

Вот пример того, что я имею в виду.

bin_edges = [0,2.1,6.3,23.5]
counts = [5,2,10]

Функция плотности вероятности является пошаговой функцией с шагами в:

[0,2.1,6.3,23.5]

, а плотность вероятности (высота шага) для первого шага равна 5 / (17 * 2.1).Плотность вероятности для второго бина / шага равна 2 / (17 * 4.2), плотность вероятности третьего шага / бина равна 10 / (17 * 17,2).

Если вы попадаете в корзину / шаг, то значение, которое вы выбираете, равномерно выбирается из значений x шага.Поэтому, если вы попадете на первый шаг, он будет одинаковым между 0 и 2,1.

Существует ли краткий способ выполнения этой выборки с использованием модуля Python?Например, используя scipy / numpy / etc?

Ответы [ 2 ]

3 голосов
/ 26 июня 2019

"Если у меня есть ребра бина и счетчики для каждого бина, есть ли хороший лаконичный способ выборки из функции плотности вероятности, из которой это вытекает?"

Это как раз тот случай, когда scipy.stats.rv_histogram.

Вот пример.

Сначала сгенерируйте некоторые данные гистограммы, которые мы можем использовать для примера.

In [150]: sample = np.random.gamma(6, size=2000)                                                                                                                

In [151]: hist, edges = np.histogram(sample, bins=5)                                                                                                            

In [152]: hist                                                                                                                                                  
Out[152]: array([490, 949, 438, 100,  23])

In [153]: edges                                                                                                                                                 
Out[153]: 
array([ 1.23006474,  4.19769156,  7.16531838, 10.13294519, 13.10057201,
       16.06819883])

Создать экземпляр rv_histogram с этими данными.

In [154]: from scipy.stats import rv_histogram                                                                                                                  

In [155]: rv = rv_histogram((hist, edges))                                                                                                                      

Создать случайную выборку из rv и построить ее гистограмму.

In [156]: rv_sample = rv.rvs(size=100000)                                                                                                                       

In [157]: plt.hist(rv_sample, bins=50, alpha=0.5, edgecolor='k')

plot

1 голос
/ 26 июня 2019

Вы уже дали ответ:

Если вы попадаете в корзину / шаг, значение, которое вы выбираете, равномерно выбирается из значений x шага.Таким образом, если вы попадаете на первый шаг, он будет одинаковым между 0 и 2,1.

Вы создаете образец в два этапа:

  1. выберите один из биновна основе их вероятностной массовой функции
  2. генерирует выборку, равномерно распределенную по диапазону значений выбранного бина

Функция, приведенная ниже, делает именно это

def random_sample(bin_edges, counts):
    n_bins = len(counts) # number of bins
    p_bin = counts/np.sum(counts) # probability mass function (pmf) for the bin
    sample_bin = np.random.choice(np.arange(n_bins), p = p_bin) # sample a bin according to the bin pmf

    # now, generate a random variable uniformly distributed within the sampled bin edges
    sample = np.random.uniform(bin_edges[sample_bin], bin_edges[sample_bin + 1]) 
    return sample

Чтобы проверить функцию, давайте сгенерируем несколько независимых выборок и построим их гистограмму

bin_edges = [0,2.1,6.3,23.5]
counts = [5,2,10]
samples = [random_sample(bin_edges, counts) for _ in range(100000)]

from seaborn import distplot

distplot(samples,bins = 100,kde=False,norm_hist = True, hist_kws=dict(edgecolor="k", linewidth=1))

enter image description here

Как и ожидалось, гистограмма соответствует функции распределенияслучайная величина

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