我正在使用dlib
' find_min_global
函数,这是一种优化算法,可帮助查找最小化函数输出的值。例如
import dlib
def holder_table(x0,x1):
return -abs(sin(x0)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))
x,y = dlib.find_min_global(holder_table,
[-10,-10], # Lower bound constraints on x0 and x1 respectively
[10,10], # Upper bound constraints on x0 and x1 respectively
80) # The number of times find_min_global() will call holder_table()
此处holder_table
函数返回需要针对x0
和x1
的不同值最小化的值。
此处holder_table
功能仅接受需要优化的值x0
和x1
。但是我想要使用dlib
函数的函数需要的时间超过x0
和x1
。定义的功能看起来像这样
def holder_table(a,b,x0,x1):
return -abs(sin(b*x0/a)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))
值a, b
不固定,是另一个函数的输出。现在,我可以在a, b
内直接调用函数返回holder_table
,但我不想最终重新计算它们,因为每次调用holder_table
a, b
都会重新计算 - 计算并且该过程耗时。
如何将a, b
传递给holder_table
函数?
答案 0 :(得分:1)
您的问题并非100%明确,但看起来您需要partial application。在Python中,这可以使用专用的functools.partial
对象完成,或者使用closure(使用内部函数或lambda)完成
def holder_table(a,b,x0,x1):
return -abs(sin(b*x0/a)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))
def main():
a, b = some_heavy_function(...)
holder_table_partial = lambda ax, ay: holder_table(a, b, ax, ay)
x, y = dlib.find_min_global(
holder_table_partial, [-10,-10], [10,10], 80
)
答案 1 :(得分:1)
仅根据您对规范的介绍,holder_table
是一个函数,它接受两个参数并返回可用于帮助指导优化步骤的最终结果。此外,如果我理解正确,a
和b
是目标公式的组成部分,但可能需要一段时间才能计算,并且您不希望更频繁地调用其逻辑的计算 - 所以包括他们在中的推导 holder_table
似乎效率低下。
如下:
def build_objective_function(a,b):
def holder_table(x0,x1):
return -abs(sin(b*x0/a)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))
return holder_table
你会这样称呼:
a = <compute a>
b = <compute b>
holder_table = build_objective_function(a,b) # holder_table will be a function
x,y = dlib.find_min_global(holder_table,
[-10,-10], # Lower bound constraints on x0 and x1 respectively
[10,10], # Upper bound constraints on x0 and x1 respectively
80) # The number of times find_min_global() will call holder_table()