2017-02-13 6 views
0

나는 사전에 넣을 수있는 많은 수의 사전들을 가지고 있습니다. 내가 수동으로 이러한 변수를 만들 수 있습니다사전에서 사전 변수를 만드는 방법은 무엇입니까?

d = {'a1':{'name':'a1','lower':0,'upper':10},\ 
'a2':{'name':'a2','lower':0,'upper':10},\ 
'a3':{'name':'a3','lower':0,'upper':10}} 

: 간단하게하기 위해,의는 3 전과를 포함하는 다음 예제를 사용하자

import pymc3 
model = pymc3.Model() 
with model: 
    a1 = pymc3.Uniform('a1',lower=0,upper=10) 
    a2 = pymc3.Uniform('a2',lower=0,upper=10) 
    a3 = pymc3.Uniform('a3',lower=0,upper=10) 

하지만이 전과의 수는이 방법은 고통스러운합니다 . pymc3의 사전에서 사전을 정의하는 적절한 방법이 있습니까? 지금까지 발견 된 유일한 자동 솔루션은 다음과 같습니다.

list_prior_names = ['a1','a2','a3'] 
for prior_name in list_prior_names: 
    exec(prior_name+"=pymc3.Uniform(prior_name,lower=d[prior_name]['lower'],upper=d[prior_name]['upper'])") 

더 좋은 방법이 있습니까?

마찬가지로, 나는이 사전과 다른 변수 사이의 관계를 제공하는 사전을 가지고 있습니다. 간단하게하기 위해 들어, 다음의 예는 사도와 새로운 변수 간의 선형 관계를 정의하고 사용하자 : 나는 B1, B2 만들 수있는, 다시 한번

relations = {'a1':{'b1':2,'b2:4},'a2':{'b1':1},'a3':{'b3':5}} 

를 B3 수동으로 다음 코드 :

b1 = 2*a1 + a2 
b2 = 4*a1 
b3 = 5*a3 

다른 솔루션과 비슷한 해결책을 사용할 수는 있지만 여기서는 b1, b2, b3을 만드는 더 좋은 방법이 있다고 생각합니다.

내가 현재 사용하고있는 코드는 다음과 같습니다 사람이 A1을 만들 수있는 적절한 방법에 대한 단서를 가지고 있다면

import pymc3 
model = pymc3.Model() 

obs1,obs2,obs3 = 2,4,5 

d = {'a1':{'name':'a1','lower':0,'upper':10},\ 
'a2':{'name':'a2','lower':0,'upper':10},\ 
'a3':{'name':'a3','lower':0,'upper':10}} 

with model: 
    list_prior_names = ['a1','a2','a3'] 
    for prior_name in list_prior_names: 
     exec(prior_name+"=pymc3.Uniform(prior_name,lower=d[prior_name]['lower'],upper=d[prior_name]['upper'])") 

    b1 = 2*a1 + a2 
    b2 = 4*a1 
    b3 = 5*a3 

    m1 = pymc3.Normal('M1',mu=b1,sd=0.1,observed=obs1) 
    m2 = pymc3.Normal('M2',mu=b2,sd=0.1,observed=obs2) 
    m3 = pymc3.Normal('M3',mu=b3,sd=0.1,observed=obs3) 

    trace = pymc3.sample(1000) 

, A2, A3, B1, B2 및 B3, 나는 감사하게 될 거라고.

답변

0

실제로 pymc3은 사전에 정의 된 변수를 사용하여 계산할 수 있습니다. 나는 다음 문제를 해결하기 위해 다음과 같은 코드를 작성했다. 누군가가 같은 질문을 처리 할 날이 있기를 바랍니다.

import pymc3 
model = pymc3.Model() 

obs1,obs2,obs3 = 2,4,5 

d = {'a1':{'name':'a1','lower':0,'upper':10}, 
    'a2':{'name':'a2','lower':0,'upper':10}, 
    'a3':{'name':'a3','lower':0,'upper':10}} 

relations = {'b1':{'a1':2,'a2':1},'b2':{'a1':4},'b3':{'a3':5}} 

correspondances_dict = {'b1':{'random_var_name':'m1','observation':obs1}, 
         'b2':{'random_var_name':'m2','observation':obs2}, 
         'b3':{'random_var_name':'m3','observation':obs3}} 

with model: 
    priors={prior_name:pymc3.Uniform(prior_name,lower=d[prior_name]['lower'], 
      upper=d[prior_name]['upper']) for prior_name in list(d.keys())} 

    intermediate_vars = {intermediate_var:sum([relations[intermediate_var][prior_name]*priors[prior_name] 
     for prior_name in list(relations[intermediate_var].keys())]) 
     for intermediate_var in list(relations.keys())} 

    observed_vars = {correspondances_dict[intermediate_var]['random_var_name']: 
        pymc3.Normal(correspondances_dict[intermediate_var]['random_var_name'], 
           mu=intermediate_vars[intermediate_var], 
           sd=0.1, 
           observed=correspondances_dict[intermediate_var]['observation']) 
        for intermediate_var in list(intermediate_vars.keys())} 

    trace = pymc3.sample(1000) 
관련 문제