【问题标题】:Pass constant parameters to function when using scipy minimize on more than one parameter在多个参数上使用 scipy 最小化时将常量参数传递给函数
【发布时间】:2018-01-01 18:31:15
【问题描述】:

我有一个最小二乘误差函数(基于另一个函数),我想最小化(基本上是为了获得全局最小化的曲线拟合),它看起来像这样:

def err(a, b, X, Y):
    return np.sum((f(a, b, X)-Y)**2)

X 是对 f 进行评估的点数组,具体取决于参数 ab,而 YX 中定义的点的“基本事实” .

现在根据我在问题2520648231388319 中发现的语法应该如下:

Xc = np.array([1.0, 2.0, 3.0, 4.0, 5.0])   # points at which to evaluate error function
Yc = np.array([0.2, 0.4, 0.8, 0.12, 0.15]) # ground truth
g0 = np.array([1.0, 3.0])                  # initial guess for a and b    
res = scipy.optimize.minimize(err, g0, args=(Xc, Yc), method="Powell")

很遗憾,我收到以下错误消息:

TypeError: err() takes exactly 4 arguments (3 given)

如果我从元组中删除XcYc,给定的参数数量会减少,所以我怀疑它在g0 的定义中的某个位置,因为这似乎作为一个传递给err单个参数。

如果我有多个用于优化的参数以及要在优化期间传递给函数的其他“常量”参数,如何正确调用minimize

【问题讨论】:

  • 使用err(g0, Xc, Yc) 测试您的设置 - 将您的函数评估为初始猜测。如果失败,那么您需要更改 errargs 元组。

标签: python scipy


【解决方案1】:

minimize 只操作一个参数,但这可以是一个数组。你要做的是从err的第一个参数中提取ab

def err(p, X, Y):
    a, b = p
    return np.sum((f(a, b, X)-Y)**2)

【讨论】:

    【解决方案2】:

    我发现,如果我定义错误函数以使其使用参数列表而不是多个参数,则最小化是可行的:

    def err(p, X, Y):
        a = p[0]
        b = p[1]
        return np.sum((f(a, b, X)-Y)**2)
    

    然后拨打minimize:

    g0 = [1.0, 3.0]
    res = scipy.optimize.minimize(err, g0, args=(Xc, Yc), method="Powell")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 2019-07-03
      • 2016-04-02
      • 1970-01-01
      • 2019-03-21
      • 2016-07-22
      • 2020-05-01
      相关资源
      最近更新 更多