Я использую 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>