繁体   English   中英

scipy curve_fit返回初始估计

[英]scipy curve_fit returns initial estimates

为了适合双曲函数,我尝试使用以下代码:

import numpy as np
from scipy.optimize import curve_fit

def hyperbola(x, s_1, s_2, o_x, o_y, c):
    # x > Input x values
    # s_1 > slope of line 1
    # s_2 > slope of line 2
    # o_x > x offset of crossing of asymptotes
    # o_y > y offset of crossing of asymptotes
    # c   > curvature of hyperbola

    b_2 = (s_1 + s_2) / 2
    b_1 = (s_2 - s_1) / 2

    return o_y + b_1 * (x - o_x) + b_2 * np.sqrt((x - o_x) ** 2 + c ** 2 / 4)

min_fit = np.array([-3.0, 0.0, -2.0, -10.0, 0.0])
max_fit = np.array([0.0, 3.0, 3.0, 0.0, 10.0])
guess = np.array([-2.5/3.0, 4/3.0, 1.0, -4.0, 0.5])

vars, covariance = curve_fit(f=hyperbola, xdata=n_step, ydata=n_mean, p0=guess, bounds=(min_fit, max_fit))

其中n_step和n_mean是较早生成的测量值。 该代码运行良好,并且未给出任何错误消息,但只返回了很小的变化即可得出初始猜测。 而且,协方差矩阵仅包含零。 我尝试以更好的初始猜测来做同样的拟合,但这没有任何影响。 此外,我以初始猜测作为输入绘制了完全相同的函数,这确实为我提供了一个接近于实际值的函数。 有人知道我在这里犯错了吗? 还是我使用错误的功能来使自己适应?

问题必须出在n_stepn_mean (当前未在问题中给出); 当尝试使用一些任意选择的输入参数来重现问题时,优化将按预期进行。 让我们尝试一下。

首先,让我们在给定参数空间中定义一些任意选择的输入参数,方法是

params = [-0.1, 2.95, -1, -5, 5]

让我们看看它是什么样的:

import matplotlib.pyplot as plt
xs = np.linspace(-30, 30, 100)
plt.plot(xs, hyperbola(xs, *params))

在此处输入图片说明

基于此,让我们通过以下方式为xdataydata定义一些相当粗略的输入:

xdata = np.linspace(-30, 30, 10)
ydata = hyperbola(xs, *params)

有了这些,让我们运行优化,看看是否匹配给定的参数:

vars, covariance = curve_fit(f=hyperbola, xdata=xdata, ydata=ydata, p0=guess, bounds=(min_fit, max_fit))
print(vars)  # [-0.1   2.95 -1.   -5.    5.  ]

也就是说,即使我们的params与我们的guess有很大不同,拟合也很完美。 换句话说,如果我们可以自由选择n_stepn_mean ,则该方法将按预期工作。

为了尝试稍微挑战一下优化,我们还可以尝试添加一些噪音:

np.random.seed(42)
xdata = np.linspace(-30, 30, 10)
ydata = hyperbola(xdata, *params) + np.random.normal(0, 10, size=len(xdata))
vars, covariance = curve_fit(f=hyperbola, xdata=xdata, ydata=ydata, p0=guess, bounds=(min_fit, max_fit))
print(vars)  #  [ -1.18173287e-01   2.84522636e+00  -1.57023215e+00  -6.90851334e-12   6.14480856e-08]
plt.plot(xdata, ydata, '.')
plt.plot(xs, hyperbola(xs, *vars))

在此处输入图片说明

在这里,我们注意到最佳结果最终与我们提供的paramsguess ,仍然在min_fitmax_fit提供的范围内,并且仍然提供了很好的契合度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM