python中的对数正态分布
我在stackoverflow中看到了几个关于如何拟合python中的对数正态分布,python,statistics,scipy,Python,Statistics,Scipy,我在stackoverflow中看到了几个关于如何拟合对数正态分布的问题。我仍然需要知道两个澄清 我有一个样本数据,它的对数服从正态分布。因此,我可以使用scipy.stats.lognorm.fit(即对数正态分布)来拟合数据 拟合效果很好,也给出了标准偏差。这是我的一段代码和结果 sample = np.log10(data) #taking the log10 of the data scatter,loc,mean = stats.lognorm.fit(sample) #Gives
对数正态分布的问题。我仍然需要知道两个澄清
我有一个样本数据,它的对数服从正态分布。因此,我可以使用scipy.stats.lognorm.fit
(即对数正态分布
)来拟合数据
拟合效果很好,也给出了标准偏差。这是我的一段代码和结果
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
结果
scatter for data is 0.186415047243
mean for data is 1.15731050926
从图像中,您可以清楚地看到平均值约为14.2,但我得到的是1.15代码>
为什么会这样很明显,对数(平均值)也不接近14.2代码>
中提到,log(平均值)
是实际平均值。
但是你可以从我上面的代码中看到,我得到的拟合是使用sample=log(data)
进行的,它似乎也很适合。但是当我试着
sample = data
pdf_fitted = stats.lognorm.pdf(x_fit,scatter,loc,np.log10(mean))
这种方法似乎不起作用
1)为什么平均数不是14.2?
2)如何绘制填充/绘制显示1西格玛置信域的垂直线?
我有一个样本数据,它的对数服从正态分布
假设data
是包含样本的数组。将此数据与
使用scipy.stats.lognorm
的对数正态分布,使用:
s, loc, scale = stats.lognorm.fit(data, floc=0)
现在假设mu和sigma是
基本正态分布。以获得这些值的估计值
根据此配合,使用:
estimated_mu = np.log(scale)
estimated_sigma = s
(这些不是平均值和标准偏差的估计值
数据中的示例。有关公式,请参阅
对于对数正态分布的均值和方差,以μ和σ表示。)
要组合直方图和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
在这里
顺便说一下,使用stats.lognorm
拟合的替代方法是拟合log(data)
使用stats.norm.fit
:
logdata = np.log(data)
estimated_mu, estimated_sigma = stats.norm.fit(logdata)
相关问题:
请发布复制问题的数据子集或伪数据,以便我们测试您的示例代码。这是一个包含数据的文本文件,显示的平均值为log(mean),10.**1.15731=14。36@CTZhu谢谢你的信息!但我尝试了另一个样本,平均值是14.1,但我得到了1.07
,其中10**1.07
是11.24
,你可能会在stats.stackexchange.com上对这个问题有更多的吸引力。你会发现那里有更多的人能回答像这样的问题。现在这是一种厚颜无耻的方式!我从未想过使用norm.fit
和日志(数据)
,效果非常好!
logdata = np.log(data)
estimated_mu, estimated_sigma = stats.norm.fit(logdata)