用SymPy求从均匀(0,1)到随机变量X的变换

2024-03-28 10:17:30 发布

您现在位置:Python中文网/ 问答频道 /正文

在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)

有没有可能换个图书馆?你知道吗


Tags: samplefromimportself表达式asstatsrandom
1条回答
网友
1楼 · 发布于 2024-03-28 10:17:30

一个问题是cdf是一个嵌套的分段对象。这些应该用piecewise_fold折叠起来。(旁白:你的p公式有一个浮点数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,这并不是说它有助于采样。你知道吗

相关问题 更多 >