作者pk790127 (<>)
看板R_Language
标题[问题] 两两比较运算
时间Wed Aug 30 14:09:03 2017
[问题类型]:
程式谘询(我想用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家族进行运算
谢谢~~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.116.86.113
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1504073346.A.4C9.html
※ 编辑: pk790127 (140.116.86.113), 08/30/2017 14:20:04
※ 编辑: pk790127 (140.116.86.113), 08/30/2017 14:21:59
1F:→ andrew43: 我觉得瓶颈应该是你的演算法不够快,倒不是填值的loop 08/30 14:27
2F:→ celestialgod: preallocation 08/30 20:10
3F:→ celestialgod: 还有 你有必要先搞动[跟[[.... 08/30 20:10
4F:→ celestialgod: 懂 08/30 20:10
5F:→ celestialgod: kai_dtw这个函数怎麽实做讲出来比较快 08/30 20:11
6F:→ celestialgod: 这个函数可能是最大的瓶颈 08/30 20:11