2024-04-19 23:06:33 发布
网友
我正在寻找泊松统计的逆pmf。通过逆我指的是返回分布参数lambda的函数inv_pmf(p, k)。为清楚起见,参数使用如下:p=lambda^k/k!*exp(-lambda)。 谢谢
inv_pmf(p, k)
所以你有概率p(k,λ)=λke-λ的方程!。你知道p和k但你想知道λ。从lhs和rhs取对数,得到简单的方程
p
k
λ
对数(p)=k*log(λ)-λ-对数(k!)
或
λ=k*log(λ)-log(p)-log(G(k+1)),其中G()是Gamma函数,在Python库中可用。您可以绘制RHS和LHS之间的差异,并看到它可以有多个解决方案。使用pythonfsolve函数,可以从非线性方程中求出根
G()
代码(Python 3.7、Anaconda、Windows 10 x64)
#%% import math import numpy as np import matplotlib.pyplot as plt def logrhs(p, k, λ): return k*np.log(λ) - math.log(p) - math.lgamma(k+1) def poissonPMF(k, λ): lp = k*np.log(λ) - λ - math.lgamma(k+1) return np.exp(lp) p = 0.2 k = 3.0 λλ = np.linspace(0.001, 10.0, 101) #%% rhs = logrhs(p, k, λλ) lhs = np.copy(λλ) pmf = poissonPMF(k, λλ) plt.plot(λλ, lhs - rhs, 'r') plt.plot(λλ, pmf, 'g') plt.show() # %% from scipy.optimize import fsolve def f(x): return x - logrhs(p, k, x) starting_guess = 4.0 λ = fsolve(f, starting_guess) print((λ, poissonPMF(k, λ))) starting_guess = 1.9 λ = fsolve(f, starting_guess) print((λ, poissonPMF(k, λ)))
例如,我使用k=3和p=0.2进行测试。对我来说,它打印了两个根
(array([3.90263215]), array([0.2])) (array([2.24859448]), array([0.2]))
并验证了概率确实等于0.2。图中显示红线在两个位置穿过0
所以你有概率p(k,λ)=λke-λ的方程!。你知道
p
和k
但你想知道λ
。从lhs和rhs取对数,得到简单的方程对数(p)=k*log(λ)-λ-对数(k!)
或
λ=k*log(λ)-log(p)-log(G(k+1)),其中
G()
是Gamma函数,在Python库中可用。您可以绘制RHS和LHS之间的差异,并看到它可以有多个解决方案。使用pythonfsolve函数,可以从非线性方程中求出根代码(Python 3.7、Anaconda、Windows 10 x64)
例如,我使用k=3和p=0.2进行测试。对我来说,它打印了两个根
并验证了概率确实等于0.2。图中显示红线在两个位置穿过0
相关问题 更多 >
编程相关推荐