Я хочу иметь произвольную дискретную случайную величину в sympy
. Мне известно о sympy.stats.FiniteRV
, но я считаю, что это требует от вас определения функции вероятности; Мне нужен символический дискретный RV. В sympy.stats
я не знаю, как это определить, поэтому сейчас я делаю что-то вроде
.
from sympy import Function, Symbol
x = Symbol('x')
p = Function('p_x', nargs=1)
p_x = p(x)
чтобы получить мой дистрибутив. Однако я хотел бы, чтобы эта функция знала, что это дискретное распределение вероятностей, то есть я хочу, чтобы p(x) >= 0
для всех x
и чтобы распределение суммировалось в единицу. Набор, для которого определено p
, является символическим, но было бы неплохо иметь возможность сделать что-то вроде
from sympy import symbols, Sum
x0, xm = symbols('x_0 x_m')
total_probability = Sum(p_x, (x, x0, xm)).doit()
assert total_probability == 1
, где p
определено для набора {x0, ...., xm}
.
Есть ли способ, которым я могу создать подкласс Function
или что-то из sympy.stats
для создания дистрибутива, в котором я передаю его набор поддержки, и тогда он будет правильно суммироваться в 1 и будет неотрицательным по этому набору?
Бонусные баллы - есть ли способ, которым это также может справиться с маргинализацией? То есть если у меня есть
pxy = Function('p_{x, y}', nargs=2)
py = Function('p_y', nargs=1)
y, y0, ym = symbols('y y_0 y_m')
# and somehow define the sets for these as x0, ..., xm and y0, ..., yn
Sum(pxy(x, y), (y, y0, ym)).doit() == p_x