私が書いているモデルの 1 つのステップで、量の誤差関数を計算する必要があります。私がやろうとしていることは次のようになります。
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
配列では機能しないため、これは失敗します。私は試した:
@pm.deterministic
def x(sig=sig):
return [erf(s) for s in sig]
しかし、成功しませんでしたが、次の方法で結果を得ることができることを知っています:
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
関数を直接使用する方が、より適切で明確になります。