使用numpy最小二乘法拟合线性曲面

3

所以我想解决方程 z = a + b * y + c * x,获得a, b, c。即:在三维空间中,使一个(平面)曲面适合于大量散点。

但是我似乎找不到任何东西!我认为这个简单的问题应该有一个简单的模块。

我已经尝试过使用数组 x、y 和 z;

ys=zip(x,y)
(coeffs, residuals, rank, sing_vals) = np.linalg.lstsq(ys,z)

我是否正确地认为coeffs = b,c?或者我完全走错了方向。我似乎找不到其他在3D中有效的东西...

2个回答

2

我认为你走在了正确的道路上。你可以尝试参考scipy.linalg文档中的例子,特别是"Solving least-squares..."部分。

A = np.column_stack((np.ones(x.size), x, y))
c, resid,rank,sigma = np.linalg.lstsq(A,zi)

我们添加了一个常数列(值为1)。

0

常数a、b和c是需要解决的未知数。

如果您将N(x,y,z)点代入方程式中,则会得到3个未知数的N个方程式。您可以将其写成矩阵形式:

[x1 y1 1]{ a }   { z1 }
[x2 y2 1]{ b }   { z2 }
[x3 y3 1]{ c } = { z3 }
    ...
[xn yn 1]        { zn }

或者

Ac = z

其中A是一个Nx3的矩阵,c是一个3x1的向量,z是一个3xN的向量。

如果你将两边都用A的转置矩阵进行前乘,你会得到一个带有3x3矩阵的方程,可以用它来解出你想要的系数。

使用LU分解和前后代替。


我可以使用这个吗?A = np.column_stack([x, y, np.ones_like(x)]) - plebplod
不太了解Scipy,无法确定。 - duffymo
对于矩阵有点陌生...但我会尝试 a=(XtX)^-1Xty - plebplod

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