gpt4 book ai didi

python-3.x - 如何在 sympy 中表示不同的非数字符号?

转载 作者:行者123 更新时间:2023-12-04 09:43:22 25 4
gpt4 key购买 nike

我正在尝试在 Sympy 中表示一个微不足道的统计问题:

For a sample space S, there are 6 possible distinct outcomes a,b,c,d,e,f. We can define event A as having occurred if any of a,b,c have, and event B as having ocurred if any of b,c,d have. Given a probability mass function pmf defined over S, what is the probability of event A?



当尝试象征性地实现这一点时,我收到以下错误:
~/project/.envs/dev/lib/python3.6/site-packages/sympy/stats/frv.py in _test(self, elem)
164 elif val.is_Equality:
165 return val.lhs == val.rhs
--> 166 raise ValueError("Undecidable if %s" % str(val))
167
168 def __contains__(self, other):

ValueError: Undecidable if Eq(d, a) | Eq(d, b) | Eq(d, c)

该问题的实现方式如下,并对失败的代码行进行了注释:
from sympy import Eq, Function, symbols
from sympy.logic import Or
from sympy.sets import FiniteSet, Union
from sympy.stats import FiniteRV, P

# 1. Define a sample space S with outcomes: a,b,c,d,e,f; Define events A, B
A = FiniteSet(*symbols('a b c'))
B = FiniteSet(*symbols('b c d'))
S = Union(A, B, FiniteSet(*symbols('e f')))
display("Sample Space", S)

pmfFunc = Function("pmf")
pmfDict = {v: pmfFunc(v) for v in S}
X = FiniteRV('X', pmfDict)

a,b = symbols('a b')
# 2. P(X = a) = pmf(a)
display(P(Eq(X,a)))

# 3. A.as_relational(X) yields `(X=a) \lor (X=b) \lor (X=c)`
display(A.as_relational(X))

# 4. P(X = a \lor X = b) = pmf(a) + pmf(b)
# - Actual Output: ValueError: Undecidable if Eq(c, a) | Eq(c, b)
display(P(Or(Eq(X,a), Eq(X,b)))) # [FAILS]

# 5. P(A) = pmf(a) + pmf(b) + pmf(c)
# - Actual Output: ValueError: Undecidable if Eq(d, a) | Eq(d, b) | Eq(d, c)
display(P(A.as_relational(X))) # [FAILS]

我获得了高达 display(A.as_relational(X)) 的预期输出:

enter image description here

解释失败消息表明 Sympy 无法判断集合成员是不同的。用整数替换符号可以解决错误,我得到的输出类似于我想要的。
A = FiniteSet(1, 2, 3)
B = FiniteSet(2, 3, 4)
S = Union(A, B, FiniteSet(5, 6))

enter image description here

如果我没有误解库的错误或基本用途, 有没有办法告诉 Sympy 一组符号是完全不同的? 我试图用 Dummy 替换符号没有成功的实例,我也尝试利用 assumptions没有成功的模块:
facts = [Eq(a,b) if a is b else Not(Eq(a,b)) for a, b in itertools.product(S, S)]
with assuming(*facts):

我想避免混淆整数和符号形式之间的映射,因为当结果打印为 latex 时,用户错误可能不明显。我愿意在变通方法中承担一些负担(例如,因为它会维护 Dummy 实例的集合),但我还没有找到可接受的变通方法。

最佳答案

有趣的问题。也许可以通过 with assuming(Ne(a,b), ...): 来完成上下文,但我采取更务实的方法:用 cos(non-zero integer) 替换符号SymPy 可以轻松区分是否相等:

>>> reps = dict(zip(var('a:f'),(cos(i) for i in range(1,7))))
>>> ireps = {v:k for k,v in reps.items()}
>>> a,b,c,d,e,f = [reps[i] for i in var('a:f')]

然后删除您的 a, b = symbols...换行 display(x)display(x.subs(ireps)要得到
('Sample Space', FiniteSet(a, b, c, d, e, f))
(pmf(a),)
(Eq(X, a) | Eq(X, b) | Eq(X, c),)
(pmf(a) + pmf(b),)

(我使用 cos(int) 而不是 int 因为我不确定任何计算是否会导致两个元素相加,我想确保它们保持不同。)

另一种方法是定义一个派生自 Symbol 的常量类:
class con(Symbol):
def __hash__(self):
return id(self)
def __eq__(a,b):
if isinstance(b, con):
return a.name == b.name
_eval_Eq = __eq__

a,b,c,d,e,f=map(con,'abcdef')
display=lambda*x:print(x)

from sympy import Eq, Function, symbols
from sympy.logic import Or
from sympy.sets import FiniteSet, Union
from sympy.stats import FiniteRV, P

A = FiniteSet(a,b,c)
B = FiniteSet(b,c,d)
S = Union(A, B, FiniteSet(e,f))
pmfFunc = Function("pmf")
pmfDict = {v: pmfFunc(v) for v in S}
X = FiniteRV('X', pmfDict)
display("Sample Space", S)
display(P(Eq(X,a)))
display(A.as_relational(X))
display(P(Or(Eq(X,a), Eq(X,b))))
display(P(A.as_relational(X)))


('Sample Space', FiniteSet(a, b, c, d, e, f))
(pmf(a),)
(Eq(X, a) | Eq(X, b) | Eq(X, c),)
(pmf(a) + pmf(b),)
(pmf(a) + pmf(b) + pmf(c),)

关于python-3.x - 如何在 sympy 中表示不同的非数字符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62232835/

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