我想使用Scipy拟合对数正态分布。我之前已经使用Matlab来完成它,但由于需要将应用程序扩展到统计分析之外,我正在试图在Scipy中重现拟合值。拟合对数正态分布使用Scipy与Matlab
下面是Matlab代码我用适合我的数据:
% Read input data (one value per line)
x = [];
fid = fopen(file_path, 'r'); % reading is default action for fopen
disp('Reading network degree data...');
if fid == -1
disp('[ERROR] Unable to open data file.')
else
while ~feof(fid)
[x] = [x fscanf(fid, '%f', [1])];
end
c = fclose(fid);
if c == 0
disp('File closed successfully.');
else
disp('[ERROR] There was a problem with closing the file.');
end
end
[f,xx] = ecdf(x);
y = 1-f;
parmhat = lognfit(x); % MLE estimate
mu = parmhat(1);
sigma = parmhat(2);
而这里的拟合图:
现在,这里是我的Python代码实现同样的目的:
import math
from scipy import stats
from statsmodels.distributions.empirical_distribution import ECDF
# The same input is read as a list in Python
ecdf_func = ECDF(degrees)
x = ecdf_func.x
ccdf = 1-ecdf_func.y
# Fit data
shape, loc, scale = stats.lognorm.fit(degrees, floc=0)
# Parameters
sigma = shape # standard deviation
mu = math.log(scale) # meanlog of the distribution
fit_ccdf = stats.lognorm.sf(x, [sigma], floc=1, scale=scale)
下面是使用Python代码的配合。
正如你看到的,代码两套能够产生良好的配合,至少在视觉上来讲的。
问题是估计参数mu和sigma存在巨大差异。
来自Matlab:mu = 1.62 sigma = 1.29。 Python:mu = 2.78 sigma = 1.74。
为什么会有这样的差异?
注意:我已经仔细检查过两套数据都是正确的,一样。分数相同,分布相同。
非常感谢您的帮助!提前致谢。
其他信息:
import scipy
import numpy
import statsmodels
scipy.__version__
'0.9.0'
numpy.__version__
'1.6.1'
statsmodels.__version__
'0.5.0.dev-1bbd4ca'
Matlab的版本是R2011b。
版:
正如下面的回答证明,故障在于SciPy的0.9。我能够使用Scipy 11.0从Matlab重现mu和sigma结果。
一个简单的方法来更新您的SciPy的是:
pip install --upgrade Scipy
如果你不具备PIP(你应该!):
sudo apt-get install pip
2013-03-26
Mike
+1
看看这两组数据点,它们看起来相当不同(例如,比较右下角蓝色圆圈的位置)。如果数据不相同,则没有理由认为适合。 –
2013-03-26 06:29:18
+0
两组数据*完全相同。我已经彻底检查过,以确保事实并非如此。这些图显示略有不同,因为我用来在Matlab中绘制的代码是非库代码。无论如何,要点是所拟合的数据完全相同,因此它们应该产生相同的平均值和标准偏差值。 –
2013-03-26 06:40:59
+0
我很抱歉,但我不买这个(除非情节是关闭的)。只是直观地比较两个图上最右边的点的横坐标,看看它们是*非常*不同。如果您肯定数据是相同的,请将它与您用于将其读入Python和MATLAB的代码一起包含它。 –
2013-03-26 06:44:34