【发布时间】:2022-02-02 13:35:42
【问题描述】:
我正在编写需要优化的详细代码,我已经为 MWE 简化了这些代码。我试图找到arg_opt 的最佳值,以最小化从不同函数获得的值。
我认为这是一个简单的错误,或者我的理解是错误的。但是最终优化的解决方案不会独立于初始猜测(对于这种情况下的小变化)。对于这个 MWE,我得到相同的最小值,但 x 的最终值不同。我预计只有细微的差异,这种差异的根源是什么?
MWE
import numpy as np
from scipy import optimize
def fn_cubic(arg_1, arg_2, arg_3, data):
return (arg_1 ** 3 + arg_2 ** 2 + arg_3 + np.sum(np.exp(data))) / 100
arg_opt_1 = np.ones(shape=(3)) * 2
arg_opt_2 = np.ones(shape=(3)) * 3
data_original = [1, 5, 4, 10, 3, 9, 6, 3]
data = np.zeros(shape=len(data_original))
pos_data = np.array([1, 3, 2])
def function_to_optimize(arg_opt, arg_1, arg_2, arg_3):
for x, y in enumerate(arg_opt):
data[pos_data[x]] = data_original[pos_data[x]] * y
value = fn_cubic(arg_1, arg_2, arg_3, data)
return value
opt_sol_1 = optimize.minimize(function_to_optimize, arg_opt_1, args=(0.1, 0.2, 0.3))
opt_sol_2 = optimize.minimize(function_to_optimize, arg_opt_2, args=(0.1, 0.2, 0.3))
print(' 1:', opt_sol_1.x, '\n','2:', opt_sol_2.x)
输出
1: [-1.10240891e+03 -9.28714306e-01 -1.17584215e+02]
2: [-1.98936327e+03 -9.68415948e-01 -1.53438039e+03]
【问题讨论】:
-
你为什么要使用如此复杂的函数示例?如果您只是将 0.1、0.2、0.3 作为常量传递,则在“最小”示例中不需要这些。
-
Wrt
arg_opt_1&arg_opt_2是 2 和 3,这是唯一的区别:3 比 2 多 50%,2 比 3 少 33%。它在上下文中使用相同大小的数字 [1, 5, 4, 10, 3, 9, 6, 3]。然后,您使用三次函数使差异更大 - 类似于在伪随机数生成器中所做的,以使输入的微小差异导致输出大不相同。 -
@aneroid:三次函数是一个红鲱鱼。放入三次函数的值只是作为额外参数传递给优化器的常量 0.1、0.2 和 0.3。只有
data值(根据arg_opt计算得出)实际上会影响结果。 -
@BrenBarn 谢谢!是的,我现在重新看到,wrt 三次函数。真的只是
np.sum(np.exp(data))影响了输出。 -
@aneroid:是的,这个问题有很多无关紧要的东西,很难看出被优化的功能到底是什么。
标签: python optimization scipy minimization