Scipyを使用して対数正規分布を近似しようとしています。以前にMatlabを使用してこれを実行しましたが、統計分析を超えてアプリケーションを拡張する必要があるため、Scipyで近似値を再現しようとしています。
以下は、データを適合させるために使用した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です。
版:
以下の回答に示されているように、障害はScipy0.9にあります。Scipy 11.0を使用して、Matlabからのmuとsigmaの結果を再現できます。
Scipyを更新する簡単な方法は次のとおりです。
pip install --upgrade Scipy
あなたがピップを持っていない場合(あなたはすべきです!):
sudo apt-get install pip