在没有多核的情况下,如何在 R 中加快这种相关性计算?

机器算法验证 r 相关性 效率
2022-04-16 06:35:31

我有一位同事计算相关性,其中一个科目的一组分数(例如 100 分)与同一科目的另一组分数相关。由此产生的相关性反映了这些分数集与该主题相关联的程度。他需要为 N 个科目做这件事。考虑以下数据集:

ncol <- 100
nrow <- 100
x <- matrix(rnorm(ncol*nrow),nrow,ncol)
y <- matrix(rnorm(ncol*nrow),nrow,ncol)

正确的相关输出向量为:

diag(cor(t(x),t(y)))

有没有更快的方法可以在不使用 R 中的多核包的情况下做到这一点?

3个回答

打电话给diag您时会抛出大量信息,因此您可以通过简单地不计算来节省时间。您的代码相当于:

sapply(1:100,function(i) cor(x[i,],y[i,]))

扩展以反映评论:此代码对于小矩阵会更慢,因为它不使用cor. 因此,如果您想对小矩阵进行快速计算,请将其编写为 C 块。如果想要并行化它(同样,仅对大型矩阵有利可图),可以使用此代码替换sapplymc.lapply或类似的东西。

这实际上取决于“分数”和“科目”的相对数量。您使用的方法计算了许多不需要的互相关。但是,如果相对于“分数”而言,“科目”相对较少,那么这可能无关紧要,并且您建议的方法可能与任何方法一样好,因为它使用了少量有效的 blas 操作。但是,如果相对于分数有大量“主题”,那么使用“mbq”建议的代码循环遍历分别计算每对相关性的行可能会更快。

这可能是使用不同的BLAS 引擎会有所帮助的情况之一。但我不确定——它需要测试(取决于你的机器)