Я пытаюсь воссоздать фикцию максимального правдоподобия, я уже могу это сделать в Matlab и R, но теперь я хочу использовать scipy. В частности, я хотел бы оценить параметры распределения Вейбулла для моего набора данных.
Я пробовал это:
import scipy.stats as s
import numpy as np
import matplotlib.pyplot as plt
def weib(x,n,a):
return (a / n) * (x / n)**(a - 1) * np.exp(-(x / n)**a)
data = np.loadtxt("stack_data.csv")
(loc, scale) = s.exponweib.fit_loc_scale(data, 1, 1)
print loc, scale
x = np.linspace(data.min(), data.max(), 1000)
plt.plot(x, weib(x, loc, scale))
plt.hist(data, data.max(), normed=True)
plt.show()
И получите следующее:
(2.5827280639441961, 3.4955032285727947)
И распределение, которое выглядит так:
Я использовал exponweib
после прочтения этого http://www.johndcook.com/distributions_scipy.html. Я также пробовал другие функции Вейбулла в scipy (на всякий случай!).
В Matlab (с использованием инструмента распределения по расписанию - см. снимок экрана) и в R (с использованием как библиотечной функции MASS fitdistr
, так и пакета GAMLSS) я получаю параметры (loc) и b (scale), похожие на 1.58463497 5.93030013. Я считаю, что все три метода используют метод максимального правдоподобия для установки распределения.
Я разместил свои данные здесь, если вы хотите, чтобы вы пошли! И для полноты я использую Python 2.7.5, Scipy 0.12.0, R 2.15.2 и Matlab 2012b.
Почему я получаю другой результат?