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

5
我有一个矩阵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])。
由于我的矩阵非常大,所以我需要将其分解为较小的线性独立满秩矩阵。有人能帮忙吗?

导入numpy库A = np.array([ [1,1,1],[1,2,3],[4,4,4]]) - Mohammad
1个回答

5
有多种方法可以实现这个目标,最佳的方法取决于你的需求。正如你在陈述中提到的那样,并没有唯一的输出。
一种方法是使用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]    

使用稳定的直接方法。如果您能够精确地解决此问题,则 A.T[:,k] 取决于先前向量,组合由 x 给出。

选择使用哪个求解器也可能受数据类型的影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接