2014-02-14 46 views
1

我試圖儘量減少(全球)使用公共變量3個功能,我想將它們組合成一個功能,並最大限度地減少使用L-BFGS-B(我需要設置變量邊界),但它已經證明很難平衡每個參數與權重,即當一個被最小化時,另一個不會。我還試圖用SLSQP方法,儘量減少其中的一個,同時設置其他作爲約束條件,但制約因素往往被忽略/不符合。 這裏有什麼需要儘量減少,所有的數學都在meritscalculationmeritoflength,meritofROC,,heightorderreturned作爲全局值從計算返回。蟒蛇優化多種功能與常見的變量

def lengthmerit(x0): 
    meritscalculation(x0) 
    print meritoflength 
    return meritoflength 

def ROCmerit(x0): 
    meritscalculation(x0) 
    print meritofROC 
    return meritofROC 

def proximitymerit(x0): 
    meritscalculation(x0) 
    print meritofproximity+heightorder 
    return meritofproximity+heightorder 

我希望所有的人都使用通用X0(含邊界)爲自變量,以儘量減少,是有辦法做到這一點?

回答

2

這是你想要做什麼?

minimize a * amerit(x) + b * bmerit(x) + c * cmerit(x) 
over a, b, c, x: 
    a + b + c = 1 
    a >= 0.1, b >= 0.1, c >= 0.1 (say) 
    x in xbounds 

如果x是說[x0 x1 .. x9],建立一個新的變量abcx = [a b c x0 x1 .. x9], 約束a + b + c = 1與懲罰項加入目標函數, 並儘量減少這樣的:

define fabc(abcx): 
    """ abcx = a, b, c, x 
     -> a * amerit(x) + ... + penalty 100 (a + b + c - 1)^2 
    """ 
    a, b, c, x = abcx[0], abcx[1], abcx[2], abcx[3:] # split 
    fa = a * amerit(x) 
    fb = b * bmerit(x) 
    fc = c * cmerit(x) 
    penalty = 100 * (a + b + c - 1) ** 2 # 100 ? 
    f = fa + fb + fc + penalty 
    print "fabc: %6.2g = %6.2g + %6.2g + %6.2g + %6.2g a b c: %6.2g %6.2g %6.2g" % (
       f, fa, fb, fc, penalty, a, b, c) 
    return f 

bounds = [[0.1, 0.5]] * 3 + xbounds,即每的a b c in 0.1 .. 0.5左右。
print S的關係告訴你爲什麼a b c方法0一個 - 可能的amerit() bmerit() cmerit()一個比別人更強壯? Plot s,而不是print s就容易了。

總結:
1)清楚地制定在紙上的問題,因爲在頂部
2)翻譯成蟒。

+0

是的,這就是我想做的事,所以這基本上是包括權重進入優化過程,讓計算機來平衡它,對嗎?而且每個'merit()'函數(粗略的爲1000)的順序也有很大的區別,這是如何影響a,b,c的界限的?它仍然是'[0.1,inf]'還是別的?無論如何,我現在正在測試這種方法,非常感謝你的努力,你一直是最有幫助的 – dilyar

0

這裏是一些縮放的結果和加權

目標函數:

merit_function=wa*meritoflength*1e3+wb*meritofROC+wc*meritofproximity+wd*heightorder*10+1000 * (wa+wb+wc+wd-1) ** 2 

輸入:

abcdex=np.array((0.5, 0.5, 0.1, 0.3, 0.1...)) 

輸出:

fun: array([ 7.79494644]) 

    x: array([ 4.00000000e-01, 2.50000000e-01, 1.00000000e-01, 
    2.50000000e-01...]) 


meritoflength : 0.00465499380753. #target 1e-5, usually start at 0.1 
meritofROC: 23.7317956542   #target ~1, range <33 
Heightorder: 0      #target :strictly 0, range <28 
meritofproximity : 0.0    #target:less than 0.02, range <0.052 

我後數實現運行時,所有的權重往往停留在邊界的最小值,並回到手動調整我開始的縮放問題。

是否有我的優化功能,心不是尋找真正的全球最小的可能性?

這是我如何最小化它:

minimizer_kwargs = {"method": "L-BFGS-B", "bounds": bnds, "tol":1e0 } 

ret = basinhopping(merit_function, abcdex, minimizer_kwargs=minimizer_kwargs, niter=10) 
zoom = ret['x'] 

res = minimize(merit_function, zoom, method = 'L-BFGS-B', bounds=bnds, tol=1e-6) 
+0

'tol = 1'?嘗試1e-4。仔細閱讀[basinhopping doc](http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.basinhopping.html):「爲了獲得最佳結果,T'應該與分離(在函數值)在局部最小值之間「 - 它可能對x0很敏感,也可能會逐步... ...。 「權重往往停留在界限的最小值」:它們必須總和爲1?否則會增加懲罰因子100. – denis

+0

我設置tol = 1的原因是掃描較低精度的較大域(或者它會浪費很多時間來儘量減少較大的值),然後我使用第二個「最小化」函數將第一次最小化所返回的最小值提高到更高的精度 – dilyar

+0

在高維問題中,使用具有未知參數的工具,不能期望在接近0的運行時間內具有良好的最小值。我建議從一個小問題開始,在那裏你知道一個答案,以獲得關於函數值/運行時權衡的一些經驗。 – denis