如何在Scipy中使用norm.fit()拟合对数正态分布数据

ars1skjm  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(97)

我试图使用Scipy.stats norm.fit()进行一些修改,以拟合对数正态分布的数据。我想验证使用Scipy.stats lognorm.fit()拟合数据的结果。结果出来只是类似,但它应该是相同的。(图片显示在下面的链接)
https://ibb.co/PxHWSNp
我使用norm.fit()来拟合对数正态分布数据的方法是,我在norm.fit()中引入log(x),然后将pdf除以x。我这样做的原因来自下面的两个公式。(对数正态分布pdf中唯一的区别是ln(x)和1/x项)有人能帮助我确定我做错了什么吗?
1.对数正态分布pdf:https://ibb.co/Zd9J17T
1.正态分布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-pearson 3分布拟合,因为我在任何库中都找不到log-pearson 3。

uwopmtnx

uwopmtnx1#

目前,您正在将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()')

字符串


的数据

相关问题