【发布时间】:2013-06-16 12:14:31
【问题描述】:
我有 N 个包含推文累积频率的向量,为澄清起见,这些向量之一是 (0, 0, 1, 1, 2, 3, 4, 4, 5, 5, 6, 6, ... )
我想通过创建热图来可视化这些频率的差异。为此,我首先想创建一个包含推文之间欧几里德距离的 NxN 矩阵。我的第一种方法很像 Java,看起来像这样:
create_dist <- function(x){
n <- length(x) #number of tweets
xy <- matrix(nrow=n, ncol=n) #create NxN matrix
colnames(xy) <- names(x) #set column
rownames(xy) <- names(x) #and row names
for(i in 1:n) {
for(j in 1:n){
xy[i,j] <- distance(x[[i]], x[[1]]) #calculate euclidean distance for now, but should be interchangeable
}
}
xy
}
我测量了创建这个距离矩阵所需的时间,对于一个小样本(大约 2000 条推文),它已经花费了大约 35 秒。
> system.time(create_dist(cumFreqs))
user system elapsed
34.572 0.000 34.602
现在我考虑如何稍微加快计算速度,因为我的计算机有 8 个内核,我想如果我使用并行化可能会更快。
像我这个 R 新手一样,我将内部 for 循环更改为 foreach 循环。
#libraries
library(foreach)
library(doMC)
registerDoMC(4)
create_dist <- function(x){
n <- length(x) #number of tweets
xy <- matrix(nrow=n, ncol=n) #create NxN matrix
colnames(xy) <- names(x) #set column
rownames(xy) <- names(x) #and row names
for(i in 1:n) {
xy[i,] <- unlist(foreach(j=1:n) %dopar% { #set each row of the matrix
distance(x[[i]], x[[j]])
})
}
xy
}
再次,我想测量使用 system.time() 为两千条推文样本创建距离矩阵所需的时间,但我在 10 分钟后取消了执行,因为显然根本没有加速.
我搜索了解决方案,但不幸的是我没有找到任何解决方案。现在我想问你是否有更好的方法来创建这个距离矩阵,也许是一个应用函数,我没有羞耻地承认仍然让我感到困惑。
【问题讨论】:
-
为什么不使用
?dist?应该比您的解决方案快很多。 -
我相信如果你并行化外循环而不是内循环,你会获得更好的性能。为了获得好处,即使存在并行化开销,每次迭代都需要性能密集型。但是,我相信您可以摆脱代码中所有显式的 R 循环(请参阅@sgibb 的评论)。
-
或者,您可以用 C++ 编写距离计算,并使用
inline包将其合并到 R 中。 -
我也想过用dist,但是我用的距离函数以后应该可以互换的。
-
也许你想看看proxy 包。它支持 48 种不同的距离测量。计算基于矩阵,而且速度非常快。
标签: r parallel-processing