我正在尝试使用临时分发创建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.))
有人可以帮助我吗? 非常感谢
答案 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 ...