关于统计信息:Python中的对数正态分布 |
您所在的位置:网站首页 › python拟合对数函数 › 关于统计信息:Python中的对数正态分布 |
我在stackoverflow中看到了几个有关如何适合log-normal distribution的问题。 我仍然需要知道两个澄清。 我有一个样本数据,其对数遵循正态分布。 所以我可以使用scipy.stats.lognorm.fit(即log-normal distribution)拟合数据 拟合效果很好,并且还提供了标准偏差。 这是我的代码片段及其结果。 123456789sample = 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结果 12scatter for data is 0.186415047243 mean for data is 1.15731050926From the image you can clearly see that the mean is around 14.2, but what I get is 1.15??!!为什么会这样? clearly the log(mean) is also not near 14.2!! 在此帖子和此问题中,提到log(mean)是实际均值。 但是您可以从我上面的代码中看到,我获得的拟合度是使用sample = log(data),它似乎也很合适。 但是当我尝试 12sample = data pdf_fitted = stats.lognorm.pdf(x_fit,scatter,loc,np.log10(mean))适合似乎不起作用。 1)为什么平均值不是14.2? 2)如何绘制填充/绘制显示1 sigma置信区域的垂直线? 相关讨论 请发布可重复出现问题的部分数据或伪数据,以便我们测试您的示例代码。 filehosting.org/file/details/460413/test.txt这是带有数据的文本文件 您显示的平均值是log(mean),10。** 1.15731 = 14.36 @CTZhu感谢您的信息!但是我尝试了另一个平均值为14.1的样本,但得到了10**1.07为11.24的1.07 在stats.stackexchange.com上,您可能会对此问题有更多的关注。您会在那里找到更多可以回答此类问题的人。 您不应该执行sample = np.log10(data)(除非您尝试适应某种log-log-normal分布)。只需将data赋予stats.lognormal.fit()方法即可。另外,您可能希望在对fit()的调用中使用参数floc=0。 scipy.stats中分布的loc参数是纯翻译;它通常不用于对数正态分布。 @WarrenWeckesser当我按照您的建议进行操作时,我会得到更大的stddev。我想在log10(data)中显示图形并执行拟合。 lognorm.fit不可能吗?你说 I have a sample data, the logarithm of which follows a normal distribution. 假设data是包含样本的数组。使数据适合 使用scipy.stats.lognorm的对数正态分布,请使用: 1s, loc, scale = stats.lognorm.fit(data, floc=0)现在假设mu和sigma是 基本正态分布。获取这些值的估计值 为此,请使用: 12estimated_mu = np.log(scale) estimated_sigma = s(这些不是估计的均值和标准差 data中的样本。有关公式,请参见维基百科页面 对数正态分布的均值和方差以mu和sigma表示)。 要将直方图和PDF结合起来,可以使用例如 12345678import 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 这里。 1234567logdata = 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拟合的替代方法是使用log(data) 使用stats.norm.fit: 12logdata = np.log(data) estimated_mu, estimated_sigma = stats.norm.fit(logdata)相关问题: 使用Scipy与Matlab拟合对数正态分布 对数正态随机数,以高值为中心 相关讨论 现在,这是一种轻松的方式! 我从没想过使用norm.fit和使用log(data)可以完美地工作! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |