gpt4 book ai didi

R:维度名称列表中的稀疏矩阵

转载 作者:行者123 更新时间:2023-12-01 12:42:23 26 4
gpt4 key购买 nike

如何根据维度名称列表创建稀疏矩阵?

假设您在数据框中有这个矩阵边列表:

  from to weight
1 4 a 1
2 5 b 2
3 6 c 3

可以这样创建:

from <- factor(c(4:6))
to <- c("a", "b", "c")
weight <- c(1:3)
foo <- data.frame(from, to, weight)

可以创建一个矩阵,首先创建一个用 0 填充的空矩阵,命名行和列,然后将值填充到:

bar <- matrix(
0,
nrow = length(unique(foo$from)),
ncol = length(unique(foo$to)),
dimnames = list(levels(foo$from), levels(foo$to))
)
bar[as.matrix(foo[,1:2])] <- foo[,3]

结果是这样的:

  a b c
4 1 0 0
5 0 2 0
6 0 0 3

如何创建稀疏矩阵?

解决方案

一种优雅的方式是使用 Matrix需要使用 factors 的整数值的包:

bar_sparse <- sparseMatrix(
i = as.numeric(foo$from),
j = as.numeric(foo$to),
x = foo$weight,
dimnames = list(levels(foo$from), levels(foo$to))
)

开始吧:

  a b c
4 1 . .
5 . 2 .
6 . . 3

谢谢 Martin,为我指明了这个方向。

最佳答案

作为 Matrix 包的维护者:在构造中允许对 sparseMatrix 对象使用 dimnames,和列名甚至是重要的,特别是例如对于稀疏模型矩阵(在 glmnet 等)。但出于效率原因(并且部分缺乏用例,因此“尚未实现”)它们并不总是在矩阵乘法中传播,例如 IIRC。

这种“半不鼓励”支持的主要原因是稀疏矩阵在非常大的情况下特别重要,因为 nrow(.) * ncol(.) 很大。在这种情况下,携带(和复制!!)数十万行(和列)名称的成本很高。

在所有这些警告之后,当然我承认你问了一个非常有效的问题,你现在可能没有选择,确实需要使用行和列的 names 而不是整数指数。

是的,你(几乎)是对的:使用

M <- Matrix(0, n,m, dimnames=....)
for(i in ...)
for(j in ...)
M[i,j] <- ...

对于 sparseMatrix 对象(即所有继承自 sparseMatrix 的 Matrix 对象)来说绝不是个好主意。相反,使用 sparseMatrix(...., dimnames = ..) .. 顺便说一下,使用 dimnames 参数比设置 colnamesrownames 之后分开。

关于R:维度名称列表中的稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23107837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com