Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scipy.optimize.curve_拟合对初始猜测非常敏感_Python_Optimization_Scipy - Fatal编程技术网

Python scipy.optimize.curve_拟合对初始猜测非常敏感

Python scipy.optimize.curve_拟合对初始猜测非常敏感,python,optimization,scipy,Python,Optimization,Scipy,我有一个基本问题,关于我应该使用哪个优化函数。我有: 作为python函数实现的系统模型。这 函数接受一维数组并输出一维数组 数组,还需要一些参数(通常小于 10) 来自该函数且输入未知的噪声样本输出 参数 每个参数的上下限 我想要的是: 这是一个优化例程,允许我将上述所有内容都加入其中,并获得最佳拟合函数参数 我想将函数视为一个黑箱,因此不假设它是连续的 我很幸运地使用了scipy.optimize.curve\u fit函数,但是它似乎很容易受到初始猜测偏差的影响curve_fit也不允许

我有一个基本问题,关于我应该使用哪个优化函数。我有:

  • 作为python函数实现的系统模型。这 函数接受一维数组并输出一维数组 数组,还需要一些参数(通常小于 10)

  • 来自该函数且输入未知的噪声样本输出 参数

  • 每个参数的上下限

  • 我想要的是:

    这是一个优化例程,允许我将上述所有内容都加入其中,并获得最佳拟合函数参数

    我想将函数视为一个黑箱,因此不假设它是连续的

    我很幸运地使用了
    scipy.optimize.curve\u fit
    函数,但是它似乎很容易受到初始猜测偏差的影响
    curve_fit
    也不允许我提供输入的边界,我认为这将大大简化问题。下面是我在曲线拟合中使用的代码:

    import numpy as np
    from scipy import optimize
    
    def model(x, c, d):
        res = np.sqrt((d/2.0)**2 - (x-c)**2) + (d/2.0)
        res[np.isnan(res)] = 0
        return res
    
    x = np.arange(-1000, 1000, 200)
    y = model(x, 0, 250)
    y_noise = y + np.random.rand(len(y)) * 20 - 10
    
    popt, pcov = optimize.curve_fit(model, x, y_noise, (50, 200))
    
    上面的代码返回(50200)作为优化参数,这是错误的。如果我将初始猜测从(50200)更改为(49200),那么它返回的优化参数是(1.84747802247.18634951),这与(0250)的真实值足够接近

    在线研究似乎表明RBF或最小二乘法都可以帮助我。然而,我很难将我的问题设定为“最小化”

    如果能举一个用正确的函数调用上面的模型的例子,我将不胜感激,同时也希望能有更多的阅读资料来帮助我


    提前感谢。

    这在曲线拟合中不是问题,但通常使用数值优化技术。当优化非凸函数时,通常会导致次优局部极值。没有神奇的公式可以避免这种情况。正如@cel所说,没有神奇的子弹。您可能希望查看函数的外观。有时会有“好”的开始猜测,虽然与实际值相差甚远,但会沿着“容易”的路径启动函数,以获得正确答案。作为一个自我插入者,您可能会从我的回答中受益: