Генерация случайного числа в диапазоне от одностороннего распределения с Python - PullRequest
2 голосов
/ 01 июля 2019

Я хочу сгенерировать случайное число с плавающей точкой в ​​диапазоне [0, 1) из одностороннего распределения, которое выглядит следующим образом enter image description here

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

Ответы [ 3 ]

2 голосов
/ 02 июля 2019

Вы можете использовать Бета-дистрибутив , например

import numpy as np

np.random.seed(2018)
np.random.beta(2, 5, 10)
#array([ 0.18094173,  0.26192478,  0.14055507,  0.07172968,  0.11830031,
#        0.1027738 ,  0.20499125,  0.23220654,  0.0251325 ,  0.26324832])

Здесь мы рисуем числа из Beta(2, 5) дистрибутива

enter image description here

Бета-распределение является очень универсальным и фундаментальным распределением в статистике;не вдаваясь в подробности, изменив параметры alpha и beta, вы можете сделать распределение с перекосом влево, вправо, равномерно, симметрично и т. д. Распределение определяется на интервале [0, 1], что соответствует тому, чтовы после.


Более технический комментарий

В то время как Кумарасвами , безусловно, обладает более мягкими алгебраическими свойствами, чем Бета-распределение Я бы сказал, что последнее является более фундаментальным распределением;например, в байесовском умозаключении распределение Beta часто входит в число предшествующих сопряженных при работе с биномиальными (-подобными) процессами.

Во-вторых, среднее значение и дисперсия бета-распределения могут быть выражены довольно просто через параметры alpha, beta;например, среднее значение просто дается alpha / (alpha + beta).

Наконец, с точки зрения вычислительного и статистического вывода, подгонка бета-распределения к данным обычно выполняется в несколько строк кода в Python (или R), где большинство библиотек Python, таких как numpy и scipy уже включает методы для работы с бета-дистрибутивом.

2 голосов
/ 02 июля 2019

Я бы склонялся к распределению, которое естественно ограничено интервалом [0 ... 1] (или любым другим интервалом [a ... b], который может быть изменен позже), как ответ @MauritsEvers.Причина в том, что вы знаете дистрибутив и можете получить (или прочитать) некоторые интересные факты о нем.Если вы используете chi2 и усечь его, неясно, как спорить о свойствах того, что у вас есть.

Лично я предпочитаю Кумарасвами распределение , чем бета-распределение, выражения для среднего значения, режим,дисперсия и т.д. намного проще.

Просто установите его

pip install kumaraswamy

, и пример

from kumaraswamy import kumaraswamy

d = kumaraswamy(a=2.0, b=5.0)

q = d.rvs(10)
print(q)

даст 10 чисел, следующих за пурпурной кривой в статье Wiki.

Если вы не хотите бета-версию или Kumaraswamy, есть fe Logit-нормальный дистрибутив и довольно много других

1 голос
/ 01 июля 2019

Посмотрите на библиотеку numpy.random.chisquare .

numpy.random.chisquare(df, size=None)

>>> np.random.chisquare(2,4)
array([ 1.89920014,  9.00867716,  3.13710533,  5.62318272])
...