[問題] 兩兩比較運算

作者: 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