--- SAMPLE ---
У меня есть набор данных (образец), который содержит 1 000 значений повреждений ( значения очень малы <1e-6 </strong>) в одномерном массиве ( см. Вложенный файл .json ).Кажется, что образец соответствует логнормальному распределению:
--- ПРОБЛЕМА И ЧТО Я УЖЕ ПРОБОВАЛ ---
Я пыталсяпредложения в этом посте Подгонка эмпирического распределения к теоретическому с помощью Scipy (Python)? и этого поста Scipy: логнормальное подгонка для соответствия моих данных логнормальным распределениемНи одна из этих работ.: (
Я всегда получаю что-то очень большое по оси Y следующим образом:
Вот код, который я использовалв Python (и файл data.json можно загрузить с здесь ):
from matplotlib import pyplot as plt
from scipy import stats as scistats
import json
with open("data.json", "r") as f:
sample = json.load(f) # load data: a 1000 * 1 array with many small values( < 1e-6)
fig, axis = plt.subplots() # initiate a figure
N, nbins, patches = axis.hist(sample, bins = 40) # plot sample by histogram
axis.ticklabel_format(style = 'sci', scilimits = (-3, 4), axis = 'x') # make X-axis to use scitific numbers
axis.set_xlabel("Value")
axis.set_ylabel("Count")
plt.show()
fig, axis = plt.subplots()
param = scistats.lognorm.fit(sample) # fit data by Lognormal distribution
pdf_fitted = scistats.lognorm.pdf(nbins, * param[: -2], loc = param[-2], scale = param[-1]) # prepare data for ploting fitted distribution
axis.plot(nbins, pdf_fitted) # draw fitted distribution on the same figure
plt.show()
Я пробовал другой вид дистрибутива, но когда я пытаюсьНарисуйте результат, ось Y всегда слишком велика, и я не могу построить с моей гистограммой. Где я потерпел неудачу ???
Я также попробовал предложение в моем другом вопросе: Используйте ненормальное распределение scipy для подгонки данных к небольшим значениям, а затем укажите в matplotlib . Но значение переменной pdf_fitted
всегда слишком велико.
--- ОЖИДАЕМЫЙ РЕЗУЛЬТАТ ---
По сути, я хочу вот что:
А вот код Matlab, который я использовал вскриншот выше:
fname = 'data.json';
sample = jsondecode(fileread(fname));
% fitting distribution
pd = fitdist(sample, 'lognormal')
% A combined command for plotting histogram and distribution
figure();
histfit(sample,40,"lognormal")
Так что, если у вас есть идея эквивалентной команды fitdist
и histfit
в Python / Scipy / Numpy / Matplotlib, пожалуйста, опубликуйте ее!
Большое спасибо!