Python与MATLAB不匹配

0 投票
1 回答
51 浏览
提问于 2025-04-14 17:55

我开始尝试把对数正态分布应用到我的数据上,但对结果有点怀疑。所以我用MATLAB重新检查了一下,结果完全不一样。在Python和MATLAB中,拟合的参数差得很远。于是我决定再做一个测试,把数据的对数进行正态分布拟合,结果让我惊讶的是,拟合的参数竟然一致。不过,当我试图通过dist.pdf(np.log(X))来获取它们对应的概率密度函数时,结果又不一样。我还在论坛上查了一下这个问题,发现scipy 0.9版本有个bug,但我已经把我的包升级到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

1 个回答

2

这里有一个简单的例子,展示了如何建立对应关系:

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 参数设置为零
  • 使用 logscale 参数,这个参数是通过 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)

撰写回答