我有一套维向量,并且想选择他们成为一个列矩阵。我想选择最大化的子集, 在哪里是转置和是行列式的符号。
这能比尝试每一个可能的组合更快吗?
我有一套维向量,并且想选择他们成为一个列矩阵。我想选择最大化的子集, 在哪里是转置和是行列式的符号。
这能比尝试每一个可能的组合更快吗?
与此相关的任务是找到最大线性独立的列向量子集。线性独立与要求一个大的行列式并不完全相同,但如果我们可以使用一个作为另一个的代理,那么这种启发式可能会对您有所帮助。
秩揭示 QR 分解 (RRQR) 是实现此相关任务的好方法。rank-revealing QR 的输出之一是输入向量的排列,导致近似最大线性独立性。例如,在 Python 中,我可以执行以下操作:
import numpy as np
import scipy.linalg as la
n=10 # Size of column vectors
nvectors=500 #Number of vectors to generate
np.random.seed(3244) #Seed RNG to make result reproducible
A=np.random.rand(n,nvectors)
(Q,R,P)=la.qr(A,pivoting=True) #pivoting=True switches to RRQR algorithm
k=5 #Choose k vectors out of total
B=A[:,P[0:k]] #B is vectors from the RRQR ordering
C=A[:,0:k] #C is vectors in original ordering
print("Permuted: {}, Un-Permuted: {}".format(np.linalg.det(B.T@B),np.linalg.det(C.T@C)))
#output: Permuted: 60.60606973650909, Un-Permuted: 1.005883253383066
编辑:再想一想,这可能比我意识到的更接近您明确要求的内容,而不仅仅是启发式。您可以使用 RRQR 因式分解本身来找到该子矩阵的行列式(其上三角因子的对角线项的乘积),并且由于 RRQR 置换以使对角线项不增加,这表明我们实际上通过使用接近最大可能的行列式排列。
严格来说可能并非如此,因为 RRQR 生成的排列是近似的,它不一定是最好的。换句话说:可能还有其他 RRQR 分解做得更好。
这是 NP 难的,但有一些启发式算法。请参阅处理此问题的https://arxiv.org/abs/1502.07838 。