我需要计算:
我可以将其进一步分解为:
在R中我写了这段代码
att_num <- dim(X)[2]
A <- matrix(0, att_num, att_num)
for(i in seq(att_num)) A[,i] <- colSums(dx * X * X[,i])
但由于循环,它可能很慢。这一行占用了我脚本中的大部分计算时间。有没有办法可以改进这个计算?
dx
是一个大小为[1 x m] X
是一个大小为[n x m] 示例:
dx <- sample(1:100, 30, replace=T)
X <- data.frame(replicate(30,sample(0:1,100,rep=TRUE)))
att_num <- dim(X)[2]
A <- matrix(0, att_num, att_num)
for(i in seq(att_num)) A[,i] <- colSums(dx * X * X[,i])
答案 0 :(得分:7)
set.seed(42)
dx <- sample(1:100, 30, replace=T)
X <- data.frame(replicate(10,sample(0:1,100,rep=TRUE)))
att_num <- dim(X)[2]
A <- matrix(0, att_num, att_num)
for(i in seq(att_num)) A[,i] <- colSums(dx * X * X[,i])
B <- crossprod(as.matrix(dx * X), as.matrix(X))
all.equal(A, unname(B))
#[1] TRUE
答案 1 :(得分:1)
假设x_i是X的列,那么您可以使用矩阵乘法运算符%*%
以矢量化方式执行此操作:
library(Matrix)
set.seed(1234)
nrows <- 100
ncols <- 30 # same as length(dx)
dx <- sample(1:100, ncols, replace=T)
X <- matrix(sample(0:1, nrows*ncols, replace = TRUE), nrow = nrows, ncol = ncols)
A <- X %*% Diagonal(length(dx), dx) %*% t(X)
如果X有大量零,我强烈建议您将其放入稀疏格式(从sparseMatrix
包中查看Matrix
)。请注意,中间的对角矩阵实际上是稀疏的。这样可以节省很多的内存和计算。
注1:在下面的评论中,Roland指出,只要X有行,dx就没有了。我建议你确切地检查你想做什么,因为通常应该是这样的!此外,通常x_i是X的列。如果您发布更多信息(包括例如总和中索引的限制),我可以帮助您更多。
注2:另外,尝试使用矩阵代替数据帧。数据框速度要慢得多,因为它们必须分别管理列。