首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SciPy:从PMF生成自定义随机变量

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

Stack Overflow用户
提问于 2014-04-24 18:11:35
回答 1查看 2.2K关注 0票数 4

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

本质上,我试图通过它的PMF在Python中定义一个随机变量,然后通过内置代码完成从发行版取样的艰苦工作。如果RV的支持是有限的,我知道如何做到这一点,但是这里的支持是可数无限的。

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

代码语言:javascript
复制
import scipy as sp
import numpy as np

class x_gen(sp.stats.rv_discrete):
    def _pmf(self,k,param):
        num = np.arange(1+param, k+param, 1)
        denom = np.arange(3+2*param, k+3+2*param, 1)

        p = (2+param)*(np.prod(num)/np.prod(denom))

        return p

pa_limit = limitrv_gen()
print pa_limit.rvs(alpha,n=1)

但是,这将在运行时返回错误:

代码语言:javascript
复制
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 _pmf()函数中不起作用。我不知道为什么。有人能在这里启发我和/或指出一个解决办法吗?

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-04-24 18:41:06

您应该能够像这样对rv_discrete进行子类分类:

代码语言:javascript
复制
class mydist_gen(rv_discrete):
    def _pmf(self, n, param):
        return yourpmf(n, param)

然后,您可以使用以下内容创建一个分发实例:

代码语言:javascript
复制
mydist = mydist_gen()

并生成具有以下特征的样本:

代码语言:javascript
复制
mydist.rvs(param, size=1000)

或者,您可以使用以下方法创建一个冻结的分发对象:

代码语言:javascript
复制
mydistp = mydist(param)

并最终生成具有以下内容的样本:

代码语言:javascript
复制
mydistp.rvs(1000)

通过您的示例,这应该可以工作,因为factorial会自动广播。但是,对于足够大的alpha,它可能会失败。

代码语言:javascript
复制
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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23276631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档