我正在尝试使用 Scipy.statsnorm.fit() 进行一些修改,以适应对数正态分布的数据。我想通过使用 Scipy.stats lognorm.fit() 拟合数据来验证结果。结果看起来很相似,但应该是一样的。 (图片见以下链接)
我使用norm.fit()来拟合具有对数正态分布的数据的方法是,我在norm.fit()中引入log(x)并将pdf除以x。我这样做的原因来自以下两个公式。(对数正态分布 pdf 的唯一区别是 ln(x) 和 1/x 项)有人可以帮助我识别我做错的地方吗?
对数正态分布pdf:https://ibb.co/Zd9J17T
正态分布pdf:https://ibb.co/Mgvpv31
#x is set from the center of the leftmost bar to the center of the rightmost bar
x = np.linspace(left_boundary,right_boundary,1000)
#data1 is the original data
data2 = np.log(data1)
params1 = lognorm.fit(data1,method='MLE',loc=0)
plt.plot(x,lognorm.pdf(x,params1[0],params1[1],params1[2]),label='Log-Normal fitting using lognorm.fit()')
params2 = norm.fit(data2,method='MLE',loc=0)
# Here I bring in the log(x) and divide the pdf by x
plt.plot(x,norm.pdf(np.log(x),params2[0],params2[1])/x,label='Log-Normal fitting using norm.fit()')
我想这样做的原因是检查我是否可以复制相同的方式来导出 log-pearson3 分布拟合,因为我在任何库中都找不到 log-pearson3。谢谢你。
目前,您正在将
loc=0
传递到 lognorm.fit
。这提供了 loc
参数的 猜测,但您想使用
floc=0
将其固定为零。这将使您的两次拟合完全一致。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import lognorm, norm
# generate random data
rng = np.random.default_rng(845834582458345)
data1 = np.exp(rng.normal(size=100))
data2 = np.log(data1)
# generate abscissae for PDF
x = np.linspace(0, 10, 300)
# Fit the data using lognorm, fixing `loc` parameter to zero
params1 = lognorm.fit(data1, method='MLE', floc=0)
plt.plot(x, lognorm.pdf(x, *params1), '-',
label='Log-Normal fitting using lognorm.fit()')
params2 = norm.fit(data2, method='MLE',loc=0)
# Here I bring in the log(x) and divide the pdf by x
plt.plot(x, norm.pdf(np.log(x), *params2)/x, '--',
label='Log-Normal fitting using norm.fit()')