Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy、OOP和callables_Numpy_Oop_Scipy_Scipy.stats - Fatal编程技术网

Numpy、OOP和callables

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

我正在用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.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))