我有 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
}
我测量了创建这个距离矩阵所需的时间,对于一个小样本(大约两千条推文),它已经花费了大约 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 分钟后取消了执行,因为显然根本没有加速。
我搜索了解决方案,但不幸的是我没有找到任何解决方案。现在我想问你是否有更好的方法来创建这个距离矩阵,也许是一个应用函数,我没有羞耻地承认仍然让我感到困惑。