Python与MATLAB不匹配
我开始尝试把对数正态分布应用到我的数据上,但对结果有点怀疑。所以我用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
参数设置为零 - 使用
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)