ValueError: операнды не могут быть переданы вместе с формами (1,2) (20,100)
Я использую молоток emcee mcmc, чтобы восстановить 1D гауссиан из 20 образцов со случайными стандартными отклонениями. Вот соответствующая часть моего кода:
def loglike(alpha,datapoints):
mu, sig = alpha
return nbabies*(np.log(1/(nsamples*np.sqrt(2*np.pi)*sig)))+np.sum(scipy.misc.logsumexp(-(datapoints-mu)**2/(2*sig**2),axis=1),axis=0)
import scipy.optimize as op
nll = lambda *args: -loglike(*args)
result = op.minimize(nll, [mupop, sigpop], args=(datapoints))
muml,sigml = result["x"]
def logprior(alpha):
mu, sig = alpha
if 0 < sig < 1 and 0.0 < mu < 1:
return 0.0
return -np.inf
def logprob(alpha,datapoints):
lp = logprior(alpha)
if not np.isfinite(lp):
return -np.inf
return lp + loglike(alpha,datapoints)
rendim = 2
renwalkers = 100
rensamples = 10000
p0 = [result["x"]+np.random.rand(rendim) for i in range(renwalkers)]
#now we run emcee!
momma2 = emcee.EnsembleSampler(renwalkers, rendim, logprob, args=(datapoints))
momma2.run_mcmc(p0, rensamples)
momma2samps = momma2.flatchain[0.2*renwalkers*rensamples:,]
Но я продолжаю получать сообщение об ошибке "ValueError: операнды не могут быть переданы вместе с shape (1,2) (20,100)". В чем дело?
1 ответ
Ваша проблема в том, что линия
result = op.minimize(nll, [mupop, sigpop], args=(datapoints))
должно быть
result = op.minimize(nll, [mupop, sigpop], args=(datapoints,))
minimize
принимает кортеж как аргументы, и если вы не включите запятую, он не будет правильно интерпретировать аргументы.