2015-04-01 95 views
3

要创建时间序列的SAX表示,首先需要计算数据的PAA(分段聚合逼近),然后将答案映射到符号表。但是在计算PAA之前,您需要对数据进行归一化处理。SAX时间序列表示

我正在规范数据,但我不知道如何计算PAA后。任何解决方案

回答

3

我要使用从本Keogh's paper PAA的一个例子,示出了变换由8点到使用利用R.

所以逐段骨料近似2点的时间系列,这里是数据和I之类的突出显示,其值将要被聚合到一个表示“片”的单一值的四个第一和最后四个点(两片):

// data 
X = c(-1, -2, -1, 0, 2, 1, 1, 0) 

// let's plot it 
plot(X,type="l",lty=2,main="PAA example") 
points(X[1:4],pch=16,lwd=5) 
points(y=X[5:8],x=c(5:8),pch=17,lwd=5) 
abline(v=c(1,4,5,8),lty=3,lwd=2) 

enter image description here

现在,遵循PAA程序,我们计算每个四点长度段的平均值(即,我们汇总的四点值到一个点):

enter image description here

现在让我们改造相同的8分长的时间序列:

// compute the PAA value for the first segment 
p1=mean(X[1:4]) 

segments(1,p1,4,p1,lwd=2,col="blue2",lty=3) 
points(x=2.5,y=p1,col="blue2",pch=23,lwd=20) 

// compute the PAAvalue for the second segment 
p2=sum(X[5:8])/4 

segments(5,p2,8,p2,lwd=2,col="darkorchid2",lty=3) 
points(x=6.5,y=p2,col="darkorchid2",pch=23,lwd=20) 

在这里,我们在图中显示的这两个PAA值分成三个PAA点。但是在这里我们碰到一个问题,当8/3没有产生一个整数时,所以我们需要在这些段上添加一部分“属于”到相邻段的点值。在这里,我显示出相同的时间序列的三段需要被转换成PAA值:

plot(X,type="l",lty=2,main="PAA example #2") 
points(X,pch=16,lwd=5) 
abline(v=c(1,1+7/3,1+7/3*2,8),lty=3,lwd=2) 

enter image description here

要执行变换,我定义起初“爆炸”的函数的原始时间序列成行数等于PAA大小和等于原始时间序列长度的列数的矩阵,其行值是输入时间序列值。其次,我将这个矩阵“重塑”为列数等于PAA大小和行数等于输入时间序列长度的矩阵。最后,为了得到PAA值,我计算矩阵列的平均值。

请注意,我用的是matlab库重塑其表示输入的时间序列矩阵:

library(matlab) 
paa <- function(ts, npoints){ 
    len <- length(ts) 
    if(len != npoints){ 
    if((len %% npoints) == 0){ 
     res <- reshape(ts, len %/% npoints, npoints) 
    }else{ 
     tmp <- matrix(rep(ts, npoints), byrow = T,nrow = npoints) 
     res <- reshape(tmp, len, npoints) 
    } 

    matrix(colMeans(res), nrow=1, ncol=npoints) 

    } else { 
    ts 
    } 
} 

让我们来看看对剧情这些PAA值:

p3=paa(t(X),3) 
segments(1,p3[1],1+7/3,p3[1],lwd=2,col="red") 
points(x=1+7/3/2,y=p3[1],col="red",pch=23,lwd=20) 
segments(1+7/3,p3[2],1+7/3*2,p3[2],lwd=2,col="red") 
points(x=1+7/3+7/3/2,y=p3[2],col="red",pch=23,lwd=20) 
segments(1+7/3*2,p3[3],8,p3[3],lwd=2,col="red") 
points(x=1+7/3*2+7/3/2,y=p3[3],col="red",pch=23,lwd=20) 

enter image description here

对于生产,我已经通过滑动窗口使用Java中的Symbolic Aggregate Approximation(SAX)实现了时间序列的离散化。这是我的library,它实现了SAX转换及其并行版本。

具体来说,分段聚集近似(PAA)在this class

感谢实现!