假设我想找到两条任意高维线的“交点”。这两条线实际上不会相交,但我仍然希望找到最接近所有线的交点(即尽可能靠近所有线的点)。
假设这些线具有方向向量A、B和初始点C、D,我可以通过简单地设置一个线性最小二乘问题来找到最接近的交点:将线交点方程转换为最小二乘问题。
我能想到的唯一方法是将其分解为三个方程式:
问题在于最小二乘问题的大小随着行数的增加呈二次增长。我想知道是否有更有效的方法来解决n元等最小二乘线性问题?
我在考虑上面提供的By + E = Cz + F的必要性,但由于这个问题没有精确的解(即它们实际上不相交),我认为这样做会对某些变量产生更多的“权重”?
谢谢你的帮助!
编辑
我刚刚使用以下代码测试了将第一个术语与所有其他术语配对的n元等式(而没有其他配对)
下面的结果表明这样做是 不正确 的,因为n元等式中的第一项“权重不同”。
第一个输出是正常结果和不同输入顺序(行顺序无关紧要)的结果之间的差异,其中第一项没有改变。
第二个输出与第一项已更改相同。
假设这些线具有方向向量A、B和初始点C、D,我可以通过简单地设置一个线性最小二乘问题来找到最接近的交点:将线交点方程转换为最小二乘问题。
Ax + C = By + D
转换为最小二乘形式
[A, -B] @ [[x, y]] = D - C
其中@
代表矩阵与向量的乘法,然后我可以使用例如np.linalg.lstsq
来解决它。
但是如何找到3条或更多任意直线的“最交点”?如果我按照同样的规则,现在有:
Ax + D = By + E = Cz + F
我能想到的唯一方法是将其分解为三个方程式:
Ax + D = By + E
Ax + D = Cz + F
By + E = Cz + F
将它们转换为最小二乘形式
[A, -B, 0] [E - D]
[A, 0, -C] @ [[x, y, z]] = [F - D]
[0, B, -C] [F - E]
问题在于最小二乘问题的大小随着行数的增加呈二次增长。我想知道是否有更有效的方法来解决n元等最小二乘线性问题?
我在考虑上面提供的By + E = Cz + F的必要性,但由于这个问题没有精确的解(即它们实际上不相交),我认为这样做会对某些变量产生更多的“权重”?
谢谢你的帮助!
编辑
我刚刚使用以下代码测试了将第一个术语与所有其他术语配对的n元等式(而没有其他配对)
def lineIntersect(k, b):
"k, b: N-by-D matrices describing N D-dimensional lines: k[i] * x + b[i]"
# Convert the problem to least-square form `Ax = B`
# A is temporarily defined 3-dimensional for convenience
A = np.zeros((len(k)-1, k.shape[1], len(k)), k.dtype)
A[:,:,0] = k[0]
A[range(len(k)-1),:,range(1,len(k))] = -k[1:]
# Convert to 2-dimensional matrix by flattening first two dimensions
A = A.reshape(-1, len(k))
# B should be 1-dimensional vector
B = (b[1:] - b[0]).ravel()
x = np.linalg.lstsq(A, B, None)[0]
return (x[:,None] * k + b).mean(0)
下面的结果表明这样做是 不正确 的,因为n元等式中的第一项“权重不同”。
第一个输出是正常结果和不同输入顺序(行顺序无关紧要)的结果之间的差异,其中第一项没有改变。
第二个输出与第一项已更改相同。
k = np.random.rand(10, 100)
b = np.random.rand(10, 100)
print(np.linalg.norm(lineIntersect(k, b) - lineIntersect(np.r_[k[:1],k[:0:-1]], np.r_[b[:1],b[:0:-1]])))
print(np.linalg.norm(lineIntersect(k, b) - lineIntersect(k[::-1], b[::-1])))
导致
7.889616961715915e-16
0.10702479853076755
Θ(n^2)
的复杂度,其中n
是线条数,这非常慢。我想知道是否有更有效的方法。 线性代数最小二乘需要两个输入,一个是上面最左边的矩阵,另一个是上面最右边的向量。 - ZisIsNotZisn*(n-1)/2
对相等的元素。如果我们还考虑LHS矩阵的行长度,那么矩阵实际上的形状是(n*(n-1)/2 * d, n)
,这似乎是行数的立方和维度的线性关系? - ZisIsNotZis