【问题标题】:Lognorm distribution fitting对数分布拟合
【发布时间】:2019-03-05 03:09:28
【问题描述】:

我正在尝试拟合 lognorm 分布,但结果参数似乎有点奇怪。如果我误解了参数,请告诉我我的错误或向我解释。

import numpy as np
import scipy.stats as st

data = np.array([1050000, 1100000, 1230000, 1300000, 1450000, 1459785, 1654000, 1888000])
s, loc, scale = st.lognorm.fit(data)
#calculating the mean
lognorm_mean = st.lognorm.mean(s = s, loc = loc, scale = scale)

得到的平均值是:945853602904015.8。
但这没有任何意义。

平均值应该是:

data_ln = np.log(data)
ln_mean = np.mean(data_ln)
ln_std = np.std(data_ln)
mean = np.exp(ln_mean + np.power(ln_std, 2)/2)

这里得到的平均值是 1391226.31。这应该是正确的。

你能帮我解决这个问题吗?

最好的问候
诺比

【问题讨论】:

  • 对数正态的平均值是 $\exp(\mu + \sigma^2/2)$。
  • 是的。这就是我在第二部分中计算的内容。我不知道为什么我在第一部分没有得到相同的结果。

标签: python scipy statistics distribution data-fitting


【解决方案1】:

我认为您可以调整最小化器的参数以获得可接受的结果:

import numpy as np
import scipy.stats as st
from scipy.optimize import minimize

data = np.array([1050000, 1100000, 1230000, 1300000, 
                 1450000, 1459785, 1654000, 1888000])

def opti_wrap(fun, x0, args, disp=0, **kwargs):
    return minimize(fun, x0, args=args, method='SLSQP', 
                    tol=1e-12, options={'maxiter': 1000}).x

s, loc, scale = st.lognorm.fit(data, optimizer=opti_wrap)
lognorm_mean = st.lognorm.mean(s=s, loc=loc, scale=scale)
print(lognorm_mean)  # should give 1392684.4350

您看到奇怪结果的原因是默认最小化器未能收敛到最大似然结果。这可能是由于数据点太少的成本函数行为不当(您试图拟合 3 个参数但只有 8 个数据点......)。注意:我使用的是 scipy 1.1.0 版。

【讨论】:

  • 好的,谢谢。这很奇怪,因为如果我使用“R”,最大 MLE 方法对于相同的数据集工作得很好
猜你喜欢
  • 2023-03-13
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
相关资源
最近更新 更多