Итак, в моем текущем коде подбора кривой есть шаг, который использует scipy.stats для определения правильного распределения на основе данных,
distributions = [st.laplace, st.norm, st.expon, st.dweibull, st.invweibull, st.lognorm, st.uniform]
mles = []
for distribution in distributions:
pars = distribution.fit(data)
mle = distribution.nnlf(pars, data)
mles.append(mle)
results = [(distribution.name, mle) for distribution, mle in zip(distributions, mles)]
for dist in sorted(zip(distributions, mles), key=lambda d: d[1]):
print dist
best_fit = sorted(zip(distributions, mles), key=lambda d: d[1])[0]
print 'Best fit reached using {}, MLE value: {}'.format(best_fit[0].name, best_fit[1])
print [mod[0].name for mod in sorted(zip(distributions, mles), key=lambda d: d[1])]
Где данные - это список числовых значений. Пока что это отлично работает для подгонки одномодальных распределений, подтвержденных в скрипте, который случайным образом генерирует значения из случайных распределений и использует curve_fit для переопределения параметров.
Теперь я хотел бы сделать код способным обрабатывать бимодальные распределения, как в примере ниже:
Можно ли получить MLE для пары моделей из scipy.stats, чтобы определить, подходит ли конкретная пара распределений для данных?, Что-то вроде
distributions = [st.laplace, st.norm, st.expon, st.dweibull, st.invweibull, st.lognorm, st.uniform]
distributionPairs = [[modelA.name, modelB.name] for modelA in distributions for modelB in distributions]
и использовать эти пары, чтобы получить значение MLE этой пары распределений, соответствующих данным?