Numpy最小二乘法解不精确的结果

Numpy最小二乘法解不精确的结果,numpy,transform,least-squares,Numpy,Transform,Least Squares,我正在从3D空间中的几个点计算所需的仿射变换,并使用numpy.linalg.lstsq来实现。然而,我得到的结果虽然并不遥远,但不够准确,即使是在非常简单的例子中: m = 100 xy = np.array([[0, 0, 0], [m, 0, 0], [m, m, 0], [0, m, 0], [0, 0, m], [m, 0, m], [m, m, m],

我正在从3D空间中的几个点计算所需的仿射变换,并使用numpy.linalg.lstsq来实现。然而,我得到的结果虽然并不遥远,但不够准确,即使是在非常简单的例子中:

m = 100
xy = np.array([[0, 0, 0],
           [m, 0, 0],
           [m, m, 0],
           [0, m, 0],
           [0, 0, m],
           [m, 0, m],
           [m, m, m],
           [0, m, m]])
uv = np.array([[0.5, 0, 0],
           [m + 0.5, 0, 0],
           [m+ 0.5, m, 0],
           [0.5, m, 0],
           [0.5, 0, m],
           [m+ 0.5, 0, m],
           [m+ 0.5, m, m],
           [0.5, m, m]])

pts_a = np.hstack([uv, np.ones((uv.shape[0], 1))])
pts_b = np.hstack([xy, np.ones((xy.shape[0], 1))])
solution_1 = np.linalg.lstsq(pts_a, pts_b, rcond=None)[0]
我期望上述代码的结果是:

[[1, 0, 0, -0.5],
 [0, 1, 0, 0],
 [0, 0, 1, 0],
 [0, 0, 0, 1]])
我得到的结果是:

 [[ 1.00000000e+00  3.49047642e-16  3.60109527e-16 -5.00000000e-01]
 [ 1.77081442e-16  1.00000000e+00 -3.93150475e-16  1.80460546e-15]
 [ 2.21351803e-16 -3.11848610e-16  1.00000000e+00 -6.28251374e-15]
 [ 2.76689754e-18  1.06035619e-17 -1.19061095e-17  1.00000000e+00]]
这些微小的差异对我的结果产生了很大的影响。有什么办法解决吗? 注意:我只能在我的项目中使用numpy和math,所以很遗憾,使用不同的库是不可能的!
谢谢

事实上,差异不是很小,而是很大-您对
解决方案[0,3]
的符号错误

问题是,您没有计算所需的变换
t
,而是计算该变换的逆,即
t^-1

让我们做一些数学:

T*X=U, with X - original vectors
            U - transformed vectors

transposing it =>
X^t * T^t = U^t
 |     |     |
\|/   \|/   \|/
 A  *  x  =  b
在您的程序
A=pts_b
b=pts_A
中,这意味着转换
T
是(您必须交换
pts_b
pts_b
并转置结果以获得正确的矩阵):

>>> T
array([[  1.00000000e+00,  -8.15320034e-17,  -6.59194921e-17,  5.00000000e-01],
       [ -4.97379910e-16,   1.00000000e+00,   7.77156117e-16,  -1.02678283e-14],
       [ -2.13162819e-16,   4.44089210e-16,   1.00000000e+00,   1.91513472e-15],
       [ -4.44089205e-18,  -8.84708973e-17,   9.88792381e-17,   1.00000000e+00]])
PS:你已经解决了这个方程:

X^t  =  U^t * (T^t)^(-1)
 |       |     |
\|/     \|/   \|/
 b   =   A  *  x

如果不告诉我们您使用这些结果的目的,我不怀疑我们可以进一步帮助您。在我看来,这是正确的,并且在解析解的机器精度范围内。您的后续算法可能在数值上不稳定,但我们可以提供帮助。谢谢您的回复!然而,这只是我方面的一个错误。它应该是-0.5!正如沃达所说,这是机器的精度问题。但是我很感激你的帮助!
X^t  =  U^t * (T^t)^(-1)
 |       |     |
\|/     \|/   \|/
 b   =   A  *  x