【问题标题】:Formulate residual for Levenberg-Marquart为 Levenberg-Marquardt 制定残差
【发布时间】:2018-11-27 09:06:14
【问题描述】:

我想用表格最小化成本函数,

使用带有 scipy.optimize.least_squares 函数的 Levenberg-Marquart 方法。但是我看不到如何根据残差来制定它,以便我可以使用这种方法。否则我会收到错误消息“当残差数小于变量数时,方法 'lm' 不起作用。”

我的成本函数定义如下:

def canonical_cost(qv, t, A, B, C, delta, epsilon, lam):
    assert(type(qv) is np.ndarray and len(qv) == 4)
    # assert(type(t) is np.ndarray and len(t) == 3)

    q = Quaternion(*qv)
    qv, tv = qv.reshape(-1, 1), np.vstack(([0], t.reshape(-1, 1)))

    f1 = qv.T @ (A + B) @ qv
    f2 = tv.T @ C @ tv + delta @ tv + epsilon @ (q.Q.T @ q.W) @ tv
    qnorm = (1 - qv.T @ qv)**2
    return np.squeeze(f1 + f2 + lam*qnorm)

我尝试优化,

def cost(x):
    qv, t = x[:4], x[4:]
    return canonical_cost(qv, t, A, B, C, delta, epsilon, lam)

result = opt.least_squares(cost, initial_conditions, method='lm',
                               **kwargs)

谢谢

【问题讨论】:

  • 您必须从实际值 (f(x) - y) 中减去计算值,然后将该减法平方,并将其作为成本函数返回。我没有看到你在任何地方这样做。事实上,我在任何地方都看不到你的 y_i 值。
  • 也许你最好使用curve_fit:你可以直接输入测量值/实际值和成本函数。
  • 是的,这正是我的问题。我不知道实际值是多少。我的问题是看不出来能不能把上面的问题表述为回归问题,这样我就可以用LM方法了
  • 如果您没有任何实际的测量值,则无法执行回归。你只是想最小化/最大化一个函数吗?
  • 我不确定这是由于 LM 的 scipy API 还是算法本身,但是scipy 的 LM 方法不容易解决您的问题类型。我认为你最好坚持scipy.optimize.minimize,因为你是从需要最小化的功能开始的,而curve_fit等需要输入残差,这样它才能构建chi2以使其自身最小化。如果你真的想使用 LM,你将不得不构建一个函数,其 chi2 是你上面的函数。

标签: python optimization scipy least-squares levenberg-marquardt


【解决方案1】:

据我了解,LM 算法执行残差向量的平方和,并尝试最小化该值。我们需要相应地返回一个向量,以使该向量中元素的平方和最小化。并且要求这个残差向量的大小大于变量的数量是有道理的,因为它基本上意味着 unkno 的数量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多