gpt4 book ai didi

python - scipy curve_fit 返回初始估计

转载 作者:行者123 更新时间:2023-12-01 01:51:14 26 4
gpt4 key购买 nike

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

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))

enter image description here

基于此,让我们为 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. ]

也就是说,即使我们的参数与我们的猜测有很大不同,拟合也是完美的。换句话说,如果我们可以自由选择 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))

enter image description here

这里我们注意到,最佳结果最终与我们提供的params猜测不同,但仍然在min_fit提供的范围内和 max_fit,并且仍然提供了良好的配合。

关于python - scipy curve_fit 返回初始估计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50700890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com