scipy python中的对数正态分布

fd3cxomn  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(248)

我已经在stackoverflow中看到了几个关于如何适合log-normal distribution的问题。仍然有两个澄清我需要知道。
我有一个样本数据,其对数服从正态分布。因此,我可以使用scipy.stats.lognorm.fit(即log-normal distribution)拟合数据。
拟合工作得很好,也给出了标准差。这是我的一段代码和结果。

import numpy as np
from scipy import stats

sample = np.log10(data) #taking the log10 of the data

scatter,loc,mean = stats.lognorm.fit(sample) #Gives the paramters of the fit 

x_fit = np.linspace(13.0,15.0,100)
pdf_fitted = stats.lognorm.pdf(x_fit,scatter,loc,mean) #Gives the PDF

print "scatter for data is %s" %scatter
print "mean of data is %s" %mean

x1c 0d1x结果

scatter for data is 0.186415047243
mean for data is 1.15731050926

为什么会这样?

THIS POSTTHIS QUESTION中,提到log(mean)是实际平均值。

但是你可以从我上面的代码中看到,我得到的fit是使用了一个**sample = log(data)**,它看起来也很适合。但是当我尝试

sample = data
pdf_fitted = stats.lognorm.pdf(x_fit,scatter,loc,np.log10(mean))

配合似乎不起作用。

1)为什么平均值不是14.2?
2)如何绘制填充/绘制显示1 sigma置信区间的垂直线?

uemypmqf

uemypmqf1#

你说
我有一个样本数据,其对数服从正态分布。
假设data是包含样本的数组。若要使用scipy.stats.lognorm将此数据拟合为对数正态分布,请用途:

s, loc, scale = stats.lognorm.fit(data, floc=0)

现在假设mu和sigma是基础正态分布的平均值和标准差。要从该拟合中获得这些值的估计值,请用途:

estimated_mu = np.log(scale)
estimated_sigma = s

(这些 * 不是 * data中样本的平均值和标准差的估计值。关于μ和σ形式的对数正态分布的平均值和方差的公式,请参见wikipedia page。)
要合并直方图和PDF,您可以使用,例如,

import matplotlib.pyplot as plt.

plt.hist(data, bins=50, normed=True, color='c', alpha=0.75)
xmin = data.min()
xmax = data.max()
x = np.linspace(xmin, xmax, 100)
pdf = stats.lognorm.pdf(x, s, scale=scale)
plt.plot(x, pdf, 'k')

如果你想查看数据的日志,你可以做如下的事情。注意这里使用的是 * 正态 * 分布的PDF。

logdata = np.log(data)
plt.hist(logdata, bins=40, normed=True, color='c', alpha=0.75)
xmin = logdata.min()
xmax = logdata.max()
x = np.linspace(xmin, xmax, 100)
pdf = stats.norm.pdf(x, loc=estimated_mu, scale=estimated_sigma)
plt.plot(x, pdf, 'k')

顺便说一下,使用stats.lognorm拟合的另一种方法是使用stats.norm.fit拟合log(data)

logdata = np.log(data)
estimated_mu, estimated_sigma = stats.norm.fit(logdata)

相关问题:

相关问题