您可以将 QR 分解与列旋转一起使用(参见Engler (1997) 的“列旋转的 QR 分解算法的行为”)。如该论文中所述,枢轴通过“最线性独立”对列进行排序。假设我们已经计算了矩阵的秩(这是一个公平的假设,因为通常我们首先需要这样做才能知道它的秩较低),然后我们可以取第一个rank(X)枢轴并且应该得到一个满秩矩阵。
这是一个例子。
set.seed(1)
n <- 50
inputs <- matrix(rnorm(n*3), n, 3)
x <- cbind(
inputs[,1], inputs[,2], inputs[,1] + inputs[,2],
inputs[,3], -.25 * inputs[,3]
)
print(Matrix::rankMatrix(x)) # 5 columns but rank 3
cor(x) # only detects the columns 4,5 collinearity, not 1,2,3
svd(x)$d # two singular values are numerically zero as expected
qr.x <- qr(x)
print(qr.x$pivot)
rank.x <- Matrix::rankMatrix(x)
print(Matrix::rankMatrix(x[,qr.x$pivot[1:rank.x]])) # full rank
关于仅使用成对相关问题的另一个评论是,具有完美相关性的两列甚至不能保证矩阵是低秩的。举个例子:
set.seed(1)
x <- rnorm(n)
x <- cbind(x, x + 1)
print(Matrix::rankMatrix(x))
cor(x)
这两列是完全相关的,但由于常数向量不在它们的范围内,它实际上并不影响排名。如果还有一个截距列,那么这个矩阵确实是秩的2(几乎可以肯定)。