作者celestialgod (天)
看板R_Language
标题Re: [问题] 有关时间序列资料计算DTW问题
时间Wed Oct 14 13:43:22 2015
笨方法:
每一种长度的距离都算一次,存进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://webptt.com/cn.aspx?n=bbs/R_Language/M.1444801404.A.806.html
1F:推 sinclairJ: 已经算很快的方法了 感谢大大~ 10/15 09:55
我同学跟我说dtw是放两个不等长的东西,只是NA要去掉
我一直以为是要等长...所以我取最小size去算
因此,我误会你的意思了 程式有错,我更正了
2F:推 sinclairJ: 谢谢e大用心 dtw方法论我也没看的太仔细 只知道他可以 10/16 12:15
3F:→ sinclairJ: 处理不等长序列就先用了 感谢你教导~ 10/16 12:15
嗯嗯
已修改文章
※ 编辑: celestialgod (180.218.154.163), 10/18/2015 20:42:18