我有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分钟后取消了执行,因为显然根本没有加速
我用谷歌搜索解决方案,但不幸的是我没有找到任何解决方案。现在我想问你是否有更好的方法来创建这个距离矩阵,也许是一个应用函数,我毫不羞耻承认仍然让我困惑。
答案 0 :(得分:2)
如上所述,您可以使用dist
功能。这是一个如何使用dist
的结果创建热图的示例。
nn <- paste0('row',1:5)
x <- matrix(rnorm(25), nrow = 5,dimnames=list(nn))
distObj <- dist(x)
cols <- c("#D33F6A", "#D95260", "#DE6355", "#E27449",
"#E6833D", "#E89331", "#E9A229", "#EAB12A", "#E9C037",
"#E7CE4C", "#E4DC68", "#E2E6BD")
## mandatory coercion
distObj <- as.matrix(distObj)
## hetamap
image(distObj[order(nn), order(nn)], col = cols,
xaxt = "n", yaxt = "n")
## axes labels
axis(1, at = seq(0, 1, length.out = dim(distObj)[1]), labels = nn,
las = 2)
axis(2, at = seq(0, 1, length.out = dim(distObj)[1]), labels = nn,
las = 2)
答案 1 :(得分:0)
就像'agstudy'建议的那样,使用内置'dist'功能。
为了将来参考,R中的嵌套for循环非常慢。由于R是一种函数式语言,请尝试使用矢量化操作,例如apply family(apply,lapply,sapply,tapply)。当你习惯于类似C的范例时,需要花一些时间来考虑以功能方式编写任务。
有关for循环和应用flavor之间基准的有用讨论在这里:Is R's apply family more than syntactic sugar?