Scipy's fmin только иногда вставляет информацию - PullRequest
1 голос
/ 24 сентября 2011

Я использую Scipy fmin search , чтобы вычислить журнал вероятности соответствия распределения некоторым данным.Я использую fmin для поиска параметров, которые максимизируют вероятность записи в журнале, например:

j = fmin(lambda p:-sum(log(likelihood_calculator(data, p))), array([1.5]), full_output=True)

(likelihood_calculator принимает данные и параметр и выплевывает массив значений вероятности для каждой точки данных.)

Если мы начнем этот поиск с параметра, который дает вероятность 0, логарифмическая вероятность равна -inf, поэтому -sum равен inf.fmin должен убежать от начального параметра, но вместо этого он придерживается этого значения для максимального количества вызовов, а затем возвращает его:

In [268]: print j
(array([ 1.5]), inf, 67, 200, 1)

Я подумал, что это, возможно, проблема с обработкой инфами fmin, ноесли мы удалим калькулятор вероятности и просто передадим 0 напрямую, мы получим лучшее поведение:

In [269]: i = fmin(lambda p: -sum(log(p)), array([0]), full_output=1)
Warning: Maximum number of function evaluations has been exceeded.

In [270]: i
Out[270]: (array([  3.16912650e+26]), -61.020668415892501, 100, 200, 1)

Такое же правильное поведение происходит, если мы используем массив нулей, если эти нули являются числами с плавающей запятой, или если мы используемfmin_bfgs.Такое же некорректное поведение при вызове функции продолжается, если мы используем fmin_bfgs, но fmin работает ПРАВИЛЬНО, если мы начнем с параметра, который не дает вероятности 0 (и, следовательно, любых инф).

Мысли?Спасибо!

Обновление:

Если есть широкая область параметров, которые приводят к нулям, мы можем сдвинуть значение параметра до края.Если параметр находится достаточно близко к краю, fmin выйдет из нулевой зоны и начнет поиск.Ex.p <1 = Inf, тогда при p = .99 фмин будет работать, но не при p = .95 </p>

1 Ответ

3 голосов
/ 24 сентября 2011

Возможно ваше обновление отвечает на вопрос.Поскольку fmin использует алгоритм градиента спуска, он ищет в окрестности первоначального предположения направление наискорейшего спуска.Если вы достаточно глубоко попали в область параметров, где функция всегда возвращает inf, тогда алгоритм не может увидеть, в каком направлении двигаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...