消除Python中非方阵的线性相关列

Moh*_*mad 5 python matrix linear-algebra rank

我有一个矩阵 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])

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

tch*_*tch 6

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

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

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

q,r = np.linalg.qr(A.T)
Run Code Online (Sandbox Code Playgroud)

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

例如,你可以这样做

A[np.abs(np.diag(R))>=1e-10]
Run Code Online (Sandbox Code Playgroud)

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

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

A.T[:,dependent_cols] x = A.T[:,col_to_check]    
Run Code Online (Sandbox Code Playgroud)

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

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