从秩亏矩阵中提取线性独立行的例程

2023-11-25

我正在努力解决以下问题:我有一些非常大的矩阵(例如,至少2000x2000,并且可能将来它们甚至会达到10000x10000),并且等级非常小(2或3,称之为N),我需要找到一个高效的Python例程来从中提取线性独立的行(或列,矩阵是对称的!)。我尝试获取 QR 分解的 Q 矩阵的前 N ​​列,但似乎无法正常工作(这可能是错误的吗?)。

下面是我用来实现 Ami Tavory 建议的方法的 Python 代码:

from numpy import absolute
from numpy.linalg import qr

q = qr(R)[1] #R is my matrix
q = absolute(q)
sums = sum(q,axis=1)

i = 0
while( i < dim ): #dim is the matrix dimension
    if(sums[i] > 1.e-10):
       print "%d is a good index!" % i
    i += 1

这应该告诉我该行是否非零,以及 R 的第 I 列是否线性无关。


The 格拉姆施密特过程使用线性组合找到基(相当于最大的独立子集),并且二维码分解有效地模仿了这一点。

因此,做你想做的事情的一种方法是申请numpy.linalg.qr到转置,并检查非零分量R矩阵。相应的列(在转置矩阵中,即原始矩阵中的行)是独立的。


Edit经过一番搜索,我相信这次伯克利讲座解释了它,但这里有例子

import numpy as np

# 2nd column is redundant
a = np.array([[1, 0, 0], [0, 0, 0], [1, 0, 1]])
>> np.linalg.qr(a)[1] # 2nd row empty
array([[ 1.41421356,  0.        ,  0.70710678],
   [ 0.        ,  0.        ,  0.        ],
   [ 0.        ,  0.        ,  0.70710678]])

# 3rd column is redundant
a = np.array([[1, 0, 0], [1, 0, 1], [0, 0, 0], ])
>> np.linalg.qr(a)[1] # 3rd row empty
array([[ 1.41421356,  0.        ,  0.70710678],
   [ 0.        ,  0.        , -0.70710678],
   [ 0.        ,  0.        ,  0.        ]])

# No column redundant
a = np.array([[1, 0, 0], [1, 0, 1], [2, 3, 4], ])
>> np.linalg.qr(a)[1] # No row empty
array([[ 2.44948974,  2.44948974,  3.67423461],
   [ 0.        ,  1.73205081,  1.73205081],
   [ 0.        ,  0.        ,  0.70710678]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从秩亏矩阵中提取线性独立行的例程 的相关文章

随机推荐