拟合反比例函数

2024-10-03 21:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让函数f(x) = b + a / x适合我的数据集。为此,我发现来自optimize的scipyleastsquares是合适的。在

我的代码如下:

x = np.asarray(range(20,401,20))

y是我计算的距离,但它是一个长度为20的数组,例如这里只是随机数

^{pr2}$

参数a和b的初始猜测:

params = np.array([1,1])

最小化函数

def funcinv(x):
    return params[0]/x+params[1]

res = least_squares(funinv, params, args=(x, y))

给出的错误:

 return np.atleast_1d(fun(x, *args, **kwargs))

TypeError: funinv() takes 1 positional argument but 3 were given

如何拟合数据?在


Tags: 数据函数代码距离returnnpargsrange
1条回答
网友
1楼 · 发布于 2024-10-03 21:26:50

弄清楚一点。有两个相关的问题:

  1. 最小化函数
  2. 数据拟合模型

模型与观测数据的拟合就是寻找一个模型的参数,使模型数据与观测数据之间的误差最小化。在

least_squares方法只是最小化关于xx可以是向量)的以下函数。在

F(x) = 0.5 * sum(rho(f_i(x)**2), i = 0, ..., m - 1)

rho是一个损失函数,默认值是rho(x) = x,所以现在不要介意它)

least_squares(func, x0)期望对func(x)的调用将返回一个向量[a1, a2, a3, ...],该向量将计算平方和:S = 0.5 * (a1^2 + a2^2 + a3^2 + ...)。在

least_squares将调整x0以最小化{}。在

因此,为了使用它来拟合模型与数据,必须在模型和实际数据之间构造一个误差函数-残差,然后最小化该残差函数。在您的情况下,您可以这样写:

import numpy as np
from scipy.optimize import least_squares

x = np.asarray(range(20,401,20))
y = np.random.rand(20)
params = np.array([1,1])

def funcinv(x, a, b):
    return b + a/x

def residuals(params, x, data):
    # evaluates function given vector of params [a, b]
    # and return residuals: (observed_data - model_data)
    a, b = params
    func_eval = funcinv(x, a, b)
    return (data - func_eval)

res = least_squares(residuals, params, args=(x, y))

结果是: print(res)

^{pr2}$

然而,作为一个残差函数(res = observed_data - model_data),在scipy.optimize中有一个快捷方式叫做curve_fitcurve_fit(func, xdata, ydata, x0)curve_fit自动构建残差函数,您只需编写:

import numpy as np
from scipy.optimize import curve_fit

x = np.asarray(range(20,401,20))
y = np.random.rand(20)
params = np.array([1,1])

def funcinv(x, a, b):
    return b + a/x

res = curve_fit(funcinv, x, y, params)
print(res)  #  ... array([ 6.89518618,  0.37118815]), ...

相关问题 更多 >