Я пытаюсь использовать теорему Байеса для статистического анализа.Поэтому я хочу использовать свой апостериор из предыдущего прогона MCMC как мой предыдущий для нового.Я использую пакет emcee в python 3.6
Я пытался использовать функцию get_lnprob в моей задней цепи, чтобы получить вероятность в данной позиции.Я также пытался поиграть с lnprobability, но это просто дает мне Матрицу вероятностей для каждого ходунка на каждом шаге, но не включает в себя информацию о положении.
Ранее я уже запускал сэмплер с плоским предшествующим уровнем.и вероятность Гаусса и теперь приобрели некоторую цепочку (для 2-х измерений, 10 ходунков, 100 шагов)
Затем я хочу построить свой новый апостериор, используя эту цепочку, как указано ниже:
logprior = chain
def post_new(x, data, logprior, cov, length, c_raw):
lp = logprior.get_lnprob(x)
print(lp)
if not np.isfinite(lp):
return -np.inf
return lp + like(x, data, cov, length, c_raw)
где x - это мой (длина 2) вектор положения, logprior - это цепочка, которую я получил от моего предыдущего запуска, а like (args) - логарифмическая вероятность моего набора данных
, тогда я хочу запустить это:
sampler = emcee.EnsembleSampler(nwalkers, ndim, post_new, args=(data, logprior, cov, length, c_raw))
sampler.run_mcmc(p0, 1000)
Я ожидал, что функция get_lnprob выдаст мне логарифмическую вероятность в позиции x моего старого апостериорного / нового предыдущего распределения.Но даже когда я передаю в своем пространстве явную позицию, такую как
logprior.get_lnprob([0.5,0.5])
, я получаю ошибку:
File "iterative.py", line 95, in <module>
print(prior_new.get_lnprob(pos))
File "(...)\lib\site-packages\emcee\sampler.py", line 116, in get_lnprob
return self.lnprobfn(p, *self.args, **self.kwargs)
TypeError: __call__() takes 2 positional arguments but 7 were given
из того, что, как я понимаю, функция get_lnprob ожидала, что я дам ее 2аргументы (которые я сделал?) но получил 7?
Что я тут не так сделал?