2014-02-14 40 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