sql - 时间序列的 SAX 表示

标签 sql time visualization series

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

我正在对数据进行标准化,但我不知道之后如何计算 PAA。任何解决方案?

最佳答案

我将使用此 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)

enter image description here

现在,按照 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 值:

enter image description here

现在让我们将相同的八点长度时间序列转换为三个 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 大小,列数等于原始时间序列长度,其行值为输入时间序列值。其次,我将该矩阵“ reshape ”为列数等于 PAA 大小且行数等于输入时间序列长度的矩阵。最后,为了获得 PAA 值,我计算了矩阵列的均值。

请注意,我使用了 matlab用于 reshape 表示输入时间序列的矩阵的库:
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 中实现

谢谢!

关于sql - 时间序列的 SAX 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29386357/

相关文章:

sql - 将日期时间转换为 Unix 时间戳

mysql - 简单查询 - 为什么会抛出错误?

php - 时间到日期转换

Java Time - 在终端中输入并查看是否在范围内

Php 计算从 PM 到 AM 经过的小时数

javascript - 可视化分布随时间的变化

python - 保存到 eps 的 Seaborn 图不显示网格

php - MySQL 子查询重用

mysql - 从mysql数据库表中同时进行多个选择

r - corrplot 的非均匀色标