如何修复'TypeError: hasattr(): attribute name must be string'错误?

3

我有以下代码:

import pymc as pm
from matplotlib import pyplot as plt
from pymc.Matplot import plot as mcplot
import numpy as np
from matplotlib import rc

res = [18.752, 12.450, 11.832]

v = pm.Uniform('v', 0, 20)

errors = pm.Uniform('errors', 0, 100, size = 3)

taus = 1/(errors ** 2)

mydist = pm.Normal('mydist', mu = v, tau = taus, value = res, observed = True)

model=pm.Model([mydist, errors, taus, v, res])
mcmc=pm.MCMC(model) # This is line 19 where the TypeError originates
mcmc.sample(20000,10000)

mcplot(mcmc.trace('mydist'))

由于某些原因它无法工作,我遇到了“TypeError: hasattr(): attribute name must be string”错误,以下是跟踪信息:
 Traceback (most recent call last):

  File "<ipython-input-49-759ebaf4321c>", line 1, in <module>
runfile('C:/Users/Paul/.spyder2-py3/temp.py', wdir='C:/Users/Paul/.spyder2-py3')

  File "C:\Users\Paul\Miniconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile
execfile(filename, namespace)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 85, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)

  File "C:/Users/Paul/.spyder2-py3/temp.py", line 19, in <module>
mcmc=pm.MCMC(model)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\MCMC.py", line 82, in __init__
**kwds)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\Model.py", line 197, in __init__
Model.__init__(self, input, name, verbose)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\Model.py", line 99, in __init__
ObjectContainer.__init__(self, input)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\Container.py", line 606, in __init__
conservative_update(self, input_to_file)

  File "C:\Users\Paul\Miniconda3\lib\site-packages\pymc\Container.py", line 549, in conservative_update
if not hasattr(obj, k):

TypeError: hasattr(): attribute name must be string

如何让代码正常运行并输出“mydist”?
编辑:我之前意外发布了错误的跟踪信息。
编辑2:问题可能出在变量res没有名字,因为它是一个数组,但我不知道如何给它分配一个名字,以使其正常工作。

回溯片段似乎不包含该错误。 - Daniel Roseman
@Daniel,我不小心发布了错误的内容,抱歉,我已经更改了。 - user4099407
2个回答

1

我必须承认我不熟悉pymc,但是将其更改为以下内容至少使应用程序运行:

mydist = pm.Normal('mydist', mu = v, tau = taus, value = res, observed = False)

mcmc=pm.MCMC([mydist, errors, taus, v, res])

这似乎是因为您将所有内容都包装在一个Model中,它是ObjectContainer的扩展,但由于您传递了一个列表,Container.py中的MCMCfile_items尝试使用replace将列表中的索引4分配给某个东西,但由于ModelObjectContainer,它将键4分配给了它的__dict__,导致您遇到的奇怪的TypeError。删除包装的Model会导致MCMC正确地使用ListContainer
现在,Model.py中可能存在一个错误,位于第543行,其中可观测随机变量没有存储在数据库中 - 表达式是for object in self.stochastics | self.deterministics:,但我怀疑它也应该包括self.observable_stochastics - 所以我需要将observable更改为False,否则最后一行会抛出KeyError
我对pymc不够熟悉,无法确定它是否实际上是一个错误或期望的行为,所以我让您提交一个问题

2
很抱歉,但这是错误的,因为observed = False意味着您没有考虑res,这意味着它不会查看值(表达式值来自res)。 - user4099407
抱歉,这是我所能做的全部。如果mydistobserved设置为True,在尝试提取其跟踪时会出现KeyError - Raniz

1
您只需要将res定义为numpy数组即可:
res = np.array([18.752, 12.450, 11.832])

那么在这里,您将会得到一个错误:mcmc.trace('mydist'),因为mydist是观测数据,因此不被采样。您可能想要绘制其他变量...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接