在Python中打印曲面拟合方程

4
我将尝试使用matplotlib对三维数据集(x、y、z)进行表面模型拟合。
其中,z = f(x,y)
因此,我会选择二次拟合方程:
f(x,y) = ax^2+by^2+cxy+dx+ey+f 

到目前为止,我已经成功地使用最小二乘法绘制了3D拟合曲面,使用的方法如下:

# 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)

但是,我该如何打印/获取拟合曲面的方程(包括系数值)?

如果能给予一些帮助,我将不胜感激。
谢谢。


你能发布与“到目前为止,我已经成功地使用最小二乘法绘制了3D拟合曲面”的代码相对应的代码吗? - etna
@etna根据您的评论添加了适配部分。 - diffracteD
@etna 哇!那个做到了...但是我能在画布上打印方程式和相应的系数吗? - diffracteD
@etna,打印系数的顺序是按照a、b、c、d、e、f的顺序吗? - diffracteD
1
与A中相同,因此首先是常数等。打印方程的一种方法是: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])(但请确保我正确排序了系数)。另一种方法是: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) - etna
1个回答

3
根据scipy.linalg.lstsq函数的文档http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.linalg.lstsq.html,估计的系数应该存储在变量C中(顺序对应于A中的列)。
要打印你的方程,显示小数点后2位的估计系数:
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])

或者:

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)

顺便提一下,pandasstatsmodels这两个库在处理这种任务时非常有帮助(例如查看使用Pandas Data Frame运行OLS回归)。


谢谢您关于Panda的建议。但是我能否使用当前的代码检查拟合度(或p值)呢? - diffracteD
据我所知,没有“捷径”,因此您需要计算系数的标准误差(例如https://thetarzan.wordpress.com/2012/10/27/calculate-ols-regression-manually-in-python-using-numpy/),然后计算t统计量,最后得到您的p值... - etna
这个最小二乘拟合函数是否提供了一些R值?我找不到它。 - diffracteD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接