2016-06-21 64 views
0

發佈早了類似的問題,但太模糊,希望這清除了我的查詢:優化:尋找最佳投入

我有一個函數IVcal(rho,alpha,K),我想找到的rho的最佳值和alpha使得數據列表smiledata(對於不同的k爲函數的輸出),適合的纔是最好可以將數據列表calibrate

xaxis = np.linspace(0.006,0.036,20) 
calibrate = [calfun(K) for K in xaxis] 
smiledata = [IVcal(rho,alpha,K) for K in xaxis] 

的想法是,我想要的圖形plt.plot(xaxis,smiledata, 'b--')成接近一個適合圖形plt.plot(xaxis,calibrate, 'r--')儘可能多的g只有rhoalpha

我只是不確定如何去優化找到這些最優值。我想了解smiledatacalibrate之間的區別,並儘量減少,但我一直無法找到一個好辦法,特別是因爲我需要的是輸入值而不是輸出值。我很感激任何意見和道歉以前模糊。請讓我知道是否需要澄清。

+0

什麼是IVcal的公式(和calfun如果有的話)? – syntonym

+0

[登山](https://en.wikipedia.org/wiki/Hill_climbing)也許? – Delgan

+0

它們都是很長的公式,它涉及幾個以前定義的函數/表達式。我不認爲他們會相關,但如果你需要他們,我可以嘗試濃縮他們?如果你不介意我問,爲什麼你要他們?理想情況下,我會有一個更一般的方法,可以用於任何與smiledata相同長度的數據列表(calfun只是爲了說明我試圖近似以找到另一個數據集的「最佳擬合」) – Hall93

回答

1

約束

你可以嘗試使用scipy.optimize.leastsq

這是一種優化方法,旨在減少電流設定值和目標設定值之間的差異。

import scipy.optimize as opt 
import numpy as np 


def calfun(k): 
    """Example calibration function""" 
    return k * 2 * 4 

def IVcal(rho, alpha, k): 
    """Example test function""" 
    return rho * alpha * k 

def error_function(x0, **args): 
    """Calculates error between functions with current inputs""" 
    xaxis = np.linspace(0.006, 0.036, 20) 
    calibrate = np.array([calfun(K) for K in xaxis]) 
    smiledata = np.array([IVcal(x0[0], x0[1], K) for K in xaxis]) 

    # Get error between data 
    error = smiledata - calibrate 

    # Print square root of sum of errors 
    print np.sqrt(np.sum(error**2.0)) 

    return error 

# Initial guesses 
rho = 1 
alpha = 1 
x0 = np.array([rho, alpha]) 

# Run optimisation 
result = opt.leastsq(func=error_function, x0=x0)[0] 
print 'opt rho: ', result[0] 
print 'opt alpha: ', result[1] 

一些注意事項:

  • 優化的質量是非常依賴於你的初始條件!
  • list轉換的calibratesmiledata輸出到np.array允許你計算在兩個陣列各值之間的誤差,而無需通過列表
  • 只有在opt.leastsq的輸出中的第一個條目被取爲這是具有環您的優化變量
  • 印刷錯誤之和的平方根的陣列示出了優化器

約束的收斂

它看起來像從scipy版本17日起有最不受限版本平方稱爲scipy.optimize.least_squares

從上面的鏈接:獨立變量

的上限和下限。默認爲無界限。每個數組必須匹配x0的大小或是一個標量,在後一種情況下,所有變量的綁定都是相同的。使用np.inf和適當的符號來禁用所有或某些變量的邊界。

對於你的情況,我相信這將是

bounds = ([rho_lower, rho_higher],[-np.inf, np.inf]) 
+0

謝謝!忘了提及rho只意味着取值範圍內的值 - 是否可以限制其中一個輸入的域? – Hall93

+0

在答案中增加了一些信息。不能說我已經嘗試過,但我已經使用其他優化方法和邊界看起來類似 – Wokpak