Следующая модель (взятая из Байесовских методов для хакеров) работает с Пуассоном.
count_data = np.loadtxt("data/txtdata.csv")
n_count_data = len(count_data)
with pm.Model() as model:
alpha = 1.0/count_data.mean() # Recall count_data is the
# variable that holds our txt counts
lambda_1 = pm.Exponential("lambda_1", alpha)
lambda_2 = pm.Exponential("lambda_2", alpha)
tau = pm.DiscreteUniform("tau", lower=0, upper=n_count_data - 1)
idx = np.arange(n_count_data) # Index
lambda_ = pm.math.switch(tau >= idx, lambda_1,lambda_2)
observation = pm.Poisson("obs", lambda_, observed=count_data)
step = [pm.Metropolis(), pm.NUTS()]
trace = pm.sample(10000, tune=5000,step=step)
pm.traceplot(trace, ['lambda_1', 'lambda_2', 'tau'])
plt.show()
С распределением Пуассона:
Однако при использовании экспоненциальной случайной величины в этой модели:
observation = pm.Exponential("obs", lambda_, observed=count_data)
Я получил:
С экспоненциальным распределением:
Причина, по которой я хочу использовать экспоненциальное распределение, заключается в использовании нецелых чисел.
Я не уверен, связана ли проблема с определением lambda_ или с чем-то еще (для этого необходим сэмплер).