2017-11-03 6 views
0

PYMC3でカスタム分布(一般化極値またはGEV分布)を使用しようとしています。私はこれを計算するいくつかのコードを書かれているが、私はPYMC3でカスタム尤度を使用すると "expected ndarray"でエラーになる

ValueError: expected an ndarray Apply node that caused the error: MakeVector{dtype='float64'}(logp_sigma_log, __logp_mu, __logp_xi, __logp_x)

の誤差はここで参照するためのコードです取得:

@theano.as_op(itypes=[tt.dvector, tt.dscalar, tt.dscalar, tt.dscalar], 
       otypes=[tt.dscalar]) 
def likelihood_op(values, mu, sigma, xi): 
    logp = 0. 
    for val in values: 
     logp += genextreme.logpdf(val,-xi,loc=mu,scale=sigma) 
    return logp 

def gev_ll(values): 
    return likelihood_op(values, mu, sigma, xi) 



with pymc3.Model() as model: 
    mean_sigma = 0.0 
    sd_sigma = 5.0 
    sigma  = pymc3.Lognormal('sigma',mu = mean_sigma,tau = sd_sigma) 

    mean_mu = 0.0 
    sd_mu = 40.0 
    mu  = pymc3.Normal('mu',mu=mean_mu,sd =sd_mu) 

    mean_xi = 0.0 
    sd_xi = 2.0 
    xi  = pymc3.Normal('xi',mu = mean_xi, sd = sd_xi) 

    x = pymc3.DensityDist('x',gev_ll,observed = np.squeeze(maxima.values)) 
    step = pymc3.Metropolis() 
    trace = pymc3.sample(draws=1000,step=step,n_int = 10000,tune = 1000,n_jobs = 4) 
    print 'Gelman-Rubin diagnostic: {0}'.format(pymc3.diagnostics.gelman_rubin(trace)) 

答えて

0

likelihood_opの戻り値が必要なので、このエラーがあったことが判明します数が少ない配列です。私はその後、

def likelihood_op(values, mu, sigma, xi): 
    logp = 0. 
    for val in values: 
     logp += genextreme.logpdf(val,-xi,loc=mu,scale=sigma) 
    return np.array(logp) 

def likelihood_op(values, mu, sigma, xi): 
    logp = 0. 
    for val in values: 
     logp += genextreme.logpdf(val,-xi,loc=mu,scale=sigma) 
    return logp 

を変更すると、グラフは罰金コンパイルされたと私は、サンプリングすることができました。

関連する問題