Работает ли np.random.poisson с очень маленькими числами? - PullRequest
1 голос
/ 16 июня 2020

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

Это фрагмент моего кода:

lam = (evaluate_propensity*delta_t)    
rxn_vector = np.random.poisson(lam) # probability of a reaction firing in the given time period

Я написал функцию для вычисления значения delta_t на основе параметров системы c, рассчитанное значение очень мало 0.00014970194372884217 и я думаю, что это влияет на функцию np.random.poisson.

Переменная evaluate_propensity представляет собой массив, который детализирует вероятность протекания реакции на основе количества молекул в системе и ios крысы между молекулами в реакции. Это вычисляется динамически и изменяется после каждой итерации по мере изменения количества молекул, но значения для первой итерации:

evaluate_propensity = np.array([1.0, 0.002, 0.0, 0.0])

В документации указано, что lam должно быть >= 0, а мое - (просто ), но rxn_vector просто всегда возвращает массив нулей.

rxn_vector = [0 0 0 0]

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

Ура

1 Ответ

2 голосов
/ 16 июня 2020

Вероятность выпадения ненулевого числа для lambda = 1.5e-4 мала, это P(k>0) = 1 - P(k=0) = 1.5e-4. В среднем, чтобы получить ненулевое значение, вам нужно будет нарисовать намного больше четырех выборок, 1 / 1.5e-4 = 6667 выборки для propensity = 1. Для меньших значений количество необходимых выборок, очевидно, еще больше.

Вы можете подтвердить это, набрав scipy.stats

from scipy.stats import poisson

pdist = poisson(1.5e-4)
prob = 1 - pdist.pmf(0)
print(prob) # 0.00014998875056249084
...