Re: [問題] 有關時間序列資料計算DTW問題

看板R_Language作者 (天)時間10年前 (2015/10/14 13:43), 10年前編輯推噓2(201)
留言3則, 1人參與, 最新討論串2/2 (看更多)
笨方法: 每一種長度的距離都算一次,存進distMatrix裡面 不知道怎麼加速(攤手 library(dtw) test=read.csv("C:\\Users\\user_148\\Downloads\\test.csv", header = FALSE) test = as.matrix(test) dtw_f = function(i, j){ dtw(test[!is.na(test[,i]), i],test[!is.na(test[,j]),j])$distance } loc_mat = as.matrix(expand.grid(1:ncol(test.fr), 1:ncol(test.fr))) distMatrix = mapply(function(x,y) dtw_f(x,y), loc_mat[,1], loc_mat[,2]) dim(distMatrix) = rep(ncol(test), 2) ※ 引述《sinclairJ (SunnyGymBoy)》之銘言: : 資料檔:https://www.dropbox.com/s/3wh4o9c0l5pplwq/test.csv?dl=0 : 資料檔說明:資料檔維度為60*99,有99條時間序列 : (每條時間序列長度不一,長度最長為60(可視為60個單位時間點)) : 問題描述:因現實資料的關係,有些時間序列會有NA值 : 但查過文獻之後,這不影響分析 : 小弟主要要做的分析是1 by 1計算這些時間序列的相似性 : (而DTW就是一種可以計算兩條序列不等長(也可等長)的相似性之計算距離方法) : 而得出99*99的距離矩陣之後 再對距離矩陣做資料探勘中的分群 : 問題:因時間序列有NA值,所以不太能用自動化的方式一次完成99*99分析 : 小弟原本的程式碼如下 : test=read.csv("") #讀檔 : library(dtw) : DtstMatrix=dist(test,method="DTW") #執行這行會出現錯誤 : 所以小弟用比較笨的方法,用眼睛一條一條看,然把NA的值取出來再做計算 : 小弟此時的程式碼如下 : eg1.如果要計算等長的序列 : d1=dtw(test[,5],test[,6]) #以計算第5與第6條序列相似性為例 : d1$distance #看兩條序列的距離,越小表示越相似 : eg2.如果要計算不等長的序列 : d2=dtw(test[,5],test[c(1:45),7]) #以計算第5與第7條序列相似性為例 : 不過小弟要每條序列都與每條序列做一次計算然後得出99*99的距離矩陣 : 距離矩陣示意圖如下(28*28為例) : http://i.imgur.com/Tp5we4U.jpg
: 不知道各位前輩有沒有什麼較方便的方法可以教導小弟一下 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.73.190 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1444801404.A.806.html

10/15 09:55, , 1F
已經算很快的方法了 感謝大大~
10/15 09:55, 1F
我同學跟我說dtw是放兩個不等長的東西,只是NA要去掉 我一直以為是要等長...所以我取最小size去算 因此,我誤會你的意思了 程式有錯,我更正了

10/16 12:15, , 2F
謝謝e大用心 dtw方法論我也沒看的太仔細 只知道他可以
10/16 12:15, 2F

10/16 12:15, , 3F
處理不等長序列就先用了 感謝你教導~
10/16 12:15, 3F
嗯嗯 已修改文章 ※ 編輯: celestialgod (180.218.154.163), 10/18/2015 20:42:18
文章代碼(AID): #1M7UjyW6 (R_Language)
文章代碼(AID): #1M7UjyW6 (R_Language)