Numpy、OOP和callables
我正在用metropolis和barkes alphas实现一个用于数值积分的马尔可夫链Montecarlo。我创建了一个名为Numpy、OOP和callables,numpy,oop,scipy,scipy.stats,Numpy,Oop,Scipy,Scipy.stats,我正在用metropolis和barkes alphas实现一个用于数值积分的马尔可夫链Montecarlo。我创建了一个名为mcmccintegrator()的类。我已经加载了一些属性,其中一个是我们试图集成的函数(lambda)的pdf,名为g import numpy as np import scipy.stats as st class MCMCIntegrator: def __init__(self): self.g = lambda x: st.g
mcmccintegrator()
的类。我已经加载了一些属性,其中一个是我们试图集成的函数(lambda)的pdf,名为g
import numpy as np
import scipy.stats as st
class MCMCIntegrator:
def __init__(self):
self.g = lambda x: st.gamma.pdf(x, 0, 1, scale=1 / 1.23452676)*np.abs(np.cos(1.123454156))
self.size = 10000
self.std = 0.6
self.real_int = 0.06496359
这个类中还有其他方法,size
是类必须生成的样本的大小,std
是正常内核的标准偏差,几秒钟后您就会看到。real\u int
是我们积分的函数的1到2之间的积分值。我用R脚本生成了它。现在,我们来谈谈这个问题
def _chain(self, method=None):
"""
Markov chain heat-up with burn-in
:param method: Metrpolis or barker alpha
:return: np.array containing the sample
"""
old = 0
sample = np.zeros(int(self.size * 1.5))
i = 0
if method:
def alpha(a, b): return min(1, self.g(b) / self.g(a))
else:
def alpha(a, b): return self.g(b) / (self.g(a) + self.g(b))
while i != len(sample):
if new < 0:
new = st.norm(loc=old, scale=self.std).rvs()
alpha = alpha(old, new)
u = st.uniform.rvs()
if alpha > u:
sample[i] = new
old = new
i += 1
return np.array(sample)
alpha返回一个nnumpy.float,但我不知道它为什么说它不可调用。根据代码“早期”部分中的某些条件定义一个名为
alpha
的方法:
if method:
def alpha(a, b): return min(1, self.g(b) / self.g(a))
else:
def alpha(a, b): return self.g(b) / (self.g(a) + self.g(b))
然后在while
循环(代码的“稍后”部分)中,将此函数的返回值指定给名为alpha
的变量
由于这两个对象的名称相同,并且变量已在代码中稍后声明,在创建该变量后,函数未在任何地方重新声明,因此该变量将替换命名空间中的函数,现在您不能再调用alpha
,因为它已不再是函数
如果它不是程序逻辑的障碍(似乎不是),那么将变量重命名为其他好的名称就可以了。可调用函数类似于函数或方法,可以使用
foo(…)
语法。你认为alpha
应该是什么,你打算用这个表达式做什么?你alpha
被重新赋值,结果是调用函数....@juanpa.arrivillaga,我把变量名改成了al
,我也考虑过这个问题,但我不知道为什么它不起作用
if method:
def alpha(a, b): return min(1, self.g(b) / self.g(a))
else:
def alpha(a, b): return self.g(b) / (self.g(a) + self.g(b))