least-squares 的现有 python 实现来找到离几个超平面最近的点?

Existing python implementation of least-squares to find closest point to several hyperplanes?

描述了如何使用least-squares方法在n-dimensionalspace中找到离多条线最近的点。是否有任何现有的实现,但对于最接近 n-dimensional space 中的多个 m-flats 的点?

我的用例是我使用多元线性回归来确定自变量向量 x 和因变量向量 y[=33= 之间的关系],现在我想找到 x 使随机过程输出值尽可能接近实验数据 y_exp.由于 运行 MvLR 产生一组 n-dimensional 等式,如下所示...

...我有 y_1, ... y_q 的实验值,这些方程中的每一个都代表 [=37= 中两个 (n-1)-flat 之间的交集] space(一个由等式 (1) 描述,另一个由 y_1 = y_exp_1 描述),它应该产生 (n-2)-flat。

是否有现有的实现可以找到一组好的 x_1,... x_p 让我最接近这些 (n-2)-flats?

与其像那样解释方程组,不如将其视为具有 p 个变量的一组简单的 q 线性方程组——在这种情况下,问题有 很多更简单的解决方案!

这组方程式 100% 等价于...

其中:

在这种情况下,最小二乘近似法产生...

假设矩阵 A 的秩等于 q (即,您有足够的线性无关方程来求解问题,这如果您的数据是实验性的,则可能会受到尊重),那么这相当于:

有关这方面的解释,请参阅 this excellent video

Python代码:

import numpy as np

A = np.array(...) # The 2D array as described
b = np.array(...) # The 1D array as described

a_rank = np.linalg.matrix_rank(A)
if a_rank != b.size:
    raise ValueError(
        "Rank of matrix A for least squares approximation is "
        + f"inappropriate. Expected {b.size} but was {a_rank}. This "
        + "means either there are not enough equations, or there are "
        + "but too many of the equations are linearly dependant."
    )
x_star = np.linalg.inv(A.transpose().dot(A)).dot(A.transpose()).dot(b)
print("x*:", x_star)

如果您还想要 R²:

# A.transpose() because A is equal to Beta transposed, and we want to do
# (x*) * Beta
b_hat = x_star.reshape((1, x_star.size)).dot(A.transpose()).reshape(b.size)
sse = np.square(b - b_hat).sum()
sst = np.square(b - b.mean()).sum()
rsquared = 1 - sse / sst