python中的多维非线性优化



我在基于Python的程序中有几个不同的块,每个块代表一个非线性函数f(x, l)x代表一个包含几个不同参数的类(此处标记为klm(。函数作用于这些参数。这些函数(这里称为ABC等(可以相互链接,这样我就可以得到之类的构造

x_0->A(l_1)->B(l_2)->C(l_3)->x_1

即我取一个初始类x_0,将其与特定值l_1一起放入A中,使用修改后的类x_A作为B中的输入,获得新的结果类x_B,以此类推,直到我得到x_1作为最终结果。当然,我也可以重复使用这些功能,创建类似的结构

x_0->A(l_1)->B(l_2)->A(l_3)->C(l_4)->x_1

由于所涉及的非线性,我无法改变这种安排的顺序
现在我的目标是优化类x中的一个(或多个,具体取决于我的目标(参数。我现在可以尝试改变所涉及的功能块的顺序、使用的功能块数量和附加参数l_n,但由于暴力强制的性质,这相当麻烦。此外,一旦输入参数klm中的一个或多个发生变化,我就必须重复该过程。

因此,Python中是否有可用的函数/方法可以在这里使用?

一个简短的例子可能是:

def function_A(x_0, l_0):
return x_0 * np.exp(-l_0)
def function_B(x_0, l_0):
return x_0 * np.cos(l_0)
def function_C(x_0, l_0):
return np.power(x_0, l_0)
def fit_functions(init_val, function_list, l_list):
cur_val = init_val
for i, elem in enumerate(function_list):
cur_val = elem(cur_val, l_list[i])
return cur_val
init_val = 1
ret_val = fit_functions(init_val, [function_A, function_C, function_B, function_A], [1.1, 2.4, 0.2, 1]) #Example call of fit_functions

现在我想最大化ret_val,同时使用1到5个功能块,包括function_Afunction_C。块的顺序和数量都不是固定的,理想情况下这应该取决于优化方法

优化函数有很多方法。在您的情况下,我建议重新考虑您的问题,并针对要使用的每个函数数量进行独立优化。换句话说,当只使用一个功能时,第一次优化,然后是2和3个,等等

对于这些优化中的每一个,都要优化与初始参数一起使用的函数的顺序/类型。也就是说:你想优化一个新函数,它考虑到要使用的函数序列(以浮点形式,因为优化算法通常在真实空间中工作(。

# exemple for 4 functions
def func_to_optimize(f1, f2, f3, f4, l1, l2, l3, l4):
# get what functions to use since f1, f2,... are floats
if f1 < 1:
f1func = function_A
elif f1 > 1 and f1 < 2:
f1func = function_B
# etc...
# since we want to maximize, you minimize the inverse
return 1 / function_to_fit([init_val, [f1func, f2func, f3func, f4func], [l1, l2, l3, l4])

然后,您可以使用scipy.optimize.miminime函数来计算该函数的最小值。该函数将是最"有效"的函数;标准";这样做的方法。如果不起作用,你也可以尝试寻找使用其他方法进行优化的更高级的模块(比如遗传算法等等(。

from scipy.optimize import minimize
minimize(func_to_optimize,   # function to optimize
[0, 0, 0, 0],       # initial guess, here it would correspond to 4 times function_A
args=[1.1, 2.4, 0.2, 1],  # the other "fixed args" of the function (here your l parameters)
bounds=[[0, 4]] * 4,  # the function arguments bounds. I.e.: if you have 5 different function to fit, bound each arguments that specify a function between 0 and 4.
)

最新更新