Python SciPy:从PMF生成自定义随机变量

Python SciPy:从PMF生成自定义随机变量,python,numpy,scipy,Python,Numpy,Scipy,我试图根据某种丑陋的分布,在Python中生成随机变量。我有一个关于PMF的显式表达式,但它涉及到一些产品,这使得获取和反转CDF变得不愉快(PMF的显式形式见下面的代码) 本质上,我试图在Python中通过其PMF定义一个随机变量,然后让内置代码完成从分布中采样的艰苦工作。如果RV的支撑是有限的,我知道怎么做,但这里的支撑是可数无限的 我目前试图按照@askewchan的建议运行的代码如下: 将scipy作为sp导入 将numpy作为np导入 x级发电机(sp.stats.rv_离散): de

我试图根据某种丑陋的分布,在Python中生成随机变量。我有一个关于PMF的显式表达式,但它涉及到一些产品,这使得获取和反转CDF变得不愉快(PMF的显式形式见下面的代码)

本质上,我试图在Python中通过其PMF定义一个随机变量,然后让内置代码完成从分布中采样的艰苦工作。如果RV的支撑是有限的,我知道怎么做,但这里的支撑是可数无限的

我目前试图按照@askewchan的建议运行的代码如下:

将scipy作为sp导入
将numpy作为np导入
x级发电机(sp.stats.rv_离散):
def_pmf(自身、k、参数):
num=np.arange(1+param,k+param,1)
denom=np.arange(3+2*param,k+3+2*param,1)
p=(2+参数)*(np.prod(num)/np.prod(denom))
返回p
pa_limit=limitrv_gen()
打印功率极限rvs(α,n=1)
但是,这会在运行时返回错误:

File "limiting_sim.py", line 42, in _pmf
    num = np.arange(1+param, k+param, 1)
TypeError: only length-1 arrays can be converted to Python scalars
基本上,似乎
np.arange()
列表在
def\u pmf()函数中不起作用。我不知道为什么。有人能在这里给我指点迷津吗

编辑1:通过提问澄清了一些问题,编辑反映在上面


编辑2:askewchan建议使用阶乘函数进行一个有趣的近似,但我正在寻找一个更精确的解决方案,比如我试图使用np.arange获得的解决方案

您应该能够子类化
rv_discrete
,如下所示:

class mydist_gen(rv_discrete):
    def _pmf(self, n, param):
        return yourpmf(n, param)
然后,您可以使用以下内容创建分发实例:

mydist = mydist_gen()
并生成具有以下内容的样本:

mydist.rvs(param, size=1000)
mydistp.rvs(1000)
或者,您可以使用以下内容创建冻结的分发对象:

mydistp = mydist(param)
并最终生成具有以下内容的样本:

mydist.rvs(param, size=1000)
mydistp.rvs(1000)

在您的示例中,这应该是可行的,因为
factorial
会自动广播。但是,如果alpha足够大,它可能会失败:

import scipy as sp
import numpy as np
from scipy.misc import factorial

class limitrv_gen(sp.stats.rv_discrete):
    def _pmf(self, k, alpha):
        #num = np.prod(np.arange(1+alpha, k+alpha))
        num = factorial(k+alpha-1) / factorial(alpha)
        #denom = np.prod(np.arange(3+2*alpha, k+3+2*alpha))
        denom = factorial(k + 2 + 2*alpha) / factorial(2 + 2*alpha)

        return (2+alpha) * num / denom

pa_limit = limitrv_gen()
alpha = 100
pa_limit.rvs(alpha, size=10)

“RV只取有限多个值,但我得到的分布可以取任意大的正值”中的“take”是什么意思?你的意思是pmf的参数数量不定吗?还是说总体中的元素没有上限?@askewchan:随机变量取任意大的值,pmf只有一个参数。换句话说,如果X是随机变量,那么对于任意大的k,P(X=k)>0。如果我理解正确,那么我认为这仅仅意味着
b=inf
,这实际上是
rv_discrete
的默认行为。我假设pmf的积分是有限的(和1)。@askewchan:谢谢。我想我要问的是如何准确地将pmf提供给rv_离散方法。如果我只有一个有限的值和概率列表,我知道如何做到这一点,但我不确定如何使它只适用于任意函数。如果这太简单,很抱歉…您会收到该错误,因为
pmf
必须能够接受
k
的数组,并返回
p
的相同形状的数组。如果你需要帮助的话,我会修改我的答案。这看起来肯定有用。但是出现了另一个问题。我会把它添加到主体中,但我还是投了更高的票。谢谢。也许如果你发布pmf的表格,我或其他人可以测试可能的解决方案。嗯。关于“仅长度为1的数组…”我仍然会遇到完全相同的错误。但是,如果它对您来说运行正常,那么我可能只是做了一些错误的事情。我会考虑一下。奇怪的是,这个错误几乎肯定是来自
np.arange
,我在解决方案中没有使用它。。。您对
alpha
使用了什么值(我是否正确地假设
alpha
是您的单个
param
?)有时,对于阶乘中的大值,我会得到一个错误,但对于长度为1的数组,则不会。你确定那不是来自
np.arange
?使用
scipy.special.gammaln
而不是
阶乘
,在末尾使用sum和exp,精度会高得多。