Python 和 MATLAB 不匹配

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

我已经开始将对数正态分布拟合到我的数据中,但我对得到的结果有点怀疑。于是,我用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
python matlab scipy statistics
1个回答
0
投票

这是一个 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)
© www.soinside.com 2019 - 2024. All rights reserved.