我有一个矩阵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](
由于我有一个非常大的矩阵,所以我需要将矩阵分解为更小的线性独立全秩矩阵。有人能帮忙吗?
有很多方法可以做到这一点,哪种方法最好取决于您的需求。而且,正如您在声明中指出的,甚至没有唯一的输出。
实现这一点的一种方法是使用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.给出
使用哪种解算器也可能由您的数据类型决定。