在我写的模型的一个步骤中,我必须计算一个量的误差函数。我要做的是:
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
不适用于数组。我试过了:
但是没有成功,我知道有可能得到的结果是:
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
函数会更好、更清晰。在
我找到了解决办法。我没有意识到如果使用}。这允许
pymc.deterministic
修饰符创建变量,传递给函数的参数是numpy.array
,而不是{numpy.vectorize
函数并将其应用于变量。所以不是你需要使用
^{pr2}$而且很管用。在
你所说的“没有成功”,到底是什么意思?错误是什么?在
我注意到你在列表理解中没有把你的符号平方。这就是问题所在吗?在
相关问题 更多 >
编程相关推荐