Algorithm 时间序列数据变化点检测

Algorithm 时间序列数据变化点检测,algorithm,time-series,language-agnostic,data-processing,timeserieschart,Algorithm,Time Series,Language Agnostic,Data Processing,Timeserieschart,我试图将时间序列数据分割成不同的区域 在每个时间段内,压力都在允许的最大应力水平下运行(事先未告知)。请看下面的图片 编辑每个时间段超过一周 如何检测不同时间段的开始/结束?有人能给我指个方向吗 一旦划分了不同的时区,我想我可以平均每个时区的几个最大读数,以获得最大允许应力。我会取1h的足够值。然后计算平均值。 之后,设置与之前的平均值相关的平均值。 一些伪代码,使其可视化 class Chunk: private double[] values;//For one hour, for e

我试图将时间序列数据分割成不同的区域

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

编辑每个时间段超过一周

如何检测不同时间段的开始/结束?有人能给我指个方向吗


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

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

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
}
在那里你可以看到群山和山谷

现在,要获得准确的值,当一座山或山谷开始时,您必须稍微扩展
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();
类块:
//x轴上的值+y轴上的值
私有元组[]值;
//该块使用的范围元组和该范围的平均值
元组平均值();

此外,您不能再使用原始的
关系
,您必须用范围来包装它,从开始到结束。

您知道一个区域的最小长度吗?一个区域超过一周@SaiBotok不确定你的量表是多少,但你不能按顺序浏览时间序列吗。在第一周的数据之后,计算最大值和最小值。然后继续,如果你低于最低(或高于最高)水平,记住这一点为x。如果您在x之后的1周内一直低于最小值(或高于最大值),则这是一个新区域,否则将其与以前的区域合并,并调整最大值和最小值。
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();