我试图推导出离散分布的 CDF,其 PMF 由下式给出:
P(d)=log_10(1+1/d) for d=1,...,9
这是我派生 CDF 的代码:
import sympy
#Find the CDF
d=sympy.Symbol('d')
pmf=sympy.log((1+1/d),10)
CDF=sympy.Sum(pmf,(d,1,d))
print(CDF)
#compute the CDF
CDF=CDF.doit()
print(CDF)
#simplify the expression
CDF=CDF.simplify()
print(CDF)
这不会评估——它只是打印出总和:
Sum(log(1 + 1/d)/log(10), (d, 1, d))
Sum(log(1 + 1/d)/log(10), (d, 1, d))
Sum(log(1 + 1/d), (d, 1, d))/log(10)
我做错了什么?
你没有做错任何事。这应该有效:
In [83]: d = Symbol('d')
In [84]: CDF = Sum(log(1 + 1/d)/log(10), (d, 1, d))
In [85]: CDF
Out[85]:
d
_____
╲
╲
╲ ⎛ 1⎞
╲ log⎜1 + ─⎟
╱ ⎝ d⎠
╱ ──────────
╱ log(10)
╱
‾‾‾‾‾
d = 1
In [86]: CDF.doit()
Out[86]:
d
_____
╲
╲
╲ ⎛ 1⎞
╲ log⎜1 + ─⎟
╱ ⎝ d⎠
╱ ──────────
╱ log(10)
╱
‾‾‾‾‾
d = 1
不是因为Sum
不知道如何评估这个特定的总和。您可以用 代替d
来获得没有符号限制的总和的结果:
In [88]: CDF.subs(d, 5).doit()
Out[88]:
log(6/5) + log(5/4) + log(4/3) + log(3/2) + log(2)
──────────────────────────────────────────────────
log(10)
为了获得符号结果,我们可以将 the 转换Sum
为 aProduct
并获得doit
有效的结果。应该可以这样做,CDF.rewrite(Product)
但没有实现,所以这里有一种将Sum
a转换为 a Product
(使用exp.expand
)来评估结果的迂回方式:
In [95]: log(exp(CDF).expand().doit()).simplify()
Out[95]:
log(d + 1)
──────────
log(10)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句