如何修复“TypeError:hasattr():属性名必须是字符串”错误?

2024-06-08 17:01:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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”错误,跟踪如下:

^{pr2}$

如何使其工作并输出“mydist”?在

编辑:我一开始无意中贴错了踪迹。在

编辑2:这一切一定是因为res没有名字,因为它是一个数组,但我不知道如何给它赋值,所以它能让它工作。在


Tags: fromimportmodelmatplotlibasresuniformpymc
2条回答

您只需将res定义为numpy数组:

res = np.array([18.752, 12.450, 11.832])

然后您将得到一个错误mcmc.trace('mydist'),因为mydist是观察数据,因此没有采样。你可能需要绘制其他变量。。。在

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

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

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

这似乎是因为您将所有内容包装在一个模型中,该模型是ObjectContainer的扩展,但是由于您向它传递了一个列表,MCMCfile_itemsin容器.py试图使用replace将列表中的索引4分配给某个对象,但是由于Model是一个ObjectContainer,它在它的__dict__中分配了一个键4,这导致了你得到的奇怪的TypeError。移除包装Model导致MCMC正确使用ListContainer。在

现在,模型.pyline 543上,其中可观察的随机性没有存储在数据库中-表达式是for object in self.stochastics | self.deterministics:,但我怀疑它也应该包括self.observable_stochastics,所以我需要将observable改为{},否则最后一行将抛出KeyError。在

我对pymc不太熟悉,无法确定它是实际的还是bug还是期望的行为,所以我把它留给您提交一个关于它的issue。在

相关问题 更多 >