2017-11-03 6 views
0

PYMC3에서 사용자 지정 배포 (일반화 된 극한값 또는 GEV 배포)를 사용하려고합니다.PYMC3에서 사용자 지정 가능성을 사용하면 "expected ndarray"로 오류가 발생합니다.

@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의 반환 값을 필요로했기 때문에이 오류임을 밝혀 : 여기에 참조에 대한 코드의 난이 계산하는 몇 가지 코드를 작성했습니다,하지만 난

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

의 오류 수치스러운 배열이 될 수 있습니다. 그때

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 

을 변경하면 그래프는 잘 컴파일하고 있었고, 난 샘플 수 있었다.