我有一个矩阵 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 给出。
使用哪个求解器也可能由您的数据类型决定。
提问者问当数组不是正方形时如何做到这一点。
完成正方形。然后使用上面的解决方案或这种方法 如何从矩阵中找到线性独立的行
data.shape
(222,324)
data2= np.zeros((324,324))
data2[:222,:] = data
lambdas, V = np.linalg.qr(data2)
linearly_dependent_indices = np.abs(np.diag(V))>=1e-10