[问题] 两两比较运算

楼主: pk790127 (<>)   2017-08-30 14:09:03
[问题类型]:
程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
不晓得标题这样下对不对,我想要计算多比不等长的资料(存在list)
举例:共四笔资料,我想要运算1 vs 2,3,4 ; 2 vs 3,4 ; 3 vs 4
(vs:比较或是运算,并且重复的不算)
效能咨询(我想让R 跑更快)
我已经有使用多层for loop将上述描述实作完毕,但是循环多层,运算效能非常差...
[软件熟悉度]:
使用者(已经有用R 做过不少作品)
算是有学了一阵子,但感觉程式逻辑还是很差
[问题叙述]:
如上述,我要运算多笔资料,且作两两比较,目的是将计算的结果使用矩阵表示
举例:共四笔资料,1,2,3,4 想要两两比较,并以矩阵方式表示 (如下图)
1 2 3
2 1vs2
3 1vs3 2vs3
4 1vs4 2vs4 3vs4
[程式范例]:
我直接贴程式码,并以注解的方式解释
实际上我要做的是修改DTW这个套件,并已经将里面的内容改成我要的运算方式
sample_list<- list(1,2,3,4)
# 有几笔资料就设定list放几笔的资料
tmp1 <-list()
i <-1
for(i in 1:3){
tmp <- lapply(sample_list, function(x) x+i)
tmp1[[i]] <- unlist(tmp)
tmp1[[i]][which(tmp1[[i]]>4)] <- NA
}
# for 1 到 3(4笔资料-1自己),逐步随着i值相加,最后将大于4的设为NA
tmp1 <-lapply(tmp1, function(x) x[!is.na(x)])
# 把NA 删掉
tmp_vector<-vector()
for (i in 1:3){
for(k in 1:length(unlist(tmp1[i]))){
for(j in unlist(tmp1[i])[k]){
kai<-kai_dtw(x=unlist(data.list[i]) ,y=unlist(data.list[j]),
g=0, step.pattern = symmetric1)
tmp<- kai$distance
tmp_vector <- c(tmp_vector,tmp)
}
}
}
# 多层循环,达到我要两两比较的意境,当中的kai_dtw是我修改算法的函式
它对应的x与y一定要unlist,后面就是将其取distance存在vector中
tmp_vector1 <- matrix(nrow = 4,ncol = 4)
tmp_vector1 <- as.dist(tmp_vector1)
tmp_vector1[1:6] <- tmp_vector
# 创一个空的矩阵(tmp_vector1)m,并转算距离矩阵的形式,将前述得到的vector
填入,得到我要的结果
[关键字]: dtw , 距离矩阵 ,两两比较
以上 就是我的问题叙述,不晓得有没有表达清楚
基本上就是多层循环太慢了,我也正在尝试使用lapply家族进行运算
谢谢~~
作者: andrew43 (讨厌有好心推文后删文者)   2017-08-30 14:27:00
我觉得瓶颈应该是你的算法不够快,倒不是填值的loop
作者: celestialgod (天)   2017-08-30 20:10:00
preallocation还有 你有必要先搞动[跟[[....懂kai_dtw这个函数怎么实做讲出来比较快这个函数可能是最大的瓶颈

Links booklink

Contact Us: admin [ a t ] ucptt.com