求解超定线性方程组
Solve over-determined system of linear equations
我有一个相当简单的方程组,其形式为:
1*A + 0*B + x2*C + y2*D = x1
0*A + 1*B + y2*C + x2*D = y1
其中 (x1,y1)
和 (x2,y2)
对是长度为 N
的已知浮点数(系统超定),我需要求解 A, B, C, D
参数。
我一直在研究 numpy.linalg.lstsq
,但我似乎无法获得正确的矩阵形状。这就是我的
import numpy as np
N = 10000
x1, y1 = np.random.uniform(0., 5000., (2, N))
x2, y2 = np.random.uniform(0., 5000., (2, N))
# 1*A + 0*B + x2*C + y2*D = x1
# 0*A + 1*B + y2*C + x2*D = y1
l1 = np.array([np.ones(N), np.zeros(N), x2, y2])
l2 = np.array([np.zeros(N), np.ones(N), y2, x2])
M1 = np.array([l1, l2])
M2 = np.array([x1, y1])
ABCD = np.linalg.lstsq(M1, M2)[0]
print(ABCD)
失败:
numpy.linalg.linalg.LinAlgError: 3-dimensional array given. Array must be two-dimensional
我做错了什么?
保持其他一切不变,将 M1
和 M2
更改为
M1 = np.vstack([l1.T, l2.T])
M2 = np.concatenate([x1, y1])
应该完成这项工作。
您的串联是个问题,而且 lstsq() 的参数也必须转置。
M1 = np.hstack((l1,l2))
M2 = np.hstack((x1,x2))
ABCD = np.linalg.lstsq(M1.T,M2.T)[0]
我有一个相当简单的方程组,其形式为:
1*A + 0*B + x2*C + y2*D = x1
0*A + 1*B + y2*C + x2*D = y1
其中 (x1,y1)
和 (x2,y2)
对是长度为 N
的已知浮点数(系统超定),我需要求解 A, B, C, D
参数。
我一直在研究 numpy.linalg.lstsq
,但我似乎无法获得正确的矩阵形状。这就是我的
import numpy as np
N = 10000
x1, y1 = np.random.uniform(0., 5000., (2, N))
x2, y2 = np.random.uniform(0., 5000., (2, N))
# 1*A + 0*B + x2*C + y2*D = x1
# 0*A + 1*B + y2*C + x2*D = y1
l1 = np.array([np.ones(N), np.zeros(N), x2, y2])
l2 = np.array([np.zeros(N), np.ones(N), y2, x2])
M1 = np.array([l1, l2])
M2 = np.array([x1, y1])
ABCD = np.linalg.lstsq(M1, M2)[0]
print(ABCD)
失败:
numpy.linalg.linalg.LinAlgError: 3-dimensional array given. Array must be two-dimensional
我做错了什么?
保持其他一切不变,将 M1
和 M2
更改为
M1 = np.vstack([l1.T, l2.T])
M2 = np.concatenate([x1, y1])
应该完成这项工作。
您的串联是个问题,而且 lstsq() 的参数也必须转置。
M1 = np.hstack((l1,l2))
M2 = np.hstack((x1,x2))
ABCD = np.linalg.lstsq(M1.T,M2.T)[0]