我定义了以下自定义概率分布:
import scipy.stats as st
# parameters
a = 3 / 16
b = 1
class linear_fractional(st.rv_discrete):
def _pdf(self, n):
if (n == 0):
return (a + b - 1) / (a + b)
else:
return (a * b ** (n - 1)) / (a + b) ** (n + 1)
LF = linear_fractional()
LF.rvs()
当我让脚本运行时,会收到一条很长的错误消息:
Traceback (most recent call last):
File "C:/Users/thoma/PycharmProjects/Host_Parasite_Coevolution/Asymptotics.py", line 17, in <module> LF.rvs()
File "C:\Users\thoma\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scipy\stats\_distn_infrastructure.py", line 2969, in rvs
return super(rv_discrete, self).rvs(*args, **kwargs)
...
RecursionError: maximum recursion depth exceeded while calling a Python object
如果我改为LF.mean()
,我得到
Fatal Python error: Cannot recover from stack overflow.
有人知道这是为什么吗?我如何解决这个问题?我必须定义概率分布的上界吗
根据the docs和this post给出的示例,该方法需要一些修改。重要的是,由于它是一个离散分布,因此应该使用
_pmf
而不是_pdf
。另外,_pmf
将被n
的numpy样式数组调用,而n == 0
的工作方式完全不同因为
(a * b ** (n - 1)) / (a + b) ** (n + 1)
等于(a + b - 1) / (a + b)
当n == 0
时,我们可以对所有n
使用第一个表达式。但是,当b
是整数且n = -1
时,numpy会生成错误。将b
与1.0
相乘会将其更改为浮点,numpy不会给出此类错误。如果多次使用相同的参数a
和b
,可能会生成冻结分布下面是一个示例,它创建生成样本的直方图,并将其与
pmf
进行比较LF.mean(a, b)
输出5.33333333333286
散点图是说明分布样本的另一种方法:
PS:当
b=1
时,此分布的公式等于geometric distribution加上p = a/(a+1)
并减去1。这要快得多,因为它完全是在numpy内部计算的相关问题 更多 >
编程相关推荐