我正在尝试推导出一个离散分布的 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)
为了获得一个符号结果,我们可以将Sum
转换为Product
,并具有有效的doit
。应该可以做CDF.rewrite(Product)
但尚未实现,因此这是一种将Sum
转换为Product
(使用exp.expand
(以评估结果的迂回方法:
In [95]: log(exp(CDF).expand().doit()).simplify()
Out[95]:
log(d + 1)
──────────
log(10)