2013-05-27 16 views
2

我想找到一個函數f(x)的局部最大值,其中x可以在兩個固定值之間的範圍,因爲如果x傾向於f(x)將傾向於+ inf + INF。我一直在嘗試使用scipy.optimize.fmin_l_bfgs_bscipy.optimize.fmin_tnc(來自scipy.ref指南)等算法,但我無法弄清楚如何正確設置邊界。 (我知道,它一定是一些愚蠢的東西,但對Python來說我是個不錯的選擇)。舉個簡單的例子:找到在Python中的界限函數的最大值

>>>import scipy.optimize as opt 
>>>import scipy 
>>>from numpy import * 

>>>def f (x): return x**(1/2.0) 
>>>max_x = opt.fmin_l_bfgs_b(lambda x: -f(x), [0,0], bounds=([0,0],[9,0])) #I want x to range between 0 and 9 and fmax be 3 

雖然輸出很奇怪,但我什麼也沒得到!甚至沒有錯誤!我錯過了什麼?

+1

是什麼'>>> max_x' 說? –

+0

請注意,根據文檔,max_x將是一個三元組......第三個元素也將提供一些關於進度的信息 –

+0

嘗試牛頓的多次函數導數的方法來找到函數的臨界點。其中一個關鍵點應該是最大的。這假定該功能足夠好。 –

回答

4

邊界論點是[(lower1,upper1),(lower2,upper2)],而不是[(lower1,lower2),(upper1,upper2)]。如果你看看你的結果(max_x),你會看到「錯誤:沒有可行的解決方案」,我猜測是因爲你的界限指定了一個空集。

這是調用該函數的正確方法。我假設平方根就是一個例子。我用-x ** 2代替。

import scipy.optimize as opt 
import scipy 
from numpy import * 
def f(x): 
    print x 
    return -x**(2) 

max_x = opt.fmin_l_bfgs_b(lambda x: -f(x), 1.0, bounds=[(-9,9)],approx_grad=True) 

因爲您沒有指定漸變函數,所以需要設置approx_grad = True。 1.0是我最初的猜測(儘管這個例子顯然爲零)。我添加了一個打印語句,以便每次調用該函數時都可以看到,但這通常不是必需的。有關調用fmin_l_bfgs_b的不同方法的更多詳細信息,請參閱here

在上面的代碼的結果:

[ 1.] 
[ 1.] 
[ 1.00000001] 
[-0.99999999] 
[-0.99999999] 
[-0.99999998] 
[ 0.001] 
[ 0.001] 
[ 0.00100001] 
[ -5.01108742e-09] 
[ -5.01108742e-09] 
[ 4.98891258e-09] 

而且MAX_X看起來是這樣的:

(array([ -5.01108742e-09]), 
array([ 2.51109971e-17]), 
{'funcalls': 4, 
    'grad': array([ -2.21748344e-11]), 
    'task': 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL', 
    'warnflag': 0}) 
+0

嗯,太棒了!你的代碼工作完美!其實,我對邊界論點有些懷疑,我以爲我嘗試了所有這些值之間的組合,但看起來好像我沒有!最後一個問題:我如何分別使用max_x結果中的fmin值?我的意思是,我想用fmin進行其他計算:比方說,將其乘以2(儘管如此,在您的示例中仍然爲零)。我可以這樣做嗎? – LorenzoLMP

+0

返回的值是一個稱爲元組的標準Python數據結構,它與列表類似,只是它不可變。如果你看看我的回答中的鏈接,在「回報」下面,你會看到三個標記的對象,x,f和d。這些對應於返回元組中的三個項目。您可以訪問鏈接文檔中標記爲「x」的第一個文件,名稱爲max_x [0]。請注意,它是一個numpy數組,而不是一個簡單的float。您可以用相同的方式獲取numpy數組的元素。例如,max_x [0] [0]是您(潛在多變量)最優點中的第一個元素。 – jcrudy

+0

這正是我的意思!非常感謝,真的! – LorenzoLMP

2

爲什麼使用多元最小化?嘗試scipy.optimize.fminbound

max_x = opt.fminbound(lambda x: -f(x), 0, 9) 
+0

說實話,我不知道這個特殊的功能! (scipy.optimize.fminbound)但是,它的工作原理也是如此:我會記住快速評估最小/最大值,謝謝! – LorenzoLMP

相關問題