2015-07-14 8 views
4

У меня есть следующий код:Как исправить 'TypeError: hasattr(): имя атрибута должно быть строкой' error?

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(): Имя атрибута должно быть строка» ошибка со следующим следом:

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: Это все должно быть потому,

+0

Отсчет фрагмента трассировки не содержит этой ошибки. –

+0

@ Даниэль, я отправил неправильный случай, извините, я изменил его – paul

ответ

1

Я должен признать, что я не знаком с pymc, но изменить его на следующее по крайней мере, сделал запуск приложения:

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

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

Это, кажется, потому что вы были оборачивать все в Модель, которая является продолжением ObjectContainer, но так как вы прошли это список, MCMCfile_items в Container.py пытался присвоить индекс 4 в списке что-то с помощью replace, но синк e Model - ObjectContainer ему присвоен ключ 4 в его __dict__, вызывающий странный TypeError у вас есть. Удаление обертывания Model вызвало ошибку MCMC для правильного использования ListContainer.

Теперь, есть, вероятно, ошибка в Model.py на line 543, где наблюдаемые стохастик не хранятся в базе данных - это выражение for object in self.stochastics | self.deterministics:, но я подозреваю, что она должна включать в себя self.observable_stochastics тоже - так что мне нужно, чтобы изменить observable к False или последняя строка будет бросать KeyError.

Я не достаточно хорошо знаком с pymc, чтобы определить, является ли это на самом деле или ошибка или желаемое поведение, поэтому я оставляю это до вас, чтобы представить issue об этом.

+2

им жаль, но это неправильно, потому что наблюдается = False, означает, что вы не принимаете во внимание, что означает, что он не смотрит на стоимость (значение из выражения value = res) – paul

+0

Извините, но это как можно больше. Если 'mydist' имеет' наблюдаемый', установленный в 'True', вы получите« KeyError »при попытке извлечь его. – Raniz

0

Вам просто нужно определить res как Numpy массива:

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

Тогда вы получите ошибку здесь mcmc.trace('mydist') потому что mydist наблюдается данных, и, следовательно, не пробы. Вероятно, вы захотите построить другие переменные ...