【问题标题】:extract maximal set of independent columns from a matrix [closed]从矩阵中提取最大的独立列集[关闭]
【发布时间】:2013-09-30 17:51:16
【问题描述】:

我有一个如下所示的矩阵:

 1 1 1 1 1 1 1 1 1  1  1  1
 1 1 1 1 1 1 0 0 0  0  0  0
 0 0 1 1 0 0 0 0 1  1  0  0
 1 1 0 0 0 0 1 1 0  0  0  0
 0 0 1 1 0 0 0 0 0  0  0  0
 1 1 0 0 0 0 0 0 0  0  0  0

您可以看到每两列都是相同的,表示设计矩阵的“组成员身份”。现在我的问题是,如何在 R 中自动将这个秩不足矩阵(秩 = 6)转换为全秩矩阵?这种情况可能有点特殊,即我可以手动删除重复的列。我只是好奇是否有一种方法可以“更普遍地”解决问题。谢谢!

【问题讨论】:

  • “转换”是什么意思?通过对行进行子集化、对列进行子集化、通过其他一些转换来进行转换?
  • @DavidRobinson:我的意思是让这个矩阵满秩...
  • 也许我不清楚:我在问可以进行哪些转换来将矩阵转换为满秩矩阵。毕竟,任何矩阵都可以“变成一个满秩矩阵”,只需将其替换为一个完全不同的恰好是满秩的矩阵。大概您正在寻找一种方法来转换涉及尽可能少的步骤的矩阵,或者获取与原始矩阵尽可能相似的矩阵。
  • @DavidRobinson:我认为我需要的是自动删除 R 中矩阵的线性相关列。很抱歉造成混乱,感谢您的回复:)

标签: r matrix


【解决方案1】:

我认为 R 进行 QR 分解的方式是可行的(我的意思是留下一组独立的列):

m[, qr(m)$pivot[seq_len(qr(m)$rank)]]

关于 OP 的示例:

m = structure(c(1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 
1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 
1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L), .Dim = c(6L, 12L
))

m[, qr(m)$pivot[seq_len(qr(m)$rank)]]
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    1    1    1    1    1
#[2,]    1    1    1    0    0    0
#[3,]    0    1    0    0    1    0
#[4,]    1    0    0    1    0    0
#[5,]    0    1    0    0    0    0
#[6,]    1    0    0    0    0    0

【讨论】:

  • 非常感谢!顺便说一句,您指的是什么“OP”? :)
  • OP = 原帖(呃)
【解决方案2】:

试试:

X[,duplicated(cor(X))]

cor(x) 计算 x 的相关矩阵。如果两列彼此线性相关,则它们在相关矩阵中将具有相同的列

这将消除作为单个其他列的线性转换的列。

如果您正在寻找行缩减梯队形式,这将显示一列是否是多个其他列的线性组合,请查看以下答案:

Reduced row echelon form

【讨论】:

  • 不适用于例如matrix(c(1,0,1,0,1,1,1,1,2), nrow = 3)
  • 感谢 eddi,我编辑了答案。
  • 还是不行——我是不是错过了什么?
  • 数值精度怎么样?
【解决方案3】:

如果您只想删除相同的列,您可以这样做:

 t(unique(t(dat)))
     V1 V3 V5 V7 V9 V11
[1,]  1  1  1  1  1   1
[2,]  1  1  1  0  0   0
[3,]  0  1  0  0  1   0
[4,]  1  0  0  1  0   0
[5,]  0  1  0  0  0   0
[6,]  1  0  0  0  0   0

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 2014-03-30
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多