i具有数据信号,该数据信号是在500ms恒定时间间隔生成的。这是一个现实世界的测量,因此在其基线中表现出一些噪音。噪声相当一致。
我以常规时间间隔获得测量,并将其存放在样品数据的圆形滚动缓冲液中。该滚动缓冲区是位于位置(0,1,2,3,4,5 ... -> n(的值数组。一旦到达此数组中的第n个位置,我的缓冲区就会翻滚并覆盖0位阵列位置的值,然后在第一个数组位置处的值,依此类推,直到第n个位置的值被覆盖为覆盖(然后再次滚动(。这个过程一遍又一遍地重复。我使用滚动样品缓冲区来计算移动平均线和STD DEV,并使用缓冲区中的数据进行线性外推计算。
现在就我的问题:
现实世界信号有可能在3个州处于。随着时间的流逝,以未知率的时间增加,或者以未知率的时间减少,或者也可以随着时间的流逝保持相当恒定,直到检测到增加或减少为止。(我需要从相当稳定的基线中检测到增加或减少(在任何时候都可以增加这种减少。
我想检测信号是否随着时间的推移会增加,随着时间的流逝而减小,或者随着时间的流逝保持恒定,并以良好的确定性程度。从图形上讲,我期望我的数据在一定的基线值下波动,并保持恒定,直到一段时间T1截至此时信号将增加或减少,并继续增加或减少,直到状态变化的时间T2。什么样的算法会有效地注意到这一点?
我在想使用从数组中的数据点计算得出的导数,如果切线线的斜率为正,则图表随着时间的推移而增加,如果为负,则降低,如果0降低,则该图是恒定的吗?不确定如何在我的滚动阵列上或是否有效地在Java中实现它。
我认为,如果我的数据高于或低于移动平均线的3*stddev,那是相当可靠的增加/减少信号,但我不确定是这样。
圆形阵列:
private final static int NUM_SAMPLES = 100;
double[] samples = new double[NUM_SAMPLES];
int sampleIndex;
public boolean isBufPopulated() {
synchronized(this) {
return this.isBufPopulated;
}
}
public void addSample(double val) {
synchronized(this) {
samples[sampleIndex++] = val;
if(sampleIndex == NUM_SAMPLES) {
sampleIndex = 0;
isBufPopulated = true;
}
this.avg = calcAvg();
}
}
我的现实世界基线看起来像这样:
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -9 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -11 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -11 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -11 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -11 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -11 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -11 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -11 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 1 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -2 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -4 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= -7 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
data= 3 avgData= -3 stdDevData= 3 extrapolatedData= -3
我会发表评论,因为它只是一些建议和参考,但是太长了。
统计数据很棘手,易于计算且难以解释。
如果这是一个数学问题,我想我可以给您建议,但不能答案。
在很大程度上取决于您的信号,甚至是噪声的 shape ,包括您可以(或没有(异常值的事实(阅读可以远离平均从实际可测量(。
然后,还必须满足您的申请。您可以在价值的度量和更改的实际检测之间有多少延迟?
我能告诉你的是,圆形缓冲区的想法非常好。您应该确实避免尽可能多地使用新的分配对象,因为GC可以在这里成为您的敌人。
500ms给您一些余地,但您仍然需要检查记忆,以避免长时间的GC停止暂停。
您可以在不重新阅读所有缓冲区的情况下计算平均运行平均值甚至是运行标准偏差。
检查此答案以提供一些计算建议。
我将比较2个子样本,并通过比较一个子样本除以第一个子样本Sigma的平均值是否大于另一个样本,并试图通过调整未更改和假阳性之间的良好折衷样品的大小,偏移/重叠和触发更改所需的Sigma。
我也考虑使用中位数而不是平均值,以便在需要时对异常值不太敏感。
我也会发表评论,但时间太长。
我计算我的std dev,平均使用以下代码:
注意*我有一个Java Swing Worker,可以处理我的多线程内容,这就是为什么我的方法必须同步的原因。
public double getLatestSample() {
synchronized(this) {
return samples[getCircularIndex(sampleIndex-1,NUM_SAMPLES)];
}
}
public double getAverage() {
synchronized(this) {
return this.avg;
}
}
public double getStdDev() {
synchronized(this) {
double sum = 0;
for(int i = 0; i < samples.length; i++) {
double x = samples[i];
sum += (x-avg)*(x-avg);
}
return Math.sqrt(sum / (samples.length-1));
}
}
public double getExtrapolatedValue() {
synchronized(this) {
double sum = 0;
for(int i = 0; i < samples.length; i++) {
sum += i * (samples[getCircularIndex(i-samples.length, samples.length)] - avg);
}
double m = sum/samples.length;
double b = avg - m;
return m+b;
}
}
private double calcAvg() {
synchronized(this) {
double sum = 0;
for(int i = 0; i < samples.length; i++) {
sum += samples[i];
}
return sum/samples.length;
}
}
private int getCircularIndex(int i, int N) {
return (i + N) % N;
}
子样本的想法相当不错,我很好奇是否也要接受衍生品会告诉我更准确的变化速度。如果我能够获得由存储在缓冲区中的所有数据点表示的曲线的切线线的斜率,那么我可以通过斜率是否在增加或减少整体信号在增加或减少或恒定(我认为((我认为(正,负或大约0。
您将如何从滚动缓冲区中的样品中计算出衍生物?