【问题标题】:R: Generating a sparse matrix with exactly one value per row (dummy coding)R:生成每行只有一个值的稀疏矩阵(虚拟编码)
【发布时间】:2014-12-31 01:46:31
【问题描述】:

我正在尝试在 R 中生成一个稀疏矩阵来表示一些虚拟编码变量。因此,矩阵每行应该恰好有一个“1”(所有其他值都为零)。所以,是这样的:

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

有没有合理的方法来生成这样的矩阵?我能想到的最好的办法是创建代表每条可能线的 j 向量,然后从中采样;但这似乎有点笨拙。有更好的建议吗?

编辑:这是我最终所做的;确实是从向量列表中采样的。我想,下面的解决方案非常出色,尤其是在缩放方面。

matrix(unlist(sample(list(c(1, 0, 0, 0), c(0, 1, 0, 0), c(0, 0, 1, 0), c(0, 0, 0, 1)), 
                       size=93, replace=TRUE)), 93, 4, byrow=TRUE)

【问题讨论】:

  • 我希望您知道,如果您将 factor 变量传递给 R 中的许多模型函数,它们会为您执行虚拟编码。
  • 也许另一个选择:diag(1, 4, 4) 除非你需要随机位置的 1
  • @beginneR 是的,我想我应该明确表示 - 需要随机化。

标签: r matrix sparse-matrix


【解决方案1】:

如果你想创建一个随机虚拟矩阵,一个快速的方法是创建一个这样的函数:

Dummy <- function(nrow, ncol) {
  M <- matrix(0L, nrow = nrow, ncol = ncol)
  M[cbind(sequence(nrow), sample(ncol, nrow, TRUE))] <- 1L
  M
}

函数的第一行只是创建了一个由零组成的空矩阵。第二行使用矩阵索引将每行的一个值替换为一个。第三行只返回输出。我不确定您打算如何创建/使用您的 j 向量,但这是我建议的处理方式....

使用很简单:你只需要指定最终矩阵应该有的行数和列数。

例子:

set.seed(1) ## for reproducibility
Dummy(3, 3)
#      [,1] [,2] [,3]
# [1,]    1    0    0
# [2,]    0    1    0
# [3,]    0    1    0
Dummy(6, 4)
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    1    0    0    0
# [3,]    0    0    0    1
# [4,]    0    0    0    1
# [5,]    0    0    1    0
# [6,]    0    0    1    0

【讨论】:

  • library(Matrix); sparseMatrix(i = sequence(nrow), j = sample(ncol, nrow, TRUE), x = 1) 得到一个真正的稀疏矩阵。
【解决方案2】:

你可以使用model.matrix():

x <- factor(LETTERS[1:4])
model.matrix(~ 0 + x)

【讨论】:

  • ... 如果 OP 想要一个 random 虚拟编码矩阵,他可以这样做:x &lt;- factor(sample(LETTERS,4,replace=TRUE))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多