在 Python 中定义自定义概率密度函数

计算科学 Python 统计数据 可能性
2021-12-01 20:16:11

有没有办法,使用一些已建立的 Python 包(例如 SciPy)来定义我自己的概率密度函数(没有任何先验数据,只是f(x)=ax+b),所以我可以用它进行计算(例如获得连续随机变量的方差)?当然,我可以使用 SymPy 或 Sage,创建一个符号函数并执行操作,但我想知道是否可以使用已经实现的包来​​代替自己完成所有这些工作。

2个回答

您必须在scipy.stats 中继承rv_continuous

import scipy.stats as st

class my_pdf(st.rv_continuous):
    def _pdf(self,x):
        return 3*x**2  # Normalized over its range, in this case [0,1]

my_cv = my_pdf(a=0, b=1, name='my_pdf')

现在 my_cv 是具有给定 PDF 和范围 [0,1] 的连续随机变量

请注意,在此示例中my_pdf,andmy_cv是任意名称(可以是任何名称),但不是_pdf任意名称它和其中一个方法必须被覆盖才能使子类化工作。_cdfst.rv_continuous

您应该查看 sympy.stats。它提供了一个处理随机变量的接口。下面的例子提供了一个X定义在单位区间上的随机变量,密度为2x

In [1]: from sympy.stats import *
In [2]: x = Symbol('x')
In [3]: X = ContinuousRV(x, 2*x, Interval(0, 1))

In [4]: P(X>.5) 
Out[4]: 0.750000000000000

In [5]: Var(X) # variance
Out[5]: 1/18

In [6]: E(2*cos(X)+X**2) # complex expressions are ok too
Out[6]: -7/2 + 4⋅cos(1) + 4⋅sin(1)

如果你有兴趣,这个抽象可以处理一些相当复杂的操作。