具有custon函数的子类scipy的rv_continuous

时间:2018-11-15 14:47:37

标签: python numpy scipy

我正在尝试使用临时分发创建rv_continuous的子类。 我有一个pdf表达式,我想从中提取随机数。但是,我什至无法获得pdf图。我发布的代码表明,当我调用dist.pdf时,我会获得NaN,而调用dist._pdf会给我正确的答案(在我设置的范围内)。

这是一个简单的示例,打印函数应返回相同的输出,而最后一个仅给出NaN。我很确定我会以错误的方式将某些参数传递给dist.pdf,但我不是专家。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division, print_function
import numpy as np

# the actual function used to compute the pdf
def _schechter(M, alpha, phi, Mo):
    f = phi * 10.0**(0.4 * (alpha + 1) * (Mo - M))
    out = 0.4 * np.log(10.0) * np.exp(-10.0**(0.4 * (Mo - M))) * f
    return out

from scipy import stats
class sch(stats.rv_continuous):
    def _pdf(self, x, alpha, phi, Mo):
        return _schechter(x, alpha, phi, Mo)

# to normalize the distribution, it has to be limited on the right, b cannot be
# np.inf
dist = sch(name='schecter', b=0.)


x_real = np.linspace(-100, -1, 100)
print(_schechter(x_real , -1.4, 1., -21))
print(dist._pdf(x_real, alpha=-1.4, phi=1., Mo=-21))
print(dist.pdf(x_real, -1.4, 1., -21.))

有人可以帮助我吗? 非常感谢

2 个答案:

答案 0 :(得分:1)

我的问题很简单:如文档所述

如果对于您的RV,正参数检查不正确,则还需要重新定义_argcheck方法。

通过重新定义_argcheck函数,我可以使用它。

def _argcheck(self, *args):
    """Default check for correct values on args and keywords.
    Returns condition array of 1's where arguments are correct and
     0's where they are not.
    """
    cond = 1
    for arg in args:
        cond = np.logical_and(cond, (np.asarray(arg) > -np.inf))
    return cond

答案 1 :(得分:0)

@andrea dist.pdf具有以下参数。请检查文档字符串以获取更多信息。

my_photogalleries = models.ManyToManyField(Prem_PhotoGallery)
my_pdfs = models.ManyToManyField(Prem_PDF)
... etc ...