2014-09-09 3 views
1

특정 시계열 데이터를 표준 길이로 축소하고 확장하기 위해 R에 dtw 라이브러리를 사용하려고합니다.동적 시간 왜곡 이해

동등한 열을 갖는 세 개의 시계열을 고려하십시오. morefmobig 130이고 mosmall 본다 따라서 105

moref <- good_list[[2]] 
mobig <- good_list[[1]] 
mosmall <- good_list[[3]] 

의 길이와 mobigmosmall을 투사 할 것이다 (100), 길이 (행) (105)이며, 우리는 두 개의 정렬을 계산한다.

ali1 <- dtw(mobig, moref) 
ali2 <- dtw(mosmall, moref) 

우리는 결과 인 정렬 인쇄 할 경우

DTW alignment object 
Alignment size (query x reference): 130 x 105 
Call: dtw(x = mobig, y = moref) 
DTW alignment object 
Alignment size (query x reference): 100 x 105 
Call: dtw(x = mosmall, y = moref) 

그래서 정확히 우리가 원하는 무엇을? 내 이해에 따라 시계열을 줄이거 나 늘리려면 워핑 함수 ali1$index1 또는 ali1$index2을 사용해야합니다. 우리는 다음과 같은 명령

length(ali1$index1) 
length(ali2$index1) 
length(ali1$index2) 
length(ali2$index2) 

를 호출 할 경우, 결과는

[1] 198 
[1] 162 
[1] 198 
[1] 162 

이가 (아마 다른 벡터로 다스 려) 인덱스 벡터되어있다. 매핑 중 어떤 것을 사용할 수 있습니까? 그들 모두가 길지 않을까요?

답변

3

우선, index1index2은 검색어/입력 데이터를 참조/저장된 데이터에 매핑하거나 그 반대로 매핑하는 것과 동일한 길이의 두 벡터입니다.

데이터를 제공하지 않았으므로. 사람들에게 아이디어를주기위한 더미 데이터가 있습니다.

# Reference data is the template that we use as reference. 
# say perfect pronunciation from CNN 
data_reference <- 1:10 
# Query data is the input data that we want to map to our reference 
# say random youtube audio 
data_query <- seq(1,10,0.5) + rnorm(19) 
library(dtw) 
alignment <- dtw(x=data_query, y=data_reference, keep=TRUE) 
alignment$index1 
alignment$index2 
lcm <- alignment$costMatrix 
image(x=1:nrow(lcm), y=1:ncol(lcm), lcm) 
plot(alignment, type="threeway") 

여기에 출력한다 있습니다

> alignment$index1 
[1] 1 2 3 4 5 6 7 7 8 9 10 11 12 13 13 14 14 15 16 17 18 19 
> alignment$index2 
[1] 1 1 1 2 2 3 3 4 5 6 6 6 6 6 7 8 9 9 9 9 10 10 

enter image description here

enter image description here 그래서 기본적 index2에 index1의 행 매핑은 참조 데이터에 대한 입력 데이터를 매핑하는 방법이다.

즉, 입력 데이터의 10 번째 데이터 점이 템플릿의 6 번째 데이터 점과 일치합니다.

index1의 : 쿼리

index2에 대한 워프 기능 φx (K) : 참조

에 대한 워프 기능 φy (K) - 토니 Giorgino 귀하의 질문에 당

, 기본적으로 최적의 경로 좌표이므로 m+n (매우 얕은) 또는 min(m,n) (완벽한 대각선) 길이가 될 수 있기 때문에 "인덱스 길이에 대한 처리는 무엇입니까?" 분명히 사람들을 조금 괴롭히는 일대일 매핑이 아니므로 여기에서 원하는 매핑을 선택하는 방법에 대해 자세히 조사 할 수 있습니다.


최고의 일대일 매핑을 선택하는 몇 가지 buildin 기능 기능이 있다면 나도 몰라. 하지만 한 가지 방법이 있습니다.

library(plyr) 
mapping <- data.frame(index1=alignment$index1, index2=alignment$index2) 
mapping <- ddply(mapping, .(index1), summarize, index2_new = max(index2)) 

이제 매핑은 쿼리에서 참조로 일대일 매핑을 포함합니다. 그런 다음 쿼리를 참조에 매핑하고 원하는 방식으로 매핑 된 입력의 크기를 조정할 수 있습니다.

필자는 줄 아래의 내용에 대해 확신 할 수 없으며 맵핑 및 확장이 어떻게 작동해야 하는지를 개선하기 위해 모든 것을 환영합니다.

참고 : 12

+0

당신은, 선생님, 메달을받을 자격이! – joachim

+0

@joachim,이 게시물의 미래 독자를 도울 수있는 방법으로 최종 결과를 공유 할 수 있다면. 그것은 매우 도움이 될 것입니다. 개인적으로 실제 응용 프로그램을 보지 못했고 궁금합니다. :) –