2017-02-20 87 views
1

我想通過使用Simplex算法(scipy.optimize.fmin)的python實現來最小化卡方損失函數來擬合數據的4參數(a,g,N和k)模型。初步模擬表明每個參數的下列範圍:a = [5,50],g = [0.05,1.5],N = [5,200]和k = [0,0.05]。scipy.optimize.fmin(Simplex)如何處理與不同大小相關的參數?

看起來像scipy.optimize.fmin函數將參數視爲它們都在相同的範圍內(推測爲[0,1])。我應該重新調整它們嗎?下面是我的代碼:

#determine starting point (x0) for each parameter 
a = np.random.uniform(5,50) 
g = np.random.uniform(0.05, 1.5) 
N = np.random.uniform(5, 200) 
k = np.random.uniform(0, 0.05) 
x0 = np.array ([a, g, N, k]) #initial guess for SIMPLEX 

xopt = fmin (chis, x0, maxiter=1000)#call Simplex 
+0

'chis'函數是否自制?如果是這樣的話,我會通過使它們相對而不是絕對的來重新調整最小化的目標。我的意思是使用變化而不是差異。 – Kanak

+0

絕對的,chis功能是自制的。如有必要,我可以提供代碼。你可以再詳細一點嗎? 「你的意思是什麼」與變異一起工作? – user1363251

+0

是什麼讓你想出這個問題?例如,當最小化時你有什麼結果? – Kanak

回答

0

試想一下,你希望儘量減少以下雙變量函數

def to_min1((x,y)): 
    return abs(1e-15 - x) + abs(1e15 - y) 

即使這個例子是不現實的,它強調的重點。當然,fmin可能不在x(如果x0=0),因爲它已經非常接近於零。

從而得到具有優化程序中相同的權重目標,一個讓他們在變化的方面,而不是在差速器方面(與參數numerators避免ZeroDivisionError):

def to_min2((x,y)): 
    return abs(-1+x/1e-15) + abs(-1+y/1e15) 

注意這是一個ftol的擔憂,因爲通過這樣做,人們希望它的迭代重新計算在所有參數上被相等加權。

下面的內容並不完全回答你的問題,但是對於這個問題: scipy.optimize.fmin(Simplex)處理與不同大小相關的參數嗎?

顯然沒有,因爲

>>> fmin(to_min1, (0,0)) 
Optimization terminated successfully. 
     Current function value: 1000000000000000.000000 
     Iterations: 3 
     Function evaluations: 11 
array([ 0., 0.]) 

>>> fmin(to_min2, (0,0)) 
Optimization terminated successfully. 
     Current function value: 1.000000 
     Iterations: 118 
     Function evaluations: 213 
array([ 1.00000000e-15, 8.98437500e-05]) 

爲了確保Optimization沒有terminate successfully.,它可以通過增加fminmaxiter說法,等來完成...但這兩種情況顯然不是以同樣的方式管理的。

相關問題