对数分布拟合
Lognorm distribution fitting
我正在尝试进行对数范数分布拟合,但生成的参数似乎有点奇怪。如果我误解了参数,请告诉我我的错误或向我解释一下。
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。这应该是正确的。
你能帮我解决这个问题吗?
此致
诺比
我认为你可以调整最小化器的参数以获得可接受的结果:
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.
我正在尝试进行对数范数分布拟合,但生成的参数似乎有点奇怪。如果我误解了参数,请告诉我我的错误或向我解释一下。
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。这应该是正确的。
你能帮我解决这个问题吗?
此致
诺比
我认为你可以调整最小化器的参数以获得可接受的结果:
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.