Scipy.stats 范数与对数范数

Scipy.stats norm vs lognorm

要使用 scipy.stats.norm 找到一个数字大于 x 的概率,您可以编写这样的函数 1-scipy.stats.norm(55.98,12.29).cdf(64) 返回 0.257 意味着给定平均值 55.98 和标准差 12.29,您的随机观察值大于 64 的概率为 25.7%?如果我想找到对数正态分布,我可以用 scipy.stats.lognorm 函数做同样的事情吗? 1-scipy.stats.lognorm(55.98,12.29).cdf(64) ?

您对正态分布的解释正确。

对于 lognorm,scipy 参数化有点奇怪。

假设 X 是一个正态分布的随机变量,其均值为 mu,std dev 为 sigma。 如果 Y 定义为 X = ln(Y),则 Y 服从对数正态分布。

要在 scipy 中表示 Y,您可以这样做:

from scipy.stats import lognorm
from math import exp

#using smaller numbers for this example
mu=1
sigma=2
X=norm(mu,sigma)
X.mean() #1.0
X.var() # 4.0

Y = lognorm(s=sigma,scale=exp(mu))
Y.mean() # 20.085536923187668
Y.var() #21623.037001313976

这产生与维基百科对数范数公式相同的结果:

  • mean = exp(mu + sigma^2/2)
  • 方差 = (exp(sigma^2)-1)(exp(2mu+sigma^2)

在 scipy 的所有情况下,.cdf(x) 方法给出随机变量小于或等于 x 的概率。