【问题标题】:Why are the optimized solutions different with scipy.optimize.minimize with small variations in initial guesses?为什么优化的解决方案与 scipy.optimize.minimize 不同,初始猜测的变化很小?
【发布时间】: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


【解决方案1】:

对于初始猜测和优化器找到的点之间的关系没有特别的保证。您甚至可以通过给出相同的初始猜测并使用不同的求解器方法来获得不同的 x 值。

要记住的一点是,您选择优化的功能有点奇怪。它使用“数据”的唯一方法是将其取幂并求和。这意味着它正在“折叠”论证中的许多潜在变化。 (例如,置换data 的值不会改变目标函数的值。)

换句话说,有许多不同的“数据”值会给出相同的结果,因此求解器有时会找到不同的值也就不足为奇了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2020-09-08
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    相关资源
    最近更新 更多