2014-10-16 7 views
5

Я видел несколько вопросов в stackoverflow относительно того, как установить log-normal distribution. Все еще есть два пояснения, которые мне нужны.Логарифмическое распределение в python

У меня есть образец данных, логарифм которого следует нормальному распределению. Поэтому я могу поместить данные, используя scipy.stats.lognorm.fit (т.е. log-normal distribution)

Подходит отлично, а также дает стандартное отклонение. Вот мой фрагмент кода с результатами.

sample = np.log10(data) #taking the log10 of the data 

scatter,loc,mean = stats.lognorm.fit(sample) #Gives the paramters of the fit 

x_fit = np.linspace(13.0,15.0,100) 
pdf_fitted = stats.lognorm.pdf(x_fit,scatter,loc,mean) #Gives the PDF 

print "scatter for data is %s" %scatter 
print "mean of data is %s" %mean 

enter image description here РЕЗУЛЬТАТ

scatter for data is 0.186415047243 
mean for data is 1.15731050926 

From the image you can clearly see that the mean is around 14.2, but what I get is 1.15??!! Почему это так? clearly the log(mean) is also not near 14.2!!

В THIS POST и THIS QUESTION упоминается, что log(mean) фактическое среднее.

Но вы можете видеть из моего кода выше, подгонка, что я получил использую в sample = log(data), и это также, кажется, хорошо подходит. Однако, когда я пробовал

sample = data 
pdf_fitted = stats.lognorm.pdf(x_fit,scatter,loc,np.log10(mean)) 

Подходит, похоже, не работает.

1) Почему среднее значение не равно 14,2?

2) Как нарисовать вертикальные линии для заполнения/рисования, показывающие область доверия 1 сигма?

+0

Пожалуйста, пост подмножества данных или поддельных данных, распространяющиеся проблема, чтобы мы могли проверить свой образец код. – BKay

+0

http://www.filehosting.org/file/details/460413/test.txt это текстовый файл с данными – ThePredator

+1

Среднее вы показываете log (среднее), 10. ** 1.15731 = 14.36 –

ответ

5

Вы говорите

У меня есть образец данных, логарифм которого соответствует нормальному распределению.

Предположим, что data - это массив, содержащий образцы. Чтобы установить эти данные распределение логнормальный с помощью scipy.stats.lognorm, использование:

s, loc, scale = stats.lognorm.fit(data, floc=0) 

Теперь предположим, что мю и сигма среднее и стандартное отклонение базового нормального распределения. Для того, чтобы получить оценку этих значений из этого подходят, используйте:

estimated_mu = np.log(scale) 
estimated_sigma = s 

(Это не на оценки среднего и стандартного отклонения образцов в data См wikipedia page для формул для. среднее и дисперсия лог-нормального распределения в терминах mu и sigma.)

Чтобы объединить гистограмму и PDF, вы можете использовать, например,

import matplotlib.pyplot as plt. 

plt.hist(data, bins=50, normed=True, color='c', alpha=0.75) 
xmin = data.min() 
xmax = data.max() 
x = np.linspace(xmin, xmax, 100) 
pdf = stats.lognorm.pdf(x, s, scale=scale) 
plt.plot(x, pdf, 'k') 

Если вы хотите увидеть журнал данных, вы могли бы сделать что-то вроде следующее. Обратите внимание, что в PDF-формате обычно используется .

logdata = np.log(data) 
plt.hist(logdata, bins=40, normed=True, color='c', alpha=0.75) 
xmin = logdata.min() 
xmax = logdata.max() 
x = np.linspace(xmin, xmax, 100) 
pdf = stats.norm.pdf(x, loc=estimated_mu, scale=estimated_sigma) 
plt.plot(x, pdf, 'k') 

Кстати, альтернативой фитинг с stats.lognorm чтобы соответствовать log(data) с помощью stats.norm.fit:

logdata = np.log(data) 
estimated_mu, estimated_sigma = stats.norm.fit(logdata) 

Похожие вопросы:

+1

Теперь это нахальный способ! Я никогда не думал использовать 'norm.fit' и использовать' log (data) ', отлично работает! – ThePredator

Смежные вопросы