我有一系列需要绘制的数据点。对于每个图形,由于错误可能需要丢弃一些点。一个例子如下:
圆圈区域是数据中的错误。
我需要的是一种算法来过滤这些数据,以便通过用平线替换坏点来消除错误,如下所示:
有没有特别擅长检测错误点的算法?你有什么建议可以为我指明正确的方向吗?
编辑:错误点是任何看起来与双方数据不一致的点。可以有很大的跳跃,只要跳跃后的数据看起来仍然一致。如果它在图的边缘,大的跳跃可能应该被认为是错误的。
我有一系列需要绘制的数据点。对于每个图形,由于错误可能需要丢弃一些点。一个例子如下:
圆圈区域是数据中的错误。
我需要的是一种算法来过滤这些数据,以便通过用平线替换坏点来消除错误,如下所示:
有没有特别擅长检测错误点的算法?你有什么建议可以为我指明正确的方向吗?
编辑:错误点是任何看起来与双方数据不一致的点。可以有很大的跳跃,只要跳跃后的数据看起来仍然一致。如果它在图的边缘,大的跳跃可能应该被认为是错误的。
这是一个很难普遍解决的问题;您的最终解决方案最终将非常依赖于流程,并且对您的情况是独一无二的。
话虽如此,您需要从了解您的数据开始:从一个样本到下一个样本,可能会有什么样的变化?使用它,您可以使用以前的数据样本(可能还有未来的数据样本)来确定当前样本是否是伪造的。然后,你会得到一个看起来像这样的过滤器:
const int MaxQueueLength = 100; // adjust these two values as necessary
const double MaxProjectionError = 5;
List<double> FilterData(List<double> rawData)
{
List<double> toRet = new List<double>(rawData.Count);
Queue<double> history = new Queue<double>(MaxQueueLength); // adjust queue length as necessary
foreach (double raw_Sample in rawData)
{
while (history.Count > MaxQueueLength)
history.Dequeue();
double ProjectedSample = GuessNext(history, raw_Sample);
double CurrentSample = (Math.Abs(ProjectedSample - raw_Sample) > MaxProjectionError) ? ProjectedSample : raw_Sample;
toRet.Add(CurrentSample);
history.Enqueue(CurrentSample);
}
return toRet;
}
那么,神奇的是你的 GuessNext 函数。在这里,您将进入针对您的具体情况的内容,并且应该考虑您所知道的关于收集数据的过程的所有内容。输入变化的速度是否存在物理限制?您的数据是否具有可以轻松过滤的已知不良值?
这是 GuessNext 函数的一个简单示例,该函数使用数据的一阶导数(即,当您只查看数据的一小部分时,它假定您的数据大致是一条直线)
double lastSample = double.NaN;
double GuessNext(Queue<double> history, double nextSample)
{
lastSample = double.IsNaN(lastSample) ? nextSample : lastSample;
//ignore the history for simple first derivative. Assume that input will always approximate a straight line
double toRet = (nextSample + (nextSample - lastSample));
lastSample = nextSample;
return toRet;
}
如果您的数据特别嘈杂,您可能需要在将其传递给 GuessNext 之前对其应用平滑过滤器。您只需要花一些时间在算法上就可以提出对您的数据有意义的东西。
您的示例数据似乎是参数化的,因为每个样本都定义了 X 和 Y 值。您也许可以将上述逻辑独立地应用于每个维度,如果只有一个维度是给您错误数字的维度,这将是合适的。例如,在一维是时间戳的情况下,这可能特别成功,并且时间戳有时是伪造的。
如果无法通过肉眼去除异常值,请尝试使用http://www.ipf.tuwien.ac.at/cb/publications/pipeline.pdf中的克里金法(带有错误术语) 。这似乎可以很好地自动处理偶尔的极端噪音。我知道法国气象学家使用这种方法来消除他们数据中的异常值(例如温度传感器旁边的火或踢风传感器的东西)。
请注意,这通常是一个难题。任何有关错误的信息都是宝贵的。有人踢了测量装置吗?那么除了手动删除有问题的数据之外,您将无能为力。你的噪音是系统的吗?然后,您可以通过对它做出(合理的)假设来做很多事情。