通过使用 scipy 更改参数来最小化函数



我想通过更改参数 B0、B1、B2、B3、T1、T2 来最小化下一个方程。变量 y 只是另一个用于计算目标函数的变量。 我只需要帮助通过更改参数来最小化该函数(用作目标函数(,但我无法获得结果。我尝试使用scipy,但没有更改参数。 通过运行函数,我得到了我想要的结果:

funcion_opt(B0, B1, B2, B3, T1, T2)
output:  64.30571361326217

但是当我进行最小化时,我得到下一个结果:

res = optimize.minimize(funcion_opt, parameters, args=(beta0, beta1, beta2, 
beta3, tau1, tau2))
output: funcion_opt() takes 6 positional arguments but 7 were given

我知道错误是引入参数的方式,我需要帮助的地方。对不起,如果还不够清楚。

我的问题的小例子:

y = np.array([98.494500, 97.828500, 97.610000, 97.314000, 97.014500, 
92.959000, 96.696222])
def objective(b0, b1, b2, b3, t1, t2):
return (y * b0 + b1) - ( y * b2 + b3) + t1 + t2
x0 = np.array([0.03, -0.03, 0, 0, 1, 1]) #Initial values of b0, b1...
result = minimize(objective, x0, args=(b0, b1, b2, b3, t1, t2))

我知道函数中的输入是错误的,常量的变量是 y,我想更改参数 b0、b1、b2、b3、t1、t2 的值。因此,我需要的最小化函数是获取函数返回并通过调整参数来最小化错误的函数。所以也许错误是在设置目标函数时。

这是一个虚拟函数,原来的是一个平方误差的总和。 之后,我需要通过更改返回 b0、b1、b2、b3、t1、t2 中的参数值来最小化 tat 函数,因为在函数中这些参数被设置为 。折扣因子无关紧要,我只需要如何将参数更改为最小化目标函数的参数:

当我尝试最小化时,得到错误相同且参数没有更改的输出。 任何这方面的帮助将不胜感激。提前谢谢。

您的问题是将(b0, b1, b2, b3, t1, t2)作为参数传递 - 这应该是 优化向量,因此应仅以初始x0的形式传递 (你做到了(。由于您从objective函数中删除了y,因此没有 需要args(用于传递优化的常量参数( 函数(。

这就是我认为在修复后使用objective函数应该是什么样子(我通过导入和所有内容完成了它,因此您无需修改即可运行它(

import numpy as np
from scipy.optimize import minimize
y = 10.0
def objective(b0, b1, b2, b3, t1, t2):
return (y * b0 + b1) - ( y * b2 + b3) + t1 + t2
def objective_proxy(x):
return objective(*x)
x0 = np.array([0.03, -0.03, 0, 0, 1, 1])
result = minimize(objective_proxy, x0)

当您使用原始函数(将y作为最后一个参数(尝试它时, 您现在可以在args中传递y,因为它是恒定的,结果会 看起来像这样:

y_value = np.array([98.494500, 97.828500, 97.610000, 97.314000, 97.014500, 
92.959000, 96.696222])
def function_opt(b0, b1, b2, b3, t1, t2, y):
...
...
return ...
def function_opt_proxy(x, y):
args = list(x) + [y]
return function_opt(*args)

x0 = np.array([0.03, -0.03, 0, 0, 1, 1]) #Initial values of b0, b1...
result = minimize(function_opt_proxy, x0, args=(y_value,)

请注意,我将y更改为y_value以避免function_opt参数。

固定:

我添加了代理函数,它负责将参数从可迭代参数扩展到单个参数。

最新更新