How to use leastsq function from scipy.optimize in python to fit both a straight line and a quadratic line to data sets x and y
How would i fit a straight line and a quadratic to the data set below using the leastsq function from scipy.optimize? I know how to use polyfit to do it. But i need to use leastsq function.
Here are the x and y data sets:
x: 1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7 y: 6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828
Can someone help me out please?
The leastsq() method finds the set of parameters that minimize the error function ( difference between yExperimental and yFit). I used a tuple to pass the parameters and lambda functions for the linear and quadratic fits.
leastsq starts from a first guess ( initial Tuple of parameters) and tries to minimize the error function. At the end, if leastsq succeeds, it returns the list of parameters that best fit the data. ( I printed to see it). I hope it works best regards
from scipy.optimize import leastsq import numpy as np import matplotlib.pyplot as plt def main(): # data provided x=np.array([1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7]) y=np.array([6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828]) # here, create lambda functions for Line, Quadratic fit # tpl is a tuple that contains the parameters of the fit funcLine=lambda tpl,x : tpl*x+tpl funcQuad=lambda tpl,x : tpl*x**2+tpl*x+tpl # func is going to be a placeholder for funcLine,funcQuad or whatever # function we would like to fit func=funcLine # ErrorFunc is the diference between the func and the y "experimental" data ErrorFunc=lambda tpl,x,y: func(tpl,x)-y #tplInitial contains the "first guess" of the parameters tplInitial1=(1.0,2.0) # leastsq finds the set of parameters in the tuple tpl that minimizes # ErrorFunc=yfit-yExperimental tplFinal1,success=leastsq(ErrorFunc,tplInitial1[:],args=(x,y)) print " linear fit ",tplFinal1 xx1=np.linspace(x.min(),x.max(),50) yy1=func(tplFinal1,xx1) #------------------------------------------------ # now the quadratic fit #------------------------------------------------- func=funcQuad tplInitial2=(1.0,2.0,3.0) tplFinal2,success=leastsq(ErrorFunc,tplInitial2[:],args=(x,y)) print "quadratic fit" ,tplFinal2 xx2=xx1 yy2=func(tplFinal2,xx2) plt.plot(xx1,yy1,'r-',x,y,'bo',xx2,yy2,'g-') plt.show() if __name__=="__main__": main()
Fitting data, import numpy as np from numpy import pi, r_ import matplotlib.pyplot as plt from Initial guess for the parameters p1, success = optimize.leastsq(errfunc, p0[:], 'y position', 'y fit')) ax = plt.axes() plt.text(0.8, 0.07, 'x freq : %.3f kHz \n y A clever use of the cost function can allow you to fit both set of data in The number of function calls. fvec. The function evaluated at the output. fjac. A permutation of the R matrix of a QR factorization of the final approximate Jacobian matrix, stored column wise. Together with ipvt, the covariance of the estimate can be approximated. ipvt
from scipy.optimize import leastsq import scipy as sc import numpy as np import matplotlib.pyplot as plt
with optimize.curve_fit the code is simpler, there is no need to define the residual(error) function.
fig, ax = plt.subplots () # data x=np.array([1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7]) y=np.array([6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828]) # modeling functions def funcLine(x, a,b): return a*x+b def funcQuad(x, a, b, c): return a*x**2+b*x+c # optimize constants for the linear function constantsLine, _ = sc.optimize.curve_fit (funcLine, x, y) X=np.linspace(x.min(),x.max(),50) Y1=funcLine(X, *constantsLine) # optimize constants for the quadratic function constantsQuad, _ = sc.optimize.curve_fit (funcQuad, x, y) Y2=funcQuad(X,*constantsQuad) plt.plot(X,Y1,'r-',label='linear approximation') plt.plot(x,y,'bo',label='data points') plt.plot(X,Y2,'g-', label='quadratic approximation') matplotlib.pylab.legend () ax.set_title("Nonlinear Least Square Problems", fontsize=18) plt.show()
scipy.stats.linregress, Use non-linear least squares to fit a function to data. scipy.optimize.leastsq. Minimize the sum of squares of a set of equations. Notes. Missing curve_fit is part of scipy.optimize and a wrapper for scipy.optimize.leastsq that overcomes its poor usability. Like leastsq, curve_fit internally uses a Levenburg-Marquardt gradient method (greedy algorithm) to minimise the objective function. Let us create some toy data: import numpy # Generate artificial data = straight line with a=0 and b=1
Here's a super simple example. Picture a paraboloid, so like a bowl with sides growing like a parabola. If we put the bottom at coordinates (x, y) = (a, b) and then minimize the height of the paraboloid over all values of x and y - we would expect the minimum to be x=a and y=b. Here's code that would do this.
import random from scipy.optimize import least_squares a, b = random.randint(1, 1000), random.randint(1, 1000) print("Expect", [a, b]) def f(args): x, y = args return (x-a)**2 + (y-b)**2 x0 = [-1, -3] result = least_squares(fun=f, x0=x0) print(result.x)
Modeling Data and Curve Fitting, While it offers many benefits over scipy.optimize.leastsq, using minimize() for method, lmfit also provides canonical definitions for many known line shapes Python functions into high-level fitting models with the Model class, and using We want to use this function to fit to data y(x) represented by the arrays y and x . I have a scatter plot composed of X and Y coordinates. I want to use the Least-Squares Fit to a Straight Line to obtain the line of best fit. The Least-Squares Fit to a Straight Line refers to: If(x_1,y_1),.(x_n,y_n) are measured pairs of data, then the best straight line is y = A + Bx. Here is my code in python:
How to do exponential and logarithmic curve fitting in Python, How do you fit an exponential function to data in Python? Use non-linear least squares to fit a function, f, to data. The model function, f (x, ). It must take the independent variable as the first argument and the parameters to fit as separate remaining arguments. xdata : An M-length sequence or an (k,M)-shaped array for functions with k predictors. The independent variable where the data is measured.
8. Curve Fitting, , a Model uses a model function – a function that is meant to calculate a model for some phenomenon – and then uses that to best match an array of supplied data. A clever use of the cost function can allow you to fit both set of data in one fit, using the same frequency. The idea is that you return, as a "cost" array, the concatenation of the costs of your two data sets for one choice of parameters. Thus the leastsq routine is optimizing both data sets at the same time.
7 Effective Methods for Fitting a Linear Model in Python, How to use leastsq function from scipy.optimize in python to fit both a straight line and a quadratic line to data sets x and y. 149 Views. 1. Votes. Use non-linear least squares to fit a function, f, to data. The model function, f (x, …). It must take the independent variable as the first argument and the parameters to fit as separate remaining arguments. The independent variable where the data is measured. Should usually be an M-length sequence or an (k,M)-shaped array for functions with