2011-09-23 24 views
1

我使用Scipy的fmin search來計算分佈適合某些數據的可能性的對數。我使用FMIN來搜索最大化對數似然,像這樣的參數:(likelihood_calculator取數據和參數,並吐出似然值的每個數據點的數組)Scipy的fmin只支持inf,只有時

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

如果我們用可能爲0的參數開始搜索,則loglikelihood爲-inf,所以-sum爲inf。 FMIN應該運行從最初的參數了,而是它堅持對呼叫的最大數量的值,然後返回它:

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

我想這也許是與FMIN的處理INF中的一個問題,但如果我們刪除的可能性計算器和剛剛到手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,那麼與函數調用相同的錯誤行爲會繼續,但如果我們從不產生0可能性(因此也不產生任何infs)的參數開始,fmin就會正確工作。

的思考?謝謝!

更新:

如果有過導致在零參數廣闊的領域,我們可以把參數值到邊緣。如果參數接近邊緣,fmin將退出零點並開始搜索。例如, p = < 1 = Inf,則p = 0.99 fmin將起作用,但不是p = 0.95

回答

3

也許你的更新回答了這個問題。由於fmin使用下坡梯度算法,因此它會在最初的猜測附近搜索最陡下降的方向。如果你足夠深入到函數總是返回inf的參數區域,則該算法不能看到要去的方向。

+0

這似乎是它。因爲只有數組中的一些數據點會返回0(然後將整個'sum'設置爲'inf'),所以我將零設置爲「sys.float_info.min」,這對於該用例來說足夠精確。這意味着整個數據點陣列返回一個連貫的非''inf'' -sum(log(likelihood))',它有一個梯度'fmin'可以搜索 – jeffalstott