【问题标题】:How to properly use a lambda expression with the scipy.derivative method?如何通过 scipy.derivative 方法正确使用 lambda 表达式?
【发布时间】:2020-06-02 08:15:12
【问题描述】:

我编写了以下函数来计算反应系统中单个反应触发的概率并将函数的输出,即系统触发中每个反应的概率存储为数组:

def propensity_calc(LHS, popul_num, stoch_rate):
    propensity = np.zeros(len(LHS))
    for row in range(len(LHS)):
            a = stoch_rate[row]     
            for i in range(len(popul_num)):
                if (popul_num[i] >= LHS[row, i]):       
                    binom_rxn = binom(popul_num[i], LHS[row, i])
                    a = a*binom_rxn
                else:
                    a = 0
                    break
            propensity[row] = a     
    return propensity

此函数的输入是 3 个数组 popul_num 具有每个反应物的离散分子数,LHS 是一个二维数组,其中包含系统中每个反应的每个分子种类之间的比率,stoch_rate 是每个反应的速率。

我现在想在不同的函数中使用 scipy.misc.derivative 方法调用 propensity_calc 函数来计算偏导数:bji(x) = daj(x)/xi,其中 aj(x) 是上述 propensity_calc 函数的结果,xi 是 popul_num 数组的对应元素。

这是我目前所写的:

from scipy.misc import derivative
from scipy import optimize

def time_step_calc(popul_num, state_change_array, a0):
    # equation 22:
    expctd_net_change = a0*state_change_array
    print("expected net change:\n", expctd_net_change)
    # equation 24 partial differentiation:
    for x in range(len(popul_num)):
        part_propensity_diff = derivative(lambda LHS, popul_num, stoch_rate: propensity_calc, popul_num[x])    <-- Error here with the number of arguments passed to lambda
    # equation 26:
    t_step = epsi*a0 / sum(expctd_net_change*part_propensity_diff)
    delta_t = optimize.fmin(t_step, 0.00012) 
    print("calculated delta_t:\n", delta_t)
    return delta_t

为了将 propensity_calc 函数传递给 scipy.derviative,我尝试使用 lambda 函数,但出现以下错误:

File "C:\Users\Mike\AppData\Local\Programs\Python\Python38-32\lib\site-packages\scipy\misc\common.py", line 119, in derivative
val += weights[k]*func(x0+(k-ho)*dx,*args)
TypeError: <lambda>() missing 2 required positional arguments: 'popul_num' and 'stoch_rate'

我已经阅读了 lambda 文档,但我仍然不明白我哪里出错了,关于如何修复这个错误并进行偏微分的任何建议?

干杯

【问题讨论】:

    标签: python function lambda scipy


    【解决方案1】:

    您定义的lambda 是一个由三个参数组成的常量函数,始终返回一个函数。既然你想要一个一维函数(根据我的理解),你可能的意思是:

    lambda popul_num: propensity_calc(LHS, popul_num, stoch_rate)
    

    这可以读作“接受名为popul_num 的参数并返回propensity_calc(LHS, popul_num, stoch_rate) 的函数”。

    通过在popul_num[x] 点用上面的lambda 调用scipy.misc.derivative,您将得到propensity_calc 相对于popul_num 在点(LHS, popul_num, stoch_rate) 的偏导数的值。这意味着在这种情况下您必须定义LHSstoch_rate。确实,不要忘记偏导数仍然是三个参数的函数。

    【讨论】:

    • 感谢您的帮助,但是 w.r.t 速记代表什么?
    • 相对于
    【解决方案2】:

    通常,Scipy 只会将一个参数传递给 lambda 函数,因此它只传递 LHS 的值。看scipy documentation中的例子:

    from scipy.misc import derivative
    def f(x):
        return x**3 + x**2
    
    derivative(func=f, x0=1.0, dx=1e-6)
    4.9999999999217337
    

    这里,当 x 移动 1e-6 时,4.99 是 f 在 x=1 上的导数。假设 f 有两个变量:

    def f(x, y):
        return x**3 + y**2
    

    如果您想要关于 y 的偏导数,那么您需要一个 scipy 的包装函数来了解要更改的变量。这看起来像:

    def wrapper(y):
        return f(x, y)
    

    当然,现在你需要一个 x 的值

    x = 1
    derivative(wrapper, 2)
    4.0
    

    【讨论】:

    • 谢谢,我对包装函数有点不确定。你能指出我可以了解更多关于他们的地方吗?干杯
    • 它只是一个函数,它将调用另一个函数(在这种情况下,参数较少)。相当于做:导数(lambda y: f(x, y), 2)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多