gpt4 book ai didi

python - scipy.minimize——获取成本函数与迭代?

转载 作者:行者123 更新时间:2023-11-28 21:39:01 27 4
gpt4 key购买 nike

有没有办法在不使用回调和重新执行成本函数的情况下使用 scipy.minimize 在每次迭代的基础上访问成本函数?

options.disp 似乎打算这样做,但只会导致优化器打印终止消息。

最好将它打印到标准输出并使用 contextlib.redirect_stdoutio.StringIO 来收集它并在之后解析数据,但我不能找到一种在每次迭代中有效访问成本函数的方法。

最佳答案

方法least_squares使用参数 verbose=2 来做到这一点。然而,它不是通用的最小化器,它的目的是最小化给定函数的平方和。示例:

least_squares(lambda x: [x[0]*x[1]-6, x[0]+x[1]-5], [0, 0], verbose=2)

对于其他方法,如minimize,没有这样的选项。您可能不想使用回调并重新评估成本函数,而是希望向函数本身添加一些日志记录。例如,此处 fun 将计算值附加到全局变量 cost_values:

def fun(x):
c = x[0]**2 - 2*x[0] + x[1]**4
cost_values.append(c)
return c

cost_values = []
minimize(fun, [3, 2])
print(cost_values)

在这个例子中,每个迭代步骤都有 4 个相似的函数值,因为最小化算法环顾四周,计算近似的 Jacobian 和/或 Hessian。因此,print(cost_values[::4]) 将是每一步获取成本函数的一个值的方法。

但并不总是每步 4 个值(取决于维度和使用的方法)。所以最好使用回调函数来记录每一步后的成本。当前成本应存储在全局变量中,因此不必重新计算。

def fun(x):
global current_cost
current_cost = x[0]**2 - 2*x[0] + x[1]**4
return current_cost

def log_cost(x):
cost_values.append(current_cost)

cost_values = []
minimize(fun, [3, 2], callback=log_cost)
print(cost_values)

这打印

[3.5058199763814986, -0.2358850818406083, -0.56104822688320077, -0.88774448831043995, -0.96018358963745964, -0.98750765702936738, -0.99588975368993771, -0.99867208501468863, -0.99956795994852465, -0.99985981414137615, -0.99995446605426996, -0.99998521591611178, -0.99999519917089297, -0.99999844105574265, -0.99999949379700426, -0.99999983560485239, -0.99999994662329761, -0.99999998266175671]

关于python - scipy.minimize——获取成本函数与迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47381835/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com