为Levenberg-Marquardt制定残留物

问题描述 投票:0回答:1

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

cost

使用Levenberg-Marquart方法和scipy.optimize.least_squares函数。但是我没有看到如何用残差来表示它,所以我可以使用这种方法。否则,我收到错误消息“当残差数小于变量数时,方法'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)

谢谢

python optimization scipy least-squares levenberg-marquardt
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.