Суммирование двух распределений Пуассона с помощью SymPy - PullRequest
0 голосов
/ 06 ноября 2018

Я новичок в SymPy и пытаюсь использовать его для суммирования двух распределений Пуассона

Вот что у меня есть (с помощью ноутбука Jupyter)

from sympy import *
from sympy.stats import *
init_printing(use_latex='mathjax')

lamda_1, lamda_2 = symbols('lamda_1, lamda_2')
n_1 = Symbol('n_1')
n_2 = Symbol('n_2')
n = Symbol('n')

#setting up distributions
N_1 = density(Poisson('N_1', lamda_1))(n_1)
N_2 = density(Poisson('N_2', lamda_2))(n_2)
display(N_1)
display(N_2)

print('setting N_2 in terms of N and N_1')
N_2 = N_2.subs(n_2,n-n_1)

display(N_2)

print("N_1 * N_2")
N = N_1 * N_2

#display(N)

Sum(N,(n_1,0,n))

#summation(N,(n_1,0,n))

Все работает нормально, пока я не попробую выполнить суммирование. Никаких ошибок просто ничего не делает, и Jupyter говорит, что работает. Я позволил ему работать в течение 10 минут и ничего ...

1 Ответ

0 голосов
/ 06 ноября 2018

При объявлении символов включайте их свойства: быть положительными, целыми, неотрицательными и т. Д. Это помогает SymPy решить, являются ли некоторые преобразования законными.

lamda_1, lamda_2 = symbols('lamda_1, lamda_2', positive=True)
n_1, n_2, n = symbols('n_1 n_2 n', nonnegative=True, integer=True)

К сожалению, суммирование по-прежнему не удается, потому что SymPy не может придумать ключевой трюк : умножение и деление на factorial(n). Кажется, нужно сказать это, чтобы сделать это.

s = summation(N*factorial(n), (n_1, 0, n))/factorial(n)
print(s.simplify())

Это печатает

Piecewise(((lamda_1 + lamda_2)**n*exp(-lamda_1 - lamda_2)/factorial(n), ((-n >= 0) & (lamda_1/lamda_2 <= 1)) | ((-n < 0) & (lamda_1/lamda_2 <= 1))), (lamda_2**n*exp(-lamda_1 - lamda_2)*Sum(lamda_1**n_1*lamda_2**(-n_1)/(factorial(n_1)*factorial(n - n_1)), (n_1, 0, n)), True))

, которая представляет собой кусочную формулу, полную ненужных условий ... но если мы игнорируем эти условия (они являются просто артефактами того, как SymPy выполнил суммирование), правильный результат

((lamda_1 + lamda_2)**n*exp(-lamda_1 - lamda_2)/factorial(n)  

есть.

В стороне: избегайте использования import * как на sympy, так и на sympy.stats, есть нотационные столкновения, такие как E, равный 2.718 ... против ожидаемого значения. from sympy.stats import density, Poisson было бы лучше. Кроме того, N является встроенной функцией SymPy, и ее лучше избегать в качестве имени переменной.

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