【问题标题】:How to use `scipy.optimize.leastsq` to optimize in the joint least squares direction?如何使用`scipy.optimize.leastsq`在联合最小二乘方向进行优化?
【发布时间】:2016-09-07 18:05:22
【问题描述】:

我希望能够沿联合最小二乘方向的渐变移动。

我想我可以使用 scipy.optimize.leastsq (http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html) 来做到这一点。 (也许我错了,也许有更简单的方法可以做到这一点?)。

我很难理解要使用什么,以及如何在联合最小二乘方向上移动,同时仍在增加参数。

我需要做的是输入如下内容:

[1,0]

并且,让它沿着最小二乘方向移动,这意味着增加10 中的一个或两个值,但这样做是为了使平方值的总和尽可能小。

这意味着[1,0] 将增加到[1, <something barely greater than 0>],并最终达到[1,1]。此时,两个1 将以相同的速度增长。

我将如何编程?在我看来,scipy.optimize.leastsq 在这里很有用,但我不知道如何使用它?

谢谢。

【问题讨论】:

    标签: python numpy optimization scipy least-squares


    【解决方案1】:

    我认为您不需要scipy.optimize.leastsq,因为您的问题可以通过分析解决。在任何时刻,函数np.sum(x) 的梯度是2*x,其中x 是一个数组。所以,如果你想获得最小的增加,那么你必须增加梯度的最小分量,你可以找到np.argmin。这是一个简单的解决方案:

    def g(x):
        return np.array(2*x)
    
    x = np.array([1.,0.])
    for _ in range(200):
        eps = np.zeros_like(x)
        index = np.argmin(g(x))
        eps[index] = 0.01 #or whatever
        x += eps
        print(x)
    

    当多个索引具有相同的值时,np.argmin 返回第一个匹配项,因此您会遇到某些振荡,您可以尽量减少减少eps

    【讨论】:

    • 另外,在我看来np.armin 可以直接应用于x。因此,该行将是index = np.argmin(x)
    • ....但你只能这样做,因为函数的导数与原始函数单调相关,对吧?
    • 小心,原来的函数是一个标量:它的sum(x),而不是x。它的梯度是N维的。您可以这样做,因为梯度等于(乘以常数)函数的参数x
    猜你喜欢
    • 2014-09-05
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多