用SymPy定义二项式

2024-10-03 17:26:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用符号来定义二项函数。 我的第一次尝试如下:

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定义,以便正确定义符号函数,但是这会导致异常:

^{pr2}$

类型错误回溯(最近一次调用) 在() 23cNkLambda.evalf公司这很管用 24 --->;25比诺姆兰伯达(n,r)((θr)(1-θ)(n-r)) 将其转换为Numpy可调用函数 27#binŤ可能性=兰姆迪菲((θ,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))

收件人:

binomLambda= cNkLambda*((theta **r)*(1-theta)**(n-r)) 

但是现在当我试着把符号函数如下: binomLambda.subs公司({θ: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)

这将导致:

名称错误回溯(最近一次呼叫) 在() 27比诺姆雷兰伯达=兰姆迪菲((θ,r,n),binomLambda,modules='numpy') 28 --->;29打印binomRealLambda(0.5,5,10)

/系统/库/框架/Python.framework/Versions/2.7/Extras/lib/python/numpy/init.pyc in(_Dummy_46,_Dummy_48)

名称错误:未定义全局名称“factorial”

编辑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-------------------------------#

谢谢


Tags: 函数importnumpytrue定义asintegersymbol
1条回答
网友
1楼 · 发布于 2024-10-03 17:26:29

cNkLambda是根据n和{}定义的一个SymPy表达式。 它不是一个函数,所以不要用cNkLambda(n,r)来调用它。binomLambda可以通过以下方式定义:

binomLambda = cNkLambda*((theta **r)*(1-theta)**(n-r))

^{pr2}$

要用binomLambda生成一个数值函数,可以使用sympy.lambdify。 但是请注意,binomLambda使用阶乘,NumPy没有定义阶乘函数。在

您可以调用math.factorialscipy.misc.factorial

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]

相关问题 更多 >