如何对PyMC中的变量应用自定义函数?

2024-10-02 02:35:02 发布

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

在我写的模型的一个步骤中,我必须计算一个量的误差函数。我要做的是:

from math import erf
import numpy as np
import pymc as pm

sig = pm.Exponential('sig', beta=0.1, size=10)
x = erf(sig ** 2)

此操作失败,因为erf不适用于数组。我试过了:

^{pr2}$

但是没有成功,我知道有可能得到的结果是:

np_erf = np.vectorize(erf)
x = np_erf((sig ** 2).value)

但这似乎不是正确的方法,因为它不产生pm.Deterministic,而只是一个np.array。我该怎么做呢?(PyMC是2.3版)


编辑:为了清晰起见,上面的示例被简化了,下面是相关段落在实际代码中的外观。理想情况下,我希望这样做:

mu = pm.LinearCombination('mu', [...], [...])
sig2 = pm.exp(mu) ** 2
f = 1 / (pm.sqrt(np.pi * sig2 / 2.0) * erf(W / sig2))

但如果失败,则返回消息TypeError: only length-1 arrays can be converted to Python scalars。走np.vectorize路线

np_erf = np.vectorize(erf)
f = 1 / (pm.sqrt(np.pi * sig2 / 2.0) * np_erf(W / sig2))

崩溃并显示相同的错误消息。列表理解

@pm.deterministic
def f(sig2=sig2):
    return [1 / (pm.sqrt(np.pi * s / 2.0) * erf(W / s)) for s in sig2]

工作原理是这样的,但会导致代码稍后在此处出现错误:

@pm.observed(plot=True)
def y(value=df['dist'], sig2=sig2, f=f):
    return (np.log(np.exp(-(value ** 2) / 2.0 / sig2) * f)).sum()

错误是AttributeError: log。在

我用数值近似法计算了误差函数,这意味着一般的设置是正确的。直接使用erf函数会更好、更清晰。在


Tags: 函数importvalueas错误nppisqrt
2条回答

我找到了解决办法。我没有意识到如果使用pymc.deterministic修饰符创建变量,传递给函数的参数是numpy.array,而不是{}。这允许numpy.vectorize函数并将其应用于变量。所以不是

sig = pm.Exponential('sig', beta=0.1, size=10)
x = erf(sig ** 2)

你需要使用

^{pr2}$

而且很管用。在

你所说的“没有成功”,到底是什么意思?错误是什么?在

我注意到你在列表理解中没有把你的符号平方。这就是问题所在吗?在

相关问题 更多 >

    热门问题