我已经开始将对数正态分布拟合到我的数据中,但我对得到的结果有点怀疑。于是,我用MATLAB仔细检查了一下,发现了完全不同的结果。 Python 和 MATLAB 中的拟合参数彼此相差甚远。因此,我想做另一个测试,我将正态分布拟合到 np.log 数据中,令人惊讶的是拟合参数匹配,但不幸的是,一旦我尝试通过 dist.pdf(np.log(X)) 获取其相应的 pdf,它给出了我的结果不同。我也检查了论坛上的这个问题,发现 scipy 版本 0.9 中存在错误,但我已经将包升级到 1.11.4。因此,如果有人可以在这方面帮助我,我将不胜感激。
感谢所有回复
X = [3.5, 1.4, 1.4, 1.4, 3.5, 2.1, 1.4, 2.8, 3.5, 2.1, 3.5, 2.1, 5.6, 4.9]
Python:
from scipy.stats import lognorm, norm
import numpy as np
params = lognorm.fit(X)
(16.51366131539468, 1.3999999999999997, 4.788960501713848e-05)
dist = lognorm(*params)
dist.pdf(X)
array([9.32987767e-03, 3.12114067e+13, 3.12114067e+13, 3.12114067e+13,
9.32987767e-03, 2.91566052e-02, 3.12114067e+13, 1.42147170e-02,
9.32987767e-03, 2.91566052e-02, 9.32987767e-03, 2.91566052e-02,
4.53591043e-03, 5.48433565e-03])
norm.fit(np.log(X))
array([0.923, 0.463])
MATLAB
lognfit(X)
ans =
0.9232 0.4807
>> dist.pdf(ere)'
ans =
0.1875 0.2815 0.2815 0.2815 0.1875 0.3681 0.2815 0.2892 0.1875
0.3681 0.1875 0.3681 0.0372 0.0649
这是一个 MCVE,展示了如何进行对应:
import numpy as np
from scipy import stats
np.random.seed(123456)
law = stats.lognorm(s=1.2, loc=0., scale=np.exp(1))
data = law.rvs(3000)
p = stats.lognorm.fit(data, floc=0.)
# (1.1912036427424741, 0.0, 2.7432911737748293)
np.log(p[-1]) # 1.0091583578984649
stats.norm.fit(np.log(data))
# (1.0091583578984649, 1.1912036427424741)
所以基本上你需要两件事:
floc
参数修复为零log
的 scale
参数由 lognorm.fit
回归。用你的例子给出:
x = [3.5, 1.4, 1.4, 1.4, 3.5, 2.1, 1.4, 2.8, 3.5, 2.1, 3.5, 2.1, 5.6, 4.9]
p = stats.lognorm.fit(x, floc=0.)
# (0.4632376775596644, 0.0, 2.5172563962150667)
np.log(p[-1]) # 0.9231695767638068
stats.norm.fit(np.log(x))
# (0.923169576763807, 0.4632376775596644)