3

我有一个矩阵 A = np.array([[1,1,1],[1,2,3],[4,4,4]]) 并且我只想要新矩阵中的线性独立行。答案可能是 A_new = np.array([1,1,1],[1,2,3]]) 或 A_new = np.array([1,2,3],[4,4,4])

由于我有一个非常大的矩阵,所以我需要将矩阵分解为更小的线性独立满秩矩阵。有人可以帮忙吗?

4

1 回答 1

4

有很多方法可以做到这一点,哪种方法最好取决于您的需求。而且,正如您在声明中指出的那样,甚至没有唯一的输出。

一种方法是使用 Gram-Schmidt 找到正交基,其中该基中的前 $k$ 个向量与前 $k$ 个独立行具有相同的跨度。如果在任何步骤中发现线性相关性,请从矩阵中删除该行并继续该过程。

使用 numpy 执行此操作的一种简单方法是,

q,r = np.linalg.qr(A.T)

然后删除 R_{i,i} 为零的任何列。

例如,你可以做

A[np.abs(np.diag(R))>=1e-10]

虽然这在精确算术中可以完美运行,但在有限精度下可能效果不佳。几乎任何矩阵在数值上都是独立的,因此您需要某种阈值来确定是否存在线性相关性。如果您使用内置的 QR 方法,则必须确保不依赖于您之前删除的列。

如果您需要更高的稳定性,您可以迭代地解决最小二乘问题

A.T[:,dependent_cols] x = A.T[:,col_to_check]    

使用稳定的直接方法。如果你能准确地解决这个问题,那么 AT[:,k] 取决于前面的向量,组合由 x 给出。

使用哪个求解器也可能取决于您的数据类型。

于 2018-12-25T03:29:48.340 回答