最小化标量的应用

问题描述

我正在尝试使用不同的结构复制此处 (How to use scipy.optimize minimize_scalar when objective function has multiple arguments?) 发布的结果。目标完全相同,但我只想以不同的方式对其进行编码。这是我的代码

def mini(g,a,b,args):
  object=lambda w1: g(w1,*args)
  result=minimize_scalar(object,bounds=(a,b))
  minzer,minval=result.x,result.fun
  return minzer,minval

def errorr(w0,w1,x,y):
  y_pred = w0 + w1*x
  mse = ((y-y_pred)**2).mean()
  return mse

x = np.array([1,2,3])
y = np.array([52,54,56])
w0=50

mini(errorr,-5,5,(w0,y))

但是,使用我的代码获得的结果与原始帖子中的结果大不相同。我想知道我在代码中哪里犯了导致不同结果的错误。谢谢!

解决方法

由于您使用了 lambda w1: g(w1,*args),因此您正在最小化第一个函数参数 w0。要最小化 w1,您可以改写 lambda w1: g(args[0],w1,*args[1:])

但是,请避免将 python 关键字作为变量名(例如 object)。此外,lambda 函数是匿名函数,因此将其分配给变量与其目的相矛盾。因此,我建议

def mini(g,a,b,args):
    def obj_fun(w1): return g(args[0],*args[1:]) 
    result = minimize_scalar(obj_fun,bounds=(a,b))
    return result.x,result.fun

def mini(g,args):
    result = minimize_scalar(lambda w1: g(args[0],*args[1:]),result.fun