【发布时间】:2018-10-09 17:37:09
【问题描述】:
R 输入:一个矩阵(测量 x 个样本)(2291 x 265)(矩阵 [i,j]=0 到 1 之间的值)
输出:在所有样本对之间计算的加权 jaccard 的对称相似矩阵
问题:找到产生输出的最快方法。我找到了使用“doParallel”和“foreach”的好方法,但这还不够,因为它仍然太慢。我没有找到任何具有能够计算加权 jaccard 函数的包,但也许我错过了它。无论如何,您可以用您喜欢的解决方案和方法进行回复。谢谢大家会回答。 这是我现在的脚本:
rm(list=ls())
#Load libraries ----
require(doParallel)
require(foreach)
require(doSNOW)
require(doMPI)
#Imported data ----
dim(input_m) #2291 x 265
#Set clusters ----
no_cores <- 3
cl <- makeCluster(as.integer(no_cores))
registerDoParallel(cl)
#I build all the combinations of the pairs of samples ----
samples=seq(1:ncol(input_m))
combs<-as.matrix(expand.grid(samples,samples))
combs<-unique(t(parApply(cl=cl, combs, 1, sort)))
#Prepare the resulting matrix ----
res_m <- matrix(ncol = ncol(input_m), nrow = ncol(input_m))
rownames(res_m)=colnames(input_m)
colnames(res_m)=colnames(input_m)
#Compute Weighted Jaccard similarity btw all pairs of samples ----
sim_m=foreach(s = 1:nrow(combs), .combine=rbind, .noexport=c("pair","num","den"), .inorder=FALSE) %dopar% {
pair=input_m[,c(combs[s,1],combs[s,2])]
num=sum(apply(pair,1,min))
den=sum(apply(pair,1,max))
return(c(combs[s,1],combs[s,2],num/den))
}
#Fill the prepared matrix with the results in sim_m
for (k in 1:nrow(sim_m)){
sim=sim_m[k,3]
idx1=sim_m[k,1]
idx2=sim_m[k,2]
res_m[idx1,idx2]=sim
res_m[idx2,idx1]=sim
}
#Stop clusters
stopCluster(cl)
【问题讨论】:
-
你可以看看
proxy包。我知道它有 Jaccard 的方法,但不确定加权方面。无论如何可能值得一试。 -
@lmo 代理包没有实现 WJ。它允许定义一个自定义函数,但它不会改变性能,因为它会再次取决于我的脚本。不过,感谢您的回答,任何反馈都很重要。
标签: r performance similarity doparallel parallel-foreach