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

时间:2018-12-07 09:59:18

标签: 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])

由于我的矩阵很大,因此需要将矩阵分解为较小的线性独立的满秩矩阵。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

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

一种执行此操作的方法是使用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给出组合。

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