首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何过滤这些数据?

我应该如何过滤这些数据?
EN

Stack Overflow用户
提问于 2010-09-18 03:25:15
回答 2查看 190关注 0票数 1

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

圈出的区域是数据中的错误。

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

有没有特别擅长检测错误点的算法?你有什么建议可以指引我正确的方向吗?

编辑:错误点是任何看起来与两侧数据不一致的点。可以有大的跳跃,只要跳跃后的数据看起来仍然是一致的。如果它在图的边缘,那么大的跳跃可能会被认为是错误的。

EN

回答 2

Stack Overflow用户

发布于 2010-09-18 04:58:06

这是一个很难普遍解决的问题;您的最终解决方案最终将非常依赖于流程,并且对于您的情况是独一无二的。

也就是说,你需要从理解你的数据开始:从一个样本到下一个样本,什么样的变化是可能的?使用它,您可以使用以前的数据样本(也可能是未来的数据样本)来确定当前样本是否为伪样本。然后,您将得到一个类似于以下内容的过滤器:

代码语言:javascript
复制
    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函数示例,它基于数据的一阶导数(即,当您只查看数据的一小部分时,它假定数据大致是一条直线)。

代码语言:javascript
复制
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值。您可以将上面的逻辑单独应用于每个维度,如果只有一个维度给出了错误的数字,这将是合适的。例如,在一个维度是时间戳,并且时间戳偶尔是假的情况下,这可能特别成功。

票数 2
EN

Stack Overflow用户

发布于 2010-09-18 05:20:01

如果无法用眼睛去除异常值,请尝试克里金法(带误差项),如http://www.ipf.tuwien.ac.at/cb/publications/pipeline.pdf中所示。这似乎可以很好地自动处理偶尔的极端噪音。我知道法国气象学家使用这样的方法来去除数据中的异常值(例如,温度传感器旁边的火灾或踢风传感器的东西)。

请注意,这通常是一个困难的问题。有关错误的任何信息都是宝贵的。是不是有人踢了测量装置?然后,除了手动删除有问题的数据之外,您不能做太多事情。你的噪音是系统性的吗?你可以通过对它进行(合理的)假设来做很多事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3738334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档