2012-09-27 167 views
3

所以我想解决方程z= a + b*y +c*x,。得到a,b,c。 即:使(平面)表面适合3D空间中散射点的负载。用numpy最小二乘拟合线性表面

但我似乎无法找到任何东西!我认为对于这样一个简单的问题会有一个简单的模块。

我试过了,其中x,y,z是数组;

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

我是正确的思维coeffs = B,C? 还是我完全走错了方向。我似乎无法找到其他任何能在3d中工作的东西...

回答

2

我认为你是在正确的轨道上。你仍然可以尝试以下的scipy.linalg documentation的例子,尤其是解最小二乘...`部分

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是3×1向量,z是一个3×N个向量。

如果通过A的转置预乘双方,您将得到一个3x3矩阵的等式,您可以为您想要的系数求解。

使用LU分解和前向替换。

+0

我可以用这个吗? A = np.column_stack([x,y,np.ones_like(x)]) – plebplod

+0

不知道scipy还不够好。 – duffymo

+0

有点不熟悉矩阵......但会尝试a =(XtX)^ - 1Xty – plebplod