python - 如何使用 Mu 和 Sigma 在 Python 中获得对数正态分布?

标签 python statistics scipy

我一直试图得到 lognormal 的结果使用 Scipy 分发.我已经有了 Mu 和 Sigma,所以我不需要做任何其他准备工作。如果我需要更具体(并且我试图以我对统计数据的有限了解),我会说我正在寻找累积函数(Scipy 下的 cdf)。问题是我无法弄清楚如何仅使用 0-1 范围内的平均值和标准差来做到这一点(即返回的答案应该是 0-1 的值)。我也不确定应该使用 dist 中的哪种方法来获得答案。我已尝试阅读文档并查看 SO,但相关问题(如 thisthis )似乎没有提供我正在寻找的答案。

这是我正在使用的代码示例。谢谢。

from scipy.stats import lognorm
stddev = 0.859455801705594
mean = 0.418749176686875
total = 37
dist = lognorm.cdf(total,mean,stddev)

更新:

所以经过一些工作和一些研究,我走得更远了。但我仍然得到错误的答案。新代码如下。根据 R 和 Excel,结果应该是 .7434,但这显然不是正在发生的事情。有没有我遗漏的逻辑缺陷?

dist = lognorm([1.744],loc=2.0785)
dist.cdf(25)  # yields=0.96374596, expected=0.7434

更新 2: 产生正确 0.7434 结果的工作 lognorm 实现。

def lognorm(self,x,mu=0,sigma=1):
   a = (math.log(x) - mu)/math.sqrt(2*sigma**2)
   p = 0.5 + 0.5*math.erf(a)
   return p
lognorm(25,1.744,2.0785)
> 0.7434

最佳答案

我知道这有点晚了(差不多一年!),但我一直在对 scipy.stats 中的 lognorm 函数进行一些研究。很多人似乎对输入参数感到困惑,所以我希望能帮助这些人。上面的例子几乎是正确的,但我发现将平均值设置为位置(“loc”)参数很奇怪——这表明 cdf 或 pdf 在值大于平均值之前不会“起飞”。此外,均值和标准差参数应分别采用 exp(Ln(mean)) 和 Ln(StdDev) 的形式。

简单来说,参数就是(x, shape, loc, scale),参数定义如下:

loc - 没有等价物,它会从您的数据中减去,因此 0 成为数据范围的下确界。

scale - exp μ,其中 μ 是变量对数的平均值。 (拟合时,通常您会使用数据对数的样本均值。)

shape - 变量对数的标准差。

我和大多数人一样对这个功能感到沮丧,所以我分享我的解决方案。请小心,因为如果没有资源概要,解释就不是很清楚。

有关更多信息,我发现这些资源很有帮助:

这是一个示例,取自@serv-inc 的答案,发布在此页面 here:

import math
from scipy import stats

# standard deviation of normal distribution
sigma = 0.859455801705594
# mean of normal distribution
mu = 0.418749176686875
# hopefully, total is the value where you need the cdf
total = 37

frozen_lognorm = stats.lognorm(s=sigma, scale=math.exp(mu))
frozen_lognorm.cdf(total) # use whatever function and value you need here

关于python - 如何使用 Mu 和 Sigma 在 Python 中获得对数正态分布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8870982/

相关文章:

Python使用列表颜色制作 turtle 图形

python - 将 Bash 解析为 Python

python - 从 HTTPie 的请求中删除默认的 HTTP header

r - Newman 图的模块化聚类

python - 如何以有效的方式截断 numpy/scipy 指数分布?

Python Tesseract 段错误 11

algorithm - 如何计算两个字节数组之间的距离?

python - 如何使用 solve_ivp 通过精确点?

python - scikit-learn - HashingVectorizer 上的 Tfidf

python - 如何计算 1 的对数减去 python 中给定小数的指数