在循环函数中调用args

时间:2018-02-23 12:12:40

标签: python for-loop arguments mcmc

对于MCMC我使用emcee包this tutorial.我使用thispart而不是this form的等式,而不是{{3}}的等式,我使用{{3}},我的意思是我使用矩阵形式(不是它的代码)和写了下面的代码。 有关我的代码的更多解释:

def new_calculation(n)是矩阵的每个分量的等式,def log_likelihood(theta,hh):是提到的矩阵。 问题是,我需要在soln = minimize(nll, initial, args=(hh))def log_probability(theta,hh):中使用args 我使用hh作为args,但Python说hh未定义。问题可能是定义参数和函数。我不知道如何解决它。

import numpy as np
import emcee
import matplotlib.pyplot as plt
from math import *
import numpy as np
from scipy.integrate import quad
from scipy.integrate import odeint

xx=np.array([0.01,0.012,0.014,0.016])   
yy=np.array([32.95388698,33.87900347,33.84214074,34.11856704])
Cov=[[137,168],[28155,-2217]]


rc=0.09
c=0.7
H01 = 70
O_m1 = 0.28
z0=0
M1=10

np.random.seed(123)

def ant(z,O_m,O_D):           
    return 1/sqrt(((1+z)**2)*(1+O_m*z))

def new_calculation(n):    

    O_D=1-O_m-(1/(2*rc*yyn))
    q=quad(ant,0,xx[n],args=(O_m,O_D))[0]     
    h=log10((1+xx[n])*q)   
    fn=(yy[n]-M-h)
    return fn

def log_likelihood(theta,hh):    
    H0, O_m,M= theta
    f_list = []
    for i in range(2):  # the value '2' reflects matrix size
        f_list.append(new_calculation(i))

        rdag=[f_list]
        rmat=[[f] for f in f_list]        
        hh=np.linalg.det(np.dot(rdag,Cov),rmat)*0.000001
        return hh


 from scipy.optimize import minimize
np.random.seed(42)
nll = lambda *args: -log_likelihood(*args)
initial = np.array([H01, O_m1,M1]) + 0.1*np.random.randn(3)
soln = minimize(nll, initial, args=(hh))
H0_ml, O_m0_ml = soln.x


def log_prior(theta):
    H0, O_D = theta
    if 65 < H0 < 75 and 0.22 < O_m < 0.32 and 0 < M < 12:
        return 0.0
    return -np.inf

def log_probability(theta, mm,zz,hh):
    lp = log_prior(theta)
    if not np.isfinite(lp):
        return -np.inf
    return lp + log_likelihood(theta, mm,zz,hh)


y0=H0
pos = soln.x + 1e-4*np.random.randn(200, 3)
nwalkers, ndim = pos.shape


sampler = emcee.EnsembleSampler(nwalkers, ndim, log_probability, args=(rdag, rmat))
sampler.run_mcmc(pos, 500);
fig = plt.figure(2,figsize=(10, 10))
fig.clf()
for j in range(ndim):
    ax = fig.add_subplot(ndim,1,j+1)
    ax.plot(np.array([sampler.chain[:,i,j] for i in range(nwalkers)]),"k", alpha = 0.3)
    ax.set_ylabel(("H0", "O_m")[j], fontsize = 15)
plt.xlabel('Steps', fontsize = 15)
fig.show()

感谢您的帮助和关注。

1 个答案:

答案 0 :(得分:0)

在这一行:

soln = minimize(nll, initial, args=(hh))

hh未定义 - 它在log_likelihood中定义,但该行不在该函数中。

要么你有一个缩进问题 - 这意味着要标记为log_likelihood。否则,您需要实际为要最小化的函数提供参数。如果没有,或者您不确定,只需删除它并查看它是否有效。否则,您需要在元组中提供实际参数(超出最小化矩阵的额外参数)。