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

Minimizing function by changing parameters using scipy

我想通过改变参数 B0、B1、B2、B3、T1、T2 来最小化下一个方程。变量 y 只是计算 objective 函数的另一个变量。 我只需要帮助通过更改参数来最小化该函数(用作 objective 函数),但我无法获得结果。我尝试使用 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的值。所以我需要的最小化函数是采用函数的 return 并通过调整参数来最小化错误的函数。所以也许错误是在设置 objective 函数时。

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

当我尝试最小化时得到错误相同且参数未更改的输出。 对此的任何帮助将不胜感激。提前致谢。

您的问题是将 (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 参数.

固定:

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