Python泊松统计有反概率质量函数吗?
Is there an inverse probability mass function for Poisson statistics in Python?
我正在寻找泊松统计的逆 pmf。 inverse 我的意思是 inv_pmf(p, k)
函数 returns 分布参数 lambda。为清楚起见,参数使用如下:p = lambda^k / k! * exp(-lambda)。
谢谢
所以你有概率方程 p(k,λ) = λk e-λ/k!。你知道 p
和 k
但想知道 λ
。好吧,从 lhs 和 rhs 取对数,得到简单的方程式。
log(p) = k*log(λ) - λ - log(k!)
或
λ = k*log(λ) - log(p) - log(G(k+1)),其中 G()
是 Gamma 函数,在 Python 库中可用.您可以绘制 RHS 和 LHS 之间的差异,并看到它可能有多个解决方案。他们使用 Python fsolve 函数,你可以从那个非线性方程中求根。
代码(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
我正在寻找泊松统计的逆 pmf。 inverse 我的意思是 inv_pmf(p, k)
函数 returns 分布参数 lambda。为清楚起见,参数使用如下:p = lambda^k / k! * exp(-lambda)。
谢谢
所以你有概率方程 p(k,λ) = λk e-λ/k!。你知道 p
和 k
但想知道 λ
。好吧,从 lhs 和 rhs 取对数,得到简单的方程式。
log(p) = k*log(λ) - λ - log(k!)
或
λ = k*log(λ) - log(p) - log(G(k+1)),其中 G()
是 Gamma 函数,在 Python 库中可用.您可以绘制 RHS 和 LHS 之间的差异,并看到它可能有多个解决方案。他们使用 Python fsolve 函数,你可以从那个非线性方程中求根。
代码(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