I'm trying to fit a surface model to a 3D data-set (x,y,z) using matplotlib.
Where z = f(x,y)
.
So, I'm going for the quadratic fitting with equation:
f(x,y) = ax^2+by^2+cxy+dx+ey+f
So far, I have successfully plotted the 3d-fitted-surface using least-square method using:
# best-fit quadratic curve
A = np.c_[np.ones(data.shape[0]), data[:,:2], np.prod(data[:,:2], axis=1), data[:,:2]**2]
C,_,_,_ = scipy.linalg.lstsq(A, data[:,2])
#evaluating on grid
Z = np.dot(np.c_[np.ones(XX.shape), XX, YY, XX*YY, XX**2, YY**2], C).reshape(X.shape)
But, how can I be able to print/get the fitted equation of the surface(with coefficient values) ?
I little help will be highly appreciated.
thank you.
According to the documentation of the function scipy.linalg.lstsq http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.linalg.lstsq.html the estimated coefficients should be stored in your variable C (the order corresponding to columns in A).
To print your equation with estimated coefficients showing 2 digits after decimal point:
print 'f(x,y) = {:.2f}x^2+{:.2f}y^2+{:.2f}xy+{:.2f}x+{:.2f}y+{:.2f}'.format(C[4],C[5],C[3],C[1],C[2],C[0])
or:
print 'f(x,y) = {4:.2f}x^2+{5:.2f}y^2+{3:.2f}xy+{1:.2f}x+{2:.2f}y+{0:.2f}'.format(*C)
By the way, libraries pandas
and statsmodels
can be very helpful for this kind of task (e.g. check Run an OLS regression with Pandas Data Frame )