Python 的 Matlab 拟合非线性最小二乘法
Matlab fit NonlinearLeastSquares for Python
我为 Python 重写了用 Matlab 编写的代码,但我无法正确解析 Python 中的拟合函数。
Matlab 中的代码:
y = *Array 361x1*;
x = *Array 361x1*;
y1 = *Single value 1x1*;
x1 = *Single value 1x1*;
fo = fitoptions('Method','NonlinearLeastSquares','Lower',[-Inf,-Inf],'Upper',[Inf, Inf],'Startpoint',[0.0,0.0]);
ft = fittype( @(A,B, x) A.*x.^2 + B.*x + y1 - A.*x1.^2 - B.*x1, 'independent','x','dependent','y','options',fo);
[fitobject,gof,out] = fit(x,y,ft);
A = fitobject.A;
B = fitobject.B;
我通过 Scipy 最小二乘并基于 this article 尝试了 Python 中的解决方案。我写了下面的代码:
ft = least_squares(lambda coeffs: coeffs[0]*x**2 + coeffs[1]*x + y1 - coeffs[0]*x1**2 - coeffs[1]*x1, [0, 0], bounds=([-np.inf, -np.inf], [np.inf, np.inf]))
print(ft('x'))
显然它是不正确的(Python 代码中不考虑数组 y)并且我得到系数 A 和 B 的不同值。我已经尝试过不同的函数,如 curve%fit 等。但是没有结果...
您可以使用 scipy.optimize 的 curve_fit。假设 x
和 y
是 numpy.ndarrays 包含数据:
from scipy.optimize import curve_fit
def fitme(x, *coeffs_and_args):
A, B, x1, y1 = coeffs_and_args
return A*x**2 + B*x + y1 - A*x1**2 - B*x1
popt, pcov = curve_fit(lambda x, A, B: fitme(x, A, B, x1, y1), x, y)
然后数组 popt
包含参数的最优值和 pcov
popt
的估计协方差。
我为 Python 重写了用 Matlab 编写的代码,但我无法正确解析 Python 中的拟合函数。 Matlab 中的代码:
y = *Array 361x1*;
x = *Array 361x1*;
y1 = *Single value 1x1*;
x1 = *Single value 1x1*;
fo = fitoptions('Method','NonlinearLeastSquares','Lower',[-Inf,-Inf],'Upper',[Inf, Inf],'Startpoint',[0.0,0.0]);
ft = fittype( @(A,B, x) A.*x.^2 + B.*x + y1 - A.*x1.^2 - B.*x1, 'independent','x','dependent','y','options',fo);
[fitobject,gof,out] = fit(x,y,ft);
A = fitobject.A;
B = fitobject.B;
我通过 Scipy 最小二乘并基于 this article 尝试了 Python 中的解决方案。我写了下面的代码:
ft = least_squares(lambda coeffs: coeffs[0]*x**2 + coeffs[1]*x + y1 - coeffs[0]*x1**2 - coeffs[1]*x1, [0, 0], bounds=([-np.inf, -np.inf], [np.inf, np.inf]))
print(ft('x'))
显然它是不正确的(Python 代码中不考虑数组 y)并且我得到系数 A 和 B 的不同值。我已经尝试过不同的函数,如 curve%fit 等。但是没有结果...
您可以使用 scipy.optimize 的 curve_fit。假设 x
和 y
是 numpy.ndarrays 包含数据:
from scipy.optimize import curve_fit
def fitme(x, *coeffs_and_args):
A, B, x1, y1 = coeffs_and_args
return A*x**2 + B*x + y1 - A*x1**2 - B*x1
popt, pcov = curve_fit(lambda x, A, B: fitme(x, A, B, x1, y1), x, y)
然后数组 popt
包含参数的最优值和 pcov
popt
的估计协方差。