消除python中非方阵的线性相关列

问题描述 投票:0回答:2

我有一个矩阵 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])

由于我有一个非常大的矩阵,所以我需要将矩阵分解为更小的线性独立满秩矩阵。有人可以帮忙吗?

python matrix linear-algebra rank
2个回答
6
投票

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

实现此目的的一种方法是使用 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 给出。

使用哪个求解器也可能由您的数据类型决定。


0
投票

提问者问当数组不是正方形时如何做到这一点。

完成正方形。然后使用上面的解决方案或这种方法 如何从矩阵中找到线性独立的行

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

enter image description here

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.