Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用Mu和Sigma获得对数正态分布?_Python_Statistics_Scipy - Fatal编程技术网

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

如何在Python中使用Mu和Sigma获得对数正态分布?,python,statistics,scipy,Python,Statistics,Scipy,我一直在尝试使用来获得分发的结果。我已经有了Mu和Sigma,所以我不需要做任何其他准备工作。如果我需要更具体一些(我正试图利用我有限的统计知识),我会说我在寻找累积函数(Scipy下的cdf)。问题是,我无法用0-1的平均值和标准偏差(即返回的答案应该是0-1)来计算。我也不确定应该使用dist中的哪种方法来获得答案。我试着阅读文档并仔细阅读,但是相关的问题(如和)似乎没有提供我想要的答案 LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE) 下面是我正在使用

我一直在尝试使用来获得分发的结果。我已经有了Mu和Sigma,所以我不需要做任何其他准备工作。如果我需要更具体一些(我正试图利用我有限的统计知识),我会说我在寻找累积函数(Scipy下的cdf)。问题是,我无法用0-1的平均值和标准偏差(即返回的答案应该是0-1)来计算。我也不确定应该使用dist中的哪种方法来获得答案。我试着阅读文档并仔细阅读,但是相关的问题(如和)似乎没有提供我想要的答案

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
下面是我正在使用的代码示例。谢谢

from scipy.stats import lognorm
stddev = 0.859455801705594
mean = 0.418749176686875
total = 37
dist = lognorm.cdf(total,mean,stddev)
LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
更新:

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
所以经过一点工作和一点研究,我得到了进一步的发展。但我还是得到了错误的答案。新代码如下。根据R和Excel,结果应该是.7434,但显然不是这样。我是否缺少一个逻辑缺陷

dist = lognorm([1.744],loc=2.0785)
dist.cdf(25)  # yields=0.96374596, expected=0.7434
LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
更新2: 工作日志规范执行,产生正确的0.7434结果

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
LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)

听起来您想从已知参数实例化一个“冻结”分布。在您的示例中,您可以执行以下操作:

from scipy.stats import lognorm
stddev = 0.859455801705594
mean = 0.418749176686875
dist=lognorm([stddev],loc=mean)
LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
这将为您提供一个对数范数分布对象,其中包含您指定的平均值和标准偏差。然后,您可以按如下方式获取pdf或cdf:

import numpy as np
import pylab as pl
x=np.linspace(0,6,200)
pl.plot(x,dist.pdf(x))
pl.plot(x,dist.cdf(x))
LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
这就是你的想法吗?

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

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
简言之,参数为(x、shape、loc、scale),参数定义如下:

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
loc-无等效值,从数据中减去该值,使0成为数据范围的下确界

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
scale-expμ,其中μ是变量对数的平均值。(拟合时,通常使用数据日志的样本平均值。)

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
形状-变量对数的标准偏差

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
我和大多数使用此功能的人一样经历了同样的挫折,因此我将分享我的解决方案。只是要小心,因为没有资源概要,解释不是很清楚

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
有关更多信息,我发现以下来源很有用:

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
下面是一个例子,摘自@serv inc的答案,发布在这个页面上

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)

更晚了,但万一对其他人有帮助:我发现Excel

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
提供与python相同的结果

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
from scipy.stats import lognorm
lognorm.cdf(x,sigma,0,mean)
同样,Excel的

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
LOGNORM.DIST(x,Ln(mean),standard_dev,FALSE)
似乎相当于Python的

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
from scipy.stats import lognorm
lognorm.pdf(x,sigma,0,mean).
完全掌握了用法。作为代码示例,您可以使用

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
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

如果你读了这篇文章,只想得到一个行为类似于R.中的
lnorm
的函数,那么就从愤怒中解脱出来,使用math import exp中的numpy的
numpy.random.lognormal


LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
从scipy导入统计信息 def lognorm_cdf(x,mu,sigma): 形状=西格玛 loc=0 比例=经验值(亩) 返回统计数据.lognorm.cdf(x,形状,位置,比例) x=25 mu=2.0785 西格玛=1.744 p=lognorm_cdf(x,mu,sigma)#产生预期的0.74341
与Excel和R类似,上面的lognorm_cdf函数使用μ和σ参数化对数正态分布的cdf

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
虽然SciPy使用形状、loc和尺度参数来描述其概率分布,但对于对数正态分布,我发现在变量水平上考虑这些参数比在分布水平上考虑这些参数要容易一些。这就是我的意思

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
对数正态变量X与正态变量Z的关系如下:

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
X = exp(mu + sigma * Z)              #Equation 1
X = exp(mu) * exp(Z-Z0)**sigma       #Equation 3
这与:

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
X = exp(mu) * exp(Z)**sigma          #Equation 2
这可以偷偷地重写如下:

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
X = exp(mu + sigma * Z)              #Equation 1
X = exp(mu) * exp(Z-Z0)**sigma       #Equation 3
式中,Z0=0。该方程的形式如下:

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
f(x) = a * ( (x-x0) ** b )           #Equation 4
如果你能在头脑中想象方程,那么应该清楚方程4中的比例、形状和位置参数分别是:a、b和x0。这意味着在方程3中,比例、形状和位置参数分别为:exp(mu)、sigma和零

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
如果你不能很清楚地想象出来,让我们将方程2改写为一个函数:

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
f(Z) = exp(mu) * exp(Z)**sigma      #(same as Equation 2)
然后看看μ和σ对f(Z)的影响。下图保持西格玛常数并改变μ。你应该看到μ垂直缩放f(Z)。然而,它是以非线性的方式进行的;mu从0变为1的效果比mu从1变为2的效果小。从方程2中我们可以看到exp(mu)实际上是线性比例因子。因此,SciPy的“规模”是exp(mu)

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)
下一个数字保持μ不变,并改变σ。你应该看到f(Z)的形状改变了。也就是说,当Z=0时,f(Z)有一个恒定值,σ影响f(Z)曲线离开水平轴的速度。因此,SciPy的“形状”是sigma

LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)

你能解释一下你对“分发结果”的理解吗?@joaquin我添加了一个代码示例,显示了我所拥有的以及我期望它产生的结果。@EricLubow:我想你可能误解了在这种情况下stddev的意思。对于对数正态分布,它们是变量对数的平均值和stddev。如果一个变量是对数正态分布的,这意味着该变量的对数是正态分布的。@Talonmes我知道使用平均值和stddev意味着使用l的平均值和stddev
LOGNORM.DIST(x,Ln(mean),standard_dev,TRUE)