我想让函数f(x) = b + a / x
适合我的数据集。为此,我发现来自optimize的scipyleastsquares
是合适的。在
我的代码如下:
x = np.asarray(range(20,401,20))
y
是我计算的距离,但它是一个长度为20的数组,例如这里只是随机数
参数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
如何拟合数据?在
弄清楚一点。有两个相关的问题:
模型与观测数据的拟合就是寻找一个模型的参数,使模型数据与观测数据之间的误差最小化。在
least_squares
方法只是最小化关于x
(x
可以是向量)的以下函数。在(
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
以最小化{因此,为了使用它来拟合模型与数据,必须在模型和实际数据之间构造一个误差函数-残差,然后最小化该残差函数。在您的情况下,您可以这样写:
结果是:
^{pr2}$print(res)
然而,作为一个残差函数(
res = observed_data - model_data
),在scipy.optimize
中有一个快捷方式叫做curve_fit
:curve_fit(func, xdata, ydata, x0)
。curve_fit
自动构建残差函数,您只需编写:相关问题 更多 >
编程相关推荐