我有一个矩阵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])
由于我的矩阵很大,因此需要将矩阵分解为较小的线性独立的满秩矩阵。有人可以帮忙吗?
答案 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给出组合。
使用哪种求解器也可能取决于您的数据类型。