Правильный способ получения вероятности моей цепи в данной позиции - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь использовать теорему Байеса для статистического анализа.Поэтому я хочу использовать свой апостериор из предыдущего прогона 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?

Что я тут не так сделал?

...