gpt4 book ai didi

python - 使用 SymPy 求从 Uniform(0, 1) 到随机变量 X 的变换

转载 作者:行者123 更新时间:2023-12-01 09:13:19 28 4
gpt4 key购买 nike

是否可以在 SymPy 中找到从 U(0, 1) 到 X 的变换表达式?

import sympy.stats as stat
import sympy as sp

x = sp.Symbol('x')
p = sp.Piecewise( (x + 1, (-1. <= x) & (x <= 0)), (1 - x, (x >= 0) & (x <=1 )), (0, True) )

X = stat.ContinuousRV(x, p, Interval(-1, 1))
cdf = stat.cdf(X)(x)

# Where to go from here?
stat.sample(X)
# TypeError: object of type 'ConditionSet' has no len()

sympy/stats/crv.py 中的示例

def sample(self):
172 """ A random realization from the distribution """
--> 173 icdf = self._inverse_cdf_expression()
174 return icdf(random.uniform(0, 1))

如何从自定义分段中找到逆 cdf 表达式?我手动得到:1 - sqrt(2-2u)

是否可以使用其他库?

最佳答案

一个问题是 cdf 是一个嵌套的 Piecewise 对象。这些应该用piecewise_fold折叠。 (旁白:您的 p 公式有一个 float 1。,我将其替换为 1 以使 SymPy 的工作更轻松。)

cdf = sp.piecewise_fold(cdf)
u = sp.Symbol('u', positive=True)
inv = sp.solveset(cdf - u, x, domain=sp.Interval(0, 1))

现在inv

Intersection(Interval.Ropen(0, 1), {-sqrt(2)*sqrt(-u + 1) + 1, sqrt(2)*sqrt(-u + 1) + 1})

不幸的是,SymPy 没有丢弃第二个解,它显然超出了区间 (0, 1)。但至少第一个是正确的。

您仍然无法将其用于stat.sample,因此任何采样都必须直接编码。抛开两点注意:

SymPy 并不是一个特别有效的采样工具,因为它是一项数值任务。在 NumPy 中,对这一特定(三角形)分布进行采样是一种单行:

>>> np.random.triangular(-1, 0, 1, size=(5,))
array([-0.40718329, 0.26692739, 0.84414925, 0.33518136, -0.7323011 ])

SymPy 还具有 Triangular内置,并不是说它有助于采样。

关于python - 使用 SymPy 求从 Uniform(0, 1) 到随机变量 X 的变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51465708/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com