时间序列数据变点检测
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 包裹它,从它开始到结束。
我正在尝试将时间序列数据分割成不同的区域。
在每个时间段内,压力 运行 低于允许的最大压力水平(事先未告知)。请看下面的图片。
编辑每个时间段一周多.
如何检测不同时间段的开始/结束?谁能给我指明方向?
一旦划分了不同时区的时间,我想我可以平均每个区域的几个最大读数以获得最大允许压力。
我会假设 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 包裹它,从它开始到结束。