Python 二项式的符号定义
我试图用Sympy来象征性地定义二项式函数。 我的第一次尝试如下:Python 二项式的符号定义,python,sympy,Python,Sympy,我试图用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,
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回溯(最近一次调用上次) 在() 23 cNkLambda.evalf()#这很有效 24 --->25 binomLambda=cNkLambda(n,r)(θr)(1-θ(n-r)) 26#将其转换为Numpy可调用函数 27#bin_似然=sp.lambdify((θ,r,n),binomLambda,modules='numpy') TypeError:“Mul”对象不可调用 我的问题是:如何正确定义函数,使其始终具有符号性 编辑1: 找到有关此错误的引用:,但我无法推断我在代码中执行相同操作的位置 编辑2: 我更新了问题,更改为:
binomLambda= cNkLambda(n,r)*((theta **r)*(1-theta)**(n-r))
致:
但是现在,当我尝试将符号函数lamdify如下所示:
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回溯(最近一次呼叫上次)
在()
27 binomRealLambda=sp.lambdify((θ,r,n),binomLambda,modules='numpy')
28
--->29打印双精度Lambda(0.5,5,10)
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/Python/numpy/init.pyc-in(\u-Dummy\u 46,\u-Dummy\u 47,\u-Dummy\u 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-------------------------------#
谢谢,
cNkLambda
是一个用n
和r
定义的同义表达式。
它不是一个函数,所以不要用cNkLambda(n,r)
调用它<代码>binomLambda可以通过以下方式定义:
binomLambda = cNkLambda*((theta **r)*(1-theta)**(n-r))
要使用
binomLambda
生成数值函数,可以使用sympy.lambdify
。
但是,请注意,binomLambda
使用阶乘,而NumPy不定义阶乘函数
您可以调用math.factorial
或scipy.misc.factorial
:
bin_likelihood = sy.lambdify((theta,r,n), binomLambda, modules='math')
或
比如说,
import scipy.misc as misc
import numpy as np
import sympy as sy
sy.interactive.printing.init_printing(use_latex=True)
n = sy.Symbol('n', integer=True, positive=True)
r = sy.Symbol('r', integer=True, positive=True)
theta = sy.Symbol('theta')
cNkLambda= (sy.factorial(n))/ (sy.factorial(r) * sy.factorial(n-r))
binomLambda = cNkLambda*((theta **r)*(1-theta)**(n-r))
bin_likelihood = sy.lambdify((theta,r,n), binomLambda, modules='math')
print(bin_likelihood(np.linspace(0,2*np.pi,4), 2, 5))
# [ 0.00000000e+00 -5.74962672e+01 -5.68925055e+03 -5.82166577e+04]
bin_likelihood2 = sy.lambdify((theta,r,n), binomLambda,
modules=[{'factorial':misc.factorial}])
print(bin_likelihood2(np.linspace(0,2*np.pi,4), 2, 5))
# [ 0.00000000e+00 -5.74962672e+01 -5.68925055e+03 -5.82166577e+04]
谢谢请注意,“sp.Lambda”适用于从Symphy进行阶乘导入的第一个版本,而“sp.lambdify”则不适用。@HaroSato
Lambda
创建符号函数lambdify
将符号表达式转换为数字函数。为什么不使用内置函数,如二项式(n,k)?此外,如果您使用的是概率分布,您可能会发现sympy.stats模块很有用。
bin_likelihood = sy.lambdify((theta,r,n), binomLambda, modules='math')
bin_likelihood2 = sy.lambdify((theta,r,n), binomLambda,
modules=[{'factorial':misc.factorial}])
import scipy.misc as misc
import numpy as np
import sympy as sy
sy.interactive.printing.init_printing(use_latex=True)
n = sy.Symbol('n', integer=True, positive=True)
r = sy.Symbol('r', integer=True, positive=True)
theta = sy.Symbol('theta')
cNkLambda= (sy.factorial(n))/ (sy.factorial(r) * sy.factorial(n-r))
binomLambda = cNkLambda*((theta **r)*(1-theta)**(n-r))
bin_likelihood = sy.lambdify((theta,r,n), binomLambda, modules='math')
print(bin_likelihood(np.linspace(0,2*np.pi,4), 2, 5))
# [ 0.00000000e+00 -5.74962672e+01 -5.68925055e+03 -5.82166577e+04]
bin_likelihood2 = sy.lambdify((theta,r,n), binomLambda,
modules=[{'factorial':misc.factorial}])
print(bin_likelihood2(np.linspace(0,2*np.pi,4), 2, 5))
# [ 0.00000000e+00 -5.74962672e+01 -5.68925055e+03 -5.82166577e+04]