Я пытаюсь символически определить биномиальную функцию с помощью Sympy. Моя первая попытка была такой:
import numpy as np
import scipy.stats as st
import sklearn.linear_model as lm
import matplotlib.pyplot as plt
import sympy as sp
sp.interactive.printing.init_printing(use_latex=True)
n = sp.Symbol('n', integer=True, positive=True)
r = sp.Symbol('r', integer=True, positive=True)
theta = sp.Symbol('theta')
#Create the function symbolically
from sympy import factorial
cNkLambda= lambda n,r : (factorial(n))/ (factorial(r) *factorial(n- r))
binomLambda= lambda theta, n, r: cNkLambda(n,r)*((theta **r)*(1-theta)**(n-r))
print binomLambda (0.5, 10,5)
Однако я понял, что здесь не использую никаких функций Sympy и ничего не оценивается символически.
Во второй попытке я удалил определение Lambda, чтобы символьная функция была определена правильно, однако это приводит к исключению:
%reset -f
import numpy as np
import scipy.stats as st
import sklearn.linear_model as lm
import matplotlib.pyplot as plt
import sympy as sp
#from sympy import binomial
#from sympy import Symbol, Rational, factorial, binomial, expand_func
sp.interactive.printing.init_printing(use_latex=True)
n = sp.Symbol('n', integer=True, positive=True)
r = sp.Symbol('r', integer=True, positive=True)
theta = sp.Symbol('theta')
#Create the function symbolically
from sympy import factorial
cNkLambda= (factorial(n))/ (factorial(r) *factorial(n-r))
#cNkLambda_fied = sp.lambdify((n,r), cNkLambda, modules='numpy')
cNkLambda.evalf() # this works
binomLambda= cNkLambda(n,r)*((theta **r)*(1-theta)**(n-r))
#Convert it to a Numpy-callable function
#bin_likelihood = sp.lambdify((theta,r,n), binomLambda, modules='numpy')
#print binomLambda (0.5, 10,5)
TypeError Traceback (последний вызов последний) in () 23 cNkLambda.evalf () # работает 24 ---> 25 binomLambda = cNkLambda (n, r) ((theta r) ( 1-theta) (nr)) 26 # Преобразование в функцию, вызываемую с помощью Numpy 27 #bin_likelihood = sp.lambdify ((theta, r, n), binomLambda, modules = 'numpy')
TypeError: объект Mul не вызывается
Мой вопрос: как правильно определить функцию, чтобы она была полностью символической.
Изменить 1: Нашел ссылку об этой ошибке: https://github.com/sympy/sympy/issues/8562, но я не могу понять, где в моем коде я делаю то же самое.
Изменить 2: я обновил вопрос, изменил:
binomLambda= cNkLambda(n,r)*((theta **r)*(1-theta)**(n-r))
to :
binomLambda= cNkLambda*((theta **r)*(1-theta)**(n-r))
Однако теперь, когда я пытаюсь осветить символическую функцию следующим образом: binomLambda.subs ({theta: 0.5, r: 5, n: 10}) # это работает
#Convert it to a Numpy-callable function
binomRealLambda = sp.lambdify((theta,r,n), binomLambda, modules='numpy')
print binomRealLambda(0.5,5,10)
Это приводит к:
NameError Traceback (последний вызов последним) in () 27 binomRealLambda = sp.lambdify ((theta, r, n), binomLambda, modules = 'numpy') 28 ---> 29 печать binomRealLambda (0.5,5,10)
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/<▪init sizes.pyc в (_Dummy_46, _Dummy_47, _Dummy_48)
NameError: глобальное имя факториал не определено
Редактировать 3: у меня это полностью работает:
#----------------------Symbolic beta-------------------------------#
a = sp.Symbol('a', integer=False, positive=True)
b = sp.Symbol('b', integer=False, positive=True)
mu = sp.Symbol('mu', integer=False, positive=True)
# Create the function symbolically
G = sp.gamma
# The normalisation factor
BetaNormSym = G(a + b)/(G(a)*G(b))
# The functional form
BetaFSym = mu**(a-1) * (1-mu)**(b-1)
BetaSym=BetaNormSym * BetaFSym
BetaSym.evalf() # this works
# Turn Beta into a function
BetaLambda = sp.Lambda((mu,a,b), BetaSym)
maths(r"\operatorname{Beta}(\mu|a,b) = ")
display(BetaSym)
BetaLambda(0.5,1,1)
BetaSym.subs({mu:0.5,a:1,b:1})
#----------------------Symbolic beta-------------------------------#
Спасибо,