我想在中找到a
系数的最小二乘解
z = (a0 + a1*x + a2*y + a3*x**2 + a4*x**2*y + a5*x**2*y**2 + a6*y**2 +
a7*x*y**2 + a8*x*y)
给定长度为20的数组
x
,y
和z
。基本上,我正在寻找 numpy.polyfit
的等效项,但需要二维多项式。This question与之类似,但是该解决方案是通过MATLAB提供的。
最佳答案
这是一个示例,显示如何使用numpy.linalg.lstsq
来完成此任务:
import numpy as np
x = np.linspace(0, 1, 20)
y = np.linspace(0, 1, 20)
X, Y = np.meshgrid(x, y, copy=False)
Z = X**2 + Y**2 + np.random.rand(*X.shape)*0.01
X = X.flatten()
Y = Y.flatten()
A = np.array([X*0+1, X, Y, X**2, X**2*Y, X**2*Y**2, Y**2, X*Y**2, X*Y]).T
B = Z.flatten()
coeff, r, rank, s = np.linalg.lstsq(A, B)
调整系数
coeff
为:array([ 0.00423365, 0.00224748, 0.00193344, 0.9982576 , -0.00594063,
0.00834339, 0.99803901, -0.00536561, 0.00286598])
请注意,
coeff[3]
和coeff[6]
分别对应于X**2
和Y**2
,它们与1.
接近,因为示例数据是使用Z = X**2 + Y**2 + small_random_component
创建的。关于python - Python中2D多项式的 `polyfit`的等效项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33964913/