【问题标题】:Is there a method to do arithmetic with SciPy's random variables?有没有一种方法可以用 SciPy 的随机变量进行算术运算?
【发布时间】:2014-08-14 17:37:18
【问题描述】:

SciPy 的stats 模块具有“随机变量”类型的对象(他们称之为rv_frozen)。它可以很容易地绘制给定分布的随机变量的 cdf。这是一个非常简单的例子:

import scipy.stats as stats
n = stats.norm()
x = linspace(-3, 3)
y = n.cdf(x)
plot(x, y)

我想知道是否有一种方法可以对这些随机变量进行基本的算术运算。下面的例子是一厢情愿(它不起作用)。

du_list = [stats.randint(2, 5) for _ in xrange(100)]
du_avg = sum(du_list) / len(du_list)
x = linspace(0, 10)
y = du_avg.cdf(x)
plot(x, y)

这个一厢情愿的例子应该产生随机变量的累积分布函数图,它是 100 i.i.d. 的平均值。随机变量,每个都均匀分布在集合{2,3,4}

【问题讨论】:

    标签: python random scipy


    【解决方案1】:

    我意识到这有点晚了,但我想我会回答以防其他人将来需要这个。我最近需要相同的功能,甚至考虑扩展 scipy 的 rv_discrete 来实现它,但后来我找到了 PaCAL

    PaCAL 是一个 Python 软件包,用于对随机变量进行算术运算,它支持很多分布,包括连续分布。甚至有一些对双变量联合分布的支持。在 PyPI 上作为一个包提供。不过仅适用于 Python 2.x。

    编辑:PaCAL repo on Github 现在也支持 Python 3.x。

    【讨论】:

    • 嘿,谢谢!我会看看这个包。看起来很有希望。
    【解决方案2】:

    完全符合您描述的方法不存在。不同发行版的 cdf 都定义在 **/scipy/stats/distributions.py 源文件中。例如:

    玻尔兹曼分布 CDF(第 7675 行):

    def _cdf(self, x, lambda_, N):
        k = floor(x)
        return (1-exp(-lambda_*(k+1)))/(1-exp(-lambda_*N))
    

    您可以,估计 MLE,然后调用 cdf 方法,请参阅此示例:

    import scipy.stats as ss
    unknown=np.random.normal(loc=1.1, scale=2.0, size=100)
    Loc, Scale=ss.norm.fit_loc_scale(unknown) #making a MLE fit
    unknown_cdf=lambda x: ss.norm.cdf(x, loc=Loc, scale=Scale) #the cdf of the MLE to the data
    plt.plot(np.linspace(-10, 10), unknown_cdf(np.linspace(-10, 10)), '-')
    

    【讨论】:

      【解决方案3】:

      您可以手动计算。

      用 X 创建的随机变量作为 Xi 的总和,i 个随机变量均匀分布在 U(2,5)。对 X 创建的发行版进行采样以获取 pdf,并集成以获取 cdf。

      或者您可以尝试为这个问题找到一个分析解决方案。

      Irwin-Hall distribution 以及 Math-stackexchange 上的 related discussion

      【讨论】:

        猜你喜欢
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        相关资源
        最近更新 更多