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

时间:2018-10-16 13:33:57

标签: python numpy optimization scipy minimization

我想通过更改参数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函数,因为在函数中将这些参数设置为。折扣系数是无关紧要的,我只需要如何将参数更改为最小化目标函数的参数即可:

当我尝试最小化时,获得的输出是错误相同且参数未更改。 任何帮助,将不胜感激。预先感谢。

1 个答案:

答案 0 :(得分:0)

您的问题是将(b0, b1, b2, b3, t1, t2)作为参数传递-这应该是 优化向量,因此只能以初始x0的形式传递 (您所做的)。由于您从y函数中删除了objective,因此没有 需要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)时, 您现在可以在y中传递args,因为它是常数,结果会 看起来像这样:

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之间的混淆 参数。

已修复:

我添加了代理功能,可以将参数从可迭代的参数扩展到单个参数。