2017-01-30 3 views
0

Я подгоняю lognormal pdf для некоторых данных, но моя кривая не совсем соответствует данным, см. Изображение ниже. Мой код:Scipy lognorm fitting to histogram

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import lognorm 

data = genfromtxt('data.txt') 
data = np.sort(data) 

# plot histogram in log space 

ax.hist(data, bins=np.logspace(0,5,200),normed=1) 
ax.set_xscale("log") 

shape,loc,scale = lognorm.fit(data) 

print shape, loc, scale 

pdf = sp.stats.lognorm.pdf(data, shape, loc, scale) 

ax.plot(data,pdf) 

plt.show() 

Это то, что он выглядит следующим образом:

enter image description here

мне нужно каким-то образом обеспечить прилегание с разумными предположениями для формы, LOC и масштабировать ли?

Спасибо!

+1

(1) Разумные предположения всегда хороши для установки на MLE. (2) Было бы намного лучше, если бы вы предоставили свои данные или продемонстрировали воспроизводимый пример (3). Я не уверен, что думать о вашей pdf-выборке из '' 'data''' (особенно потому, что мы не знаем содержимое). Обычно вы должны использовать np.linspace() для создания некоторой сетки [например, в документах] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.lognorm.html). (4) И просто для того, чтобы убедиться, что matplotlib не представляет проблемы: я бы просто попробовал это без logscale (только для анализа, без большой надежды) – sascha

ответ

1

Данные, которые вы пытаетесь установить, не выглядят как логнормальное распределение. Логнормальное распределение при построении на логарифмической шкале x должно выглядеть как нормальное распределение. Это не так в сюжете, который вы показываете. Когда распределение не соответствует данным, вы получаете странные параметры.

Вам нужно будет выяснить, как ваши данные действительно распределены (что вне темы на SO), прежде чем пытаться что-то подделать.

Это то, что мы получаем при использовании данных случайным образом взяты из логарифмически нормального распределения:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import lognorm 

np.random.seed(42) 

data = lognorm.rvs(s=0.5, loc=1, scale=1000, size=1000) 

# plot histogram in log space 
ax = plt.subplot(111) 
ax.hist(data, bins=np.logspace(0,5,200),normed=1) 
ax.set_xscale("log") 

shape,loc,scale = lognorm.fit(data) 

x = np.logspace(0, 5, 200) 
pdf = lognorm.pdf(x, shape, loc, scale) 

ax.plot(x, pdf, 'r') 

plt.show() 

enter image description here

P.S. В следующий раз отправьте пример кода, который фактически запускается и не зависит от внешних данных - так называемый MCVE. О, и попытайтесь запустить его хотя бы один раз, чтобы выявить любые очевидные недостатки, такие как отсутствие определения ax :)