我有一个大的m×n矩阵,而我已经确定了线性从属的列。 不过,我想知道是否有R中的方式来写的线性无关的那些方面的线性从属的列。 因为它是一个大的矩阵,这是不可能根据检查的事情。
下面是我有矩阵类型的玩具例子。
> mat <- matrix(c(1,1,0,1,0,1,1,0,0,1,1,0,1,1,0,1,0,1,0,1), byrow=TRUE, ncol=5, nrow=4)
> mat
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 0 1 0
[2,] 1 1 0 0 1
[3,] 1 0 1 1 0
[4,] 1 0 1 0 1
这里很明显,X3 = X1-X2,X5 = X1-X4。 我想知道是否有一个自动化的方式来获取一个更大的矩阵。
谢谢!
我敢肯定有一个更好的办法,但我觉得这个玩弄。 我基本上是做一个检查之初,看是否输入矩阵列满秩,以避免不必要的情况下计算它是满秩。 从那以后,我开始与前两列检查如果子矩阵是一个列满秩的,如果是我,然后检查第一列你等等。 一旦我们找到了一些小矩阵是列满秩的不是我在前面的一个,它告诉我们如何构建第一列的线性组合,以获得最后一列小矩阵回归的最后一列。
我的功能是不是现在很干净,可以做一些额外的检查,但至少它是一个开始。
mat <- matrix(c(1,1,0,1,0,1,1,0,0,1,1,0,1,1,0,1,0,1,0,1), byrow=TRUE, ncol=5, nrow=4)
linfinder <- function(mat){
# If the matrix is full rank then we're done
if(qr(mat)$rank == ncol(mat)){
print("Matrix is of full rank")
return(invisible(seq(ncol(mat))))
}
m <- ncol(mat)
# cols keeps track of which columns are linearly independent
cols <- 1
for(i in seq(2, m)){
ids <- c(cols, i)
mymat <- mat[, ids]
if(qr(mymat)$rank != length(ids)){
# Regression the column of interest on the previous
# columns to figure out the relationship
o <- lm(mat[,i] ~ mat[,cols] + 0)
# Construct the output message
start <- paste0("Column_", i, " = ")
# Which coefs are nonzero
nz <- !(abs(coef(o)) <= .Machine$double.eps^0.5)
tmp <- paste("Column", cols[nz], sep = "_")
vals <- paste(coef(o)[nz], tmp, sep = "*", collapse = " + ")
message <- paste0(start, vals)
print(message)
}else{
# If the matrix subset was of full rank
# then the newest column in linearly independent
# so add it to the cols list
cols <- ids
}
}
return(invisible(cols))
}
linfinder(mat)
这使
> linfinder(mat)
[1] "Column_3 = 1*Column_1 + -1*Column_2"
[1] "Column_5 = 1*Column_1 + -1*Column_4"
文章来源: How to write linearly dependent column in a matrix in terms of linearly independent columns?