Python Pymc二维高斯拟合

Python Pymc二维高斯拟合,python,numpy,multidimensional-array,pymc,model-fitting,Python,Numpy,Multidimensional Array,Pymc,Model Fitting,我试图用pymc将预定义的2d高斯函数拟合到一些观测数据中。我一直遇到错误,最后一个错误是ValueError:使用序列设置数组元素。我理解错误的含义,但我不确定代码中的错误发生在哪里。我天真的猜测是随机变量被设置为一些数组元素。如有任何建议,将不胜感激。以下是我目前的代码: import pymc as mc import numpy as np import pyfits as pf arr = pf.getdata('img.fits') x=y=np.arange(0,71) xx,y

我试图用pymc将预定义的2d高斯函数拟合到一些观测数据中。我一直遇到错误,最后一个错误是
ValueError:使用序列设置数组元素。
我理解错误的含义,但我不确定代码中的错误发生在哪里。我天真的猜测是随机变量被设置为一些数组元素。如有任何建议,将不胜感激。以下是我目前的代码:

import pymc as mc
import numpy as np
import pyfits as pf

arr = pf.getdata('img.fits')
x=y=np.arange(0,71)
xx,yy=np.meshgrid(x,y)
err_map = pf.getdata('imgwht.fits')
def model((x,y),arr):
    amp = mc.Uniform('amp',lower=-1,upper=1,doc='Amplitude')
    x0 = mc.Uniform('x0',lower=21,upper=51,doc='xo')
    y0 = mc.Uniform('y0',lower=21,upper=51,doc='yo')
    sigx = mc.Uniform('sigx',lower=0.1,upper=10,doc='Sigma in X')
    sigy = mc.Uniform('sigy',lower=0.1,upper=10,doc='Sigma in Y')
    thta = mc.Uniform('theta',lower=0,upper=2*np.pi,doc='Rotation')
    os = mc.Uniform('c',lower=-1,upper=1,doc='Vertical offset')

    @mc.deterministic(plot=False,trace=False)
    def gaussian((x, y)=(xx,yy), amplitude=amp, xo=x0, yo=y0, sigma_x=sigx, sigma_y=sigy, theta=thta, offset=os):
        xo = float(xo)
        yo = float(yo)    
        a = (mc.cos(theta)**2)/(2*sigma_x**2) + (mc.sin(theta)**2)/(2*sigma_y**2)
        b = -(mc.sin(2*theta))/(4*sigma_x**2) + (mc.sin(2*theta))/(4*sigma_y**2)
        c = (mc.sin(theta)**2)/(2*sigma_x**2) + (mc.cos(theta)**2)/(2*sigma_y**2)
        gauss = offset+amplitude*mc.exp(-1*(a*((x-xo)**2)+2*b*(x-xo)*(y-yo)+c*((y-yo)**2)))
        return gauss
    flux = mc.Normal('flux',mu=gaussian,tau=err_map,value=arr,observed=True,doc='Observed Flux')
    return locals()
mdl = mc.MCMC(model((xx,yy),arr))
mdl.sample(iter=1e5,burn=9e4)
完全回溯:

File "model.py", line 31, in <module>
    mdl = mc.MCMC(model((xx,yy),arr))
File "model.py", line 29, in model
    flux = mc.Normal('flux',mu=gaussian,tau=err_map,value=arr,observed=True,doc='Observed Flux')
File "/usr/lib64/python2.7/site-packages/pymc/distributions.py", line 318, in __init__
**arg_dict_out)
File "/usr/lib64/python2.7/site-packages/pymc/PyMCObjects.py", line 761, in __init__
verbose=verbose)
File "/usr/lib64/python2.7/site-packages/pymc/Node.py", line 219, in __init__
Node.__init__(self, doc, name, parents, cache_depth, verbose=verbose)
File "/usr/lib64/python2.7/site-packages/pymc/Node.py", line 129, in __init__
self.parents = parents
File "/usr/lib64/python2.7/site-packages/pymc/Node.py", line 152, in _set_parents
self.gen_lazy_function()
File "/usr/lib64/python2.7/site-packages/pymc/PyMCObjects.py", line 810, in gen_lazy_function
self._logp.force_compute()
File "LazyFunction.pyx", line 257, in pymc.LazyFunction.LazyFunction.force_compute (pymc/LazyFunction.c:2409)
File "/usr/lib64/python2.7/site-packages/pymc/distributions.py", line 2977, in wrapper
return f(value, **kwds)
File "/usr/lib64/python2.7/site-packages/pymc/distributions.py", line 2168, in normal_like
return flib.normal(x, mu, tau)
ValueError: setting an array element with a sequence.
文件“model.py”,第31行,在
mdl=mc.MCMC(型号(xx,yy,arr))
文件“model.py”,第29行,在模型中
通量=mc.Normal('flux',mu=高斯,tau=err_map,value=arr,observed=True,doc='observed flux')
文件“/usr/lib64/python2.7/site packages/pymc/distributions.py”,第318行,在__
**arg_dict_out)
文件“/usr/lib64/python2.7/site packages/pymc/PyMCObjects.py”,第761行,在__
详细的
文件“/usr/lib64/python2.7/site packages/pymc/Node.py”,第219行,在__
节点.\uuuuu init\uuuuuuuuuuuu(self,doc,name,parent,cache\u depth,verbose=verbose)
文件“/usr/lib64/python2.7/site packages/pymc/Node.py”,第129行,在__
self.parents=父母
文件“/usr/lib64/python2.7/site packages/pymc/Node.py”,第152行,在父集合中
self.gen_lazy_函数()
gen_lazy_函数中的文件“/usr/lib64/python2.7/site packages/pymc/PyMCObjects.py”,第810行
self.\u logp.force\u compute()
pymc.LazyFunction.LazyFunction.force_compute(pymc/LazyFunction.c:2409)中的文件“LazyFunction.pyx”,第257行
包装器中的文件“/usr/lib64/python2.7/site packages/pymc/distributions.py”,第2977行
返回f(值,**科威特第纳尔)
文件“/usr/lib64/python2.7/site packages/pymc/distributions.py”,第2168行,正常格式
返回飞片正常(x,mu,tau)
ValueError:使用序列设置数组元素。

我以前遇到过类似的问题,但从未有机会找到问题的根源。代码中的问题行是观察到的
随机问题的问题行:

flux = mc.Normal('flux',mu=gaussian,tau=err_map,value=arr,observed=True,doc='Observed Flux')
我知道您可以使用一种变通方法,即检查
mu
变量是否为
pymc.Node
,并仅在不为时查找可能性:

@mc.observed
def flux(mu=gaussian,tau=err_map,value=arr):
    if isinstance(mu, mc.Node):
        return 0
    else:
        return mc.normal_like(value, mu, tau)

我认为如果你有时间的话,在PyMC github问题跟踪程序中提交一份bug报告是值得的。

the
@mc.deterministic
decorator返回一个
deterministic
变量。要获取变量的值,请使用属性
value

flux = mc.Normal('flux',mu=gaussian.value,tau=err_map,value=arr,observed=True,doc='Observed Flux')

您能提供该错误的完整回溯吗?欢迎使用堆栈溢出,请使用。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅。@Cyber绝对感谢您的查看。我得到了
IOError:文件不存在:“img.fits”
;你能链接到你的代码所需的
.fits
文件吗?@AbrahamDFlaxman这是img.fits:和imgwht.fits的链接: