时间序列数据变点检测

time series data change point detection

我正在尝试将时间序列数据分割成不同的区域。

在每个时间段内,压力 运行 低于允许的最大压力水平(事先未告知)。请看下面的图片。

编辑每个时间段一周多.

如何检测不同时间段的开始/结束?谁能给我指明方向?

一旦划分了不同时区的时间,我想我可以平均每个区域的几个最大读数以获得最大允许压力。

我会假设 1 小时的足够值。然后计算平均值。 之后,您设置与之前的平均值相关的平均值。 一些伪代码,使其可视化。

class Chunk:
  private double[] values;//For one hour, for example.
  double average();
enum Relation:
  FALLING,RISING,EQUAL

func algorithm(Chunk[] chunks){
  double averages=new double[chunks.length];
  for(int i=0;i<chunks.length;i++)
    averages[i]=chunks[i].average();
  //Got averages, now make it rising or falling or stay same.
  Relation[] relations=new Relation[chunks.length];
  for(int i=1;i<chunks.length;i++){
    double diff=averages[i]-averages[i-1];
    if(diff==0) //TODO, a bit of difference is allowed (Like deviations of +-3)
     relations[i]=EQUALS;
    else
     relations[i]=diff>0?RISING:FALLING;
  }
 // After that, you have to find sequences of many FALLING or RISING, followed by many EQUALS
}

要继续这个 Relation 的数组,您可以将它分成更小的数组,计算平均值(例如 FALLING=0,RISING=1,EQUAL=2)。之后你只需像这样“合并”它们:

F=FALLING
R=RISING
E=EQUALS
//Before merging
[RREEEEFFEEEEERRREEEE]
//After merging
[REFERE]

在那里你可以看到山脉和山谷。

现在,要获得准确的值,当山脉或山谷开始时,您必须稍微扩展 Chunk

class Chunk:
  //The value on x-Axis + the value of y-Axis
  private Tuple<Time,Double>[] values;
  //Tuple of Range, this chunk uses and the average value of this range
  Tuple<Tuple<Time,Time>,double> average();

此外,你不能再使用原始 Relation,你必须用 Range 包裹它,从它开始到结束。