要创建时间序列的SAX表示,首先需要计算数据的PAA(分段聚合近似),然后将答案映射到符号表。但是,在计算PAA之前,您需要对数据进行标准化。
我正在规范数据但我不知道如何计算PAA。有解决方案吗
答案 0 :(得分:3)
我将使用此Keogh's paper中的PAA示例,并使用R来说明使用分段聚合近似将由8个点组成的时间序列转换为2个点。
所以,这是数据,我有点突出显示了四个第一个和第四个最后一个点(两个部分),它们的值将聚合成一个代表一个&#34;件&#34;:<的值/ p>
// 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没有产生一个整数时,我们需要添加&#34;属于&#34;的一小部分。到相邻的段,将值指向这些段。在这里,我展示了需要转换为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)
为了执行变换,我定义了一个函数,它首先爆炸&#34;将原始时间序列转换为矩阵,其行数等于PAA大小,列数等于原始时间序列长度,其行值是输入时间序列值。其次,我&#34;重塑&#34;该矩阵为其列数等于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中的Symbolic Aggregate approXimation(SAX)滑动窗口实现了时间序列的离散化。这是我的library,它实现了SAX转换及其并行化版本。
具体而言,分段聚合近似(PAA)在this class
中实现谢谢!