математическая оптимизация — подгонка 1000 выборок к нормальному распределению с использованием максимального правдоподобия в переполнении стека

У меня есть образец 5000 парных как

образец = {1,23, -4,67, 0,17, 1,25, 6,89, -2,03, …}

и хочу подогнать данные к параметрическим распределениям, таким как N (mu, sigma) или обобщенный студент t (loc, scale, DoF) …

У меня уже есть PDF-файлы этих распределений PDF_normal (mu, sigma) (x) и PDF_t (loc, scale, DoF) (x), и я могу рассчитать сумму логарифмов PDF-файлов для 5000 образцов для фиксированных параметров распределения.

Теперь я хочу использовать некоторые алгоритмы C ++ для решения задач нелинейной оптимизации, чтобы найти параметры (mu_max, sigma_max) или (loc_max, scale_max, DoF_max), которые дадут мне значения максимального логарифмического правдоподобия.

Проект R для статистических вычислений решает проблему в пакете MASS следующим образом:
.. Прямая оптимизация логарифмического правдоподобия выполняется с помощью Оптим. Расчетные стандартные ошибки взяты из наблюдаемой информационной матрицы, рассчитанной числовым приближением. Для одномерных задач используется метод Нелдера-Мида, а для многомерных задач — метод BFGS …

К сожалению, я не могу использовать решение R, но мне нужно найти решение в Microsoft VS2010 C ++, и я не хочу сам писать код оптимизации, и я не хочу смотреть на исходный код R и переписывать его для C ++. ..

Какие-нибудь предложения, где я могу найти быструю и хорошо проверенную реализацию BFGS (или подобную) для C ++?

Есть ли что-нибудь доступное в Boost, Intel MKL и т. Д.?

Спасибо за вашу помощь, Мэтт

1

Решение

Хорошо, мне не нужна оптимизация для MLE нормального распределения, потому что она может быть решена в закрытой форме, см. 1: http://de.wikipedia.org/wiki/Maximum-Likelihood-Methode

Но я хочу решить эту проблему для разных семейств дистрибутивов, где я знаю только PDF-файлы. Таким образом, мне все еще нужна хорошая реализация C ++ нелинейного решателя …

1

Другие решения

Все упомянутые вами дистрибутивы имеют очень мало параметров. Возможно, было бы более полезно сделать прямой метод Ньютона. Вы можете определить функцию логарифмического правдоподобия и ее градиент и гессиан (в отношении параметров, а не данных).

Когда вы решаете систему в конце, вы должны использовать факторизацию Холецкого или L D LT факторизация вместо исключения Гаусса. Вы будете знать все факторы с точностью примерно sqrt (машинный эпсилон), что составляет 10-7-иш на большинстве систем.

Более надежный способ получить факторизацию Холески по Гессиану, если она является суммой набора матриц ранга один, состоит в том, чтобы включить каждую новую матрицу ранга один в факторизацию Холецкого, используя последовательность вращений Гивенса. Это дает вам точность, близкую к машинному эпсилону, но примерно в два раза медленнее, чем формирование гессиана и последующая обработка факторизации Холецкого обычным способом.

Технология здесь достаточно проста, так что вы, вероятно, можете написать ее самостоятельно.

Мне сложно предложить вам универсальный программный пакет. Это отчасти потому, что у меня не было положительного опыта с библиотеками оптимизации C ++ других людей. В основном, тем не менее, написание метода Ньютона не так уж много работы, когда у вас есть код для оценки градиента и Гессиана, поэтому я действительно не почувствовал необходимости.

Тем не менее, вы можете посмотреть и посмотреть, что Проект COIN-OR должен предложить. Вы можете сэкономить время, используя автоматическое дифференцирование инструменты — (МОНЕТА-ИЛИ имеет один). Полагаю, я должен упомянуть, что я никогда не использовал для нелинейной оптимизации что-то из COIN-OR или инструмент автоматического дифференцирования.

0

По вопросам рекламы [email protected]