【问题标题】:SAX Representation of Time Series时间序列的 SAX 表示
【发布时间】:2015-06-05 20:07:09
【问题描述】:

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

我正在对数据进行规范化,但我不知道之后如何计算 PAA。有什么解决办法吗?

【问题讨论】:

    标签: sql time visualization series


    【解决方案1】:

    我将使用来自 Keogh's paper 的 PAA 示例,并说明使用 R 的分段聚合近似将由 8 个点组成的时间序列转换为 2 个点。

    所以,这里是数据,我有点突出显示前四个点和最后四个点(两个部分),它们的值将被聚合成一个表示“部分”的值:

    // 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)
    

    现在,按照 PAA 程序,我们计算每个四点长度段的平均值(即,我们将四个点的值聚合为一个点):

    // 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)
    

    为了执行转换,我定义了一个函数,它首先将原始时间序列“分解”成一个矩阵,其行数等于 PAA 大小,列数等于原始时间序列长度,其行values 是输入的时间序列值。其次,我将该矩阵“重塑”为列数等于 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)
    

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

    具体而言,分段聚合近似 (PAA) 在 this class 中实现

    谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多