我需要计算可能性 P(D|N),并实现我的函数,它允许数组作为输入参数



我尝试过这个,但它给了我一个错误"赋值前引用的局部变量'l'

def likelihood(N,n,k):
    """
    Call:
        l = likelihood(N,n,k)
    Input argument:
        N: integer (array)
        n: integer (array)
        k: integer (array)
    Output argument:
        l: float (array)
    Example:
        likelihood(6,10,5)
        =>
        1.190748e-05
    """
    if isinstance(N,list): # N is array
        l = zeros(len(N)) 
        for i, I in enumerate(N):
            l[i]=exp(log_factorial(I)-log_factorial(I-k)-n*log(I))
        else: # N is scalar
            l= exp(log_factorial(N)-log_factorial(N-k)-n*log(N))
    return(l)

我错在哪里?还是有其他方法可以解决它?

会收到错误,因为l是在if块的作用域内定义的,因此当您尝试返回它时,函数likelihood没有定义l变量。

l一个默认值,它应该没问题。

def likelihood(N,n,k):
    """ documentation trimmed"""
    l = []
    if isinstance(N,list): # N is array
        pass # rest of function here
    return l

如果你调用 N 而不是 list 的函数,那么它不会进入 if 子句。因此,l不是在达到return时定义的。但是,实际的错误是 else 子句缩进。这可能是您想要的:

from numpy import zeros, exp, log
from scipy.special import gammaln
log_factorial = lambda z:gammaln(z+1)
def likelihood(N,n,k):
    if isinstance(N,list): # N is array
        l = zeros(len(N)) 
        for i, I in enumerate(N):
            l[i]=exp(log_factorial(I)-log_factorial(I-k)-n*log(I))
    else: # N is scalar
        l= exp(log_factorial(N)-log_factorial(N-k)-n*log(N))
    return l
likelihood([6],10,5)
likelihood(6,10,5)

最新更新