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

问题描述 投票:0回答:1

我正在尝试使用 Scipy.statsnorm.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

  2. 正态分布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。谢谢你。

scipy normal-distribution data-fitting probability-density scipy.stats
1个回答
0
投票

目前,您正在将

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()')

© www.soinside.com 2019 - 2024. All rights reserved.