我有一系列的数据点需要用图表表示。对于每个图,由于错误,可能需要抛出一些点。下面是一个示例:

圈出的区域是数据中的错误。
我需要的是一种算法来过滤这些数据,这样它就可以通过用平坦的线替换坏点来消除错误,如下所示:

有没有特别擅长检测错误点的算法?你有什么建议可以指引我正确的方向吗?
编辑:错误点是任何看起来与两侧数据不一致的点。可以有大的跳跃,只要跳跃后的数据看起来仍然是一致的。如果它在图的边缘,那么大的跳跃可能会被认为是错误的。
发布于 2010-09-18 04:58:06
这是一个很难普遍解决的问题;您的最终解决方案最终将非常依赖于流程,并且对于您的情况是独一无二的。
也就是说,你需要从理解你的数据开始:从一个样本到下一个样本,什么样的变化是可能的?使用它,您可以使用以前的数据样本(也可能是未来的数据样本)来确定当前样本是否为伪样本。然后,您将得到一个类似于以下内容的过滤器:
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值。您可以将上面的逻辑单独应用于每个维度,如果只有一个维度给出了错误的数字,这将是合适的。例如,在一个维度是时间戳,并且时间戳偶尔是假的情况下,这可能特别成功。
发布于 2010-09-18 05:20:01
如果无法用眼睛去除异常值,请尝试克里金法(带误差项),如http://www.ipf.tuwien.ac.at/cb/publications/pipeline.pdf中所示。这似乎可以很好地自动处理偶尔的极端噪音。我知道法国气象学家使用这样的方法来去除数据中的异常值(例如,温度传感器旁边的火灾或踢风传感器的东西)。
请注意,这通常是一个困难的问题。有关错误的任何信息都是宝贵的。是不是有人踢了测量装置?然后,除了手动删除有问题的数据之外,您不能做太多事情。你的噪音是系统性的吗?你可以通过对它进行(合理的)假设来做很多事情。
https://stackoverflow.com/questions/3738334
复制相似问题