Распределительная арматура Lognorm - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь подобрать распределение для lognorm, но полученный параметр кажется немного странным.Не могли бы вы показать мне мою ошибку или объяснить, если я неверно истолковал параметры.

import numpy as np
import scipy.stats as st

data = np.array([1050000, 1100000, 1230000, 1300000, 1450000, 1459785, 1654000, 1888000])
s, loc, scale = st.lognorm.fit(data)
#calculating the mean
lognorm_mean = st.lognorm.mean(s = s, loc = loc, scale = scale)

Полученное среднее значение: 945853602904015.8.
Но это не имеет никакого смысла.

Среднее значение должно быть:

data_ln = np.log(data)
ln_mean = np.mean(data_ln)
ln_std = np.std(data_ln)
mean = np.exp(ln_mean + np.power(ln_std, 2)/2)

Здесь полученное среднее значение равно 1391226,31.Это должно быть правильно.

Не могли бы вы помочь мне с этой темой?

С уважением
Norbi

1 Ответ

0 голосов
/ 30 сентября 2018

Я думаю, что вы можете настроить параметры минимизатора, чтобы получить приемлемый результат:

import numpy as np
import scipy.stats as st
from scipy.optimize import minimize

data = np.array([1050000, 1100000, 1230000, 1300000, 
                 1450000, 1459785, 1654000, 1888000])

def opti_wrap(fun, x0, args, disp=0, **kwargs):
    return minimize(fun, x0, args=args, method='SLSQP', 
                    tol=1e-12, options={'maxiter': 1000}).x

s, loc, scale = st.lognorm.fit(data, optimizer=opti_wrap)
lognorm_mean = st.lognorm.mean(s=s, loc=loc, scale=scale)
print(lognorm_mean)  # should give 1392684.4350

Причина, по которой вы видите странный результат, заключается в том, что минимизатор по умолчанию не может сходиться по результату максимального правдоподобия,Это может быть связано с неправильной функцией стоимости с таким небольшим количеством точек данных (вы пытаетесь уместить 3 параметра, но имеете только 8 точек данных ...).Примечание: я использую scipy версии 1.1.0.

...