我正在做一些pymc3,我想創建自定義的隨機指標,但似乎並沒有很多關於如何完成的文檔。我知道如何使用as_op way,但顯然這使得不可能使用NUTS採樣器,在這種情況下,我沒有看到pymc3相對於pymc的優勢。如何使用theano.op編寫定製的pymc3中的確定性或隨機性?
該教程提到可以通過從theano.Op繼承來完成。但任何人都可以告訴我如何工作(我仍然開始對theano)?我有兩個我想定義的隨機指標。
第一個應該更容易,它是具有唯一不變的父變量的N維向量F
:
with myModel:
F = DensityDist('F', lambda value: pymc.skew_normal_like(value, F_mu_array, F_std_array, F_a_array), shape = N)
我想偏斜正態分佈,這似乎並沒有在pymc3要實現的是,我剛剛導入了pymc2版本。不幸的是,F_mu_array, F_std_array, F_a_array and F
都是N維矢量,並且lambda似乎不適用於N維列表value
。
首先,有沒有辦法讓lambda輸入成爲一個N維數組?如果沒有,我想我需要直接定義隨機指標F
,這是我認爲需要theano.Op才能使其工作的地方。
第二個例子是其他隨機指標的一個更復雜的函數。在這裏,我要怎麼定義它(在錯誤的時刻):
with myModel:
ln2_var = Uniform('ln2_var', lower=-10, upper=4)
sigma = Deterministic('sigma', exp(0.5*ln2_var))
A = Uniform('A', lower=-10, upper=10, shape=5)
C = Uniform('C', lower=0.0, upper=2.0, shape=5)
sw = Normal('sw', mu=5.5, sd=0.5, shape=5)
# F from before
F = DensityDist('F', lambda value: skew_normal_like(value, F_mu_array, F_std_array, F_a_array), shape = N)
M = Normal('M', mu=M_obs_array, sd=M_stdev, shape=N)
# Radius forward-model (THIS IS THE STOCHASTIC IN QUESTION)
R = Normal('R', mu = R_forward(F, M, A, C, sw, N), sd=sigma, shape=N)
當功能R_forward(F,M,A,C,sw,N)
被天真地定義爲:
from theano.tensor import lt, le, eq, gt, ge
def R_forward(Flux, Mass, A, C, sw, num):
for i in range(num):
if lt(Mass[i], 0.2):
if lt(Flux[i], sw[0]):
muR = C[0]
else:
muR = A[0]*log10(Flux[i]) + C[0] - A[0]*log10(sw[0])
elif (le(0.2, Mass[i]) or le(Mass[i], 0.5)):
if lt(Flux[i], sw[1]):
muR = C[1]
else:
muR = A[1]*log10(Flux[i]) + C[1] - A[1]*log10(sw[1])
elif (le(0.5, Mass[i]) or le(Mass[i], 1.5)):
if lt(Flux[i], sw[2]):
muR = C[2]
else:
muR = A[2]*log10(Flux[i]) + C[2] - A[2]*log10(sw[2])
elif (le(1.5, Mass[i]) or le(Mass[i], 3.5)):
if lt(Flux[i], sw[3]):
muR = C[3]
else:
muR = A[3]*log10(Flux[i]) + C[3] - A[3]*log10(sw[3])
else:
if lt(Flux[i], sw[4]):
muR = C[4]
else:
muR = A[4]*log10(Flux[i]) + C[4] - A[4]*log10(sw[4])
return muR
這想必不會,當然工作。我可以看到我將如何使用as_op
,但我想保留NUTS採樣。
thx你的例子。我個人是一個完整的初學者pymc3,不能用於某些任務。所以,我代碼爲pymc2 ...這樣的恥辱......請你可以看看我的情況http://stackoverflow.com/questions/42205123/how-to-fit-a-method-belonging-to-an-instance- with-pymc3,看看你能幫忙嗎?我前一段時間看到你的例子,但我發現它很複雜,我沒有將它應用到我的案例中,因爲我希望有人會提出更簡單的建議。在我看來,pymc3是否沒有一個實際的答案在我看來很尷尬......在我看來,我很可能錯過了一些明顯的東西。 –
即使是最近的嘗試,以避免使用theano.op,下面的評論,都是失敗。機制仍然是神祕... –
我在http://stackoverflow.com/a/43449084/7132951迴應 –