Как мне отфильтровать эти данные? - PullRequest
1 голос
/ 17 сентября 2010

У меня есть несколько рядов точек данных, которые нужно изобразить. Для каждого графика некоторые точки могут быть выброшены из-за ошибки. Примером является следующее: alt text

Обведенные кружком области - это ошибки в данных.

Мне нужен алгоритм для фильтрации этих данных, чтобы он устранял ошибку, заменяя плохие точки плоскими линиями, например:

alt text

Существуют ли какие-либо алгоритмы, которые особенно хороши для обнаружения точек ошибок? У вас есть какие-нибудь советы, которые могли бы указать мне правильное направление?

РЕДАКТИРОВАТЬ: точки ошибки - это любые точки, которые не соответствуют данным с обеих сторон. Могут быть большие скачки, пока данные после скачка все еще выглядят согласованными. Если он находится на краю графика, большие скачки, вероятно, следует считать ошибкой.

Ответы [ 2 ]

2 голосов
/ 18 сентября 2010

Это проблема, которую трудно решить вообще; Ваше окончательное решение будет зависеть от процесса и уникально для вашей ситуации.

При этом вам нужно начать с понимания ваших данных: от одного образца к другому, какой вариант возможен? Используя это, вы можете использовать предыдущие выборки данных (и, возможно, будущие выборки данных), чтобы решить, является ли текущая выборка фиктивной или нет. Затем вы получите фильтр, который выглядит примерно так:

    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. Возможно, вы сможете применить вышеупомянутую логику к каждому измерению независимо, что было бы целесообразно, если бы только одно измерение дало вам неправильные числа. Это может быть особенно успешным в тех случаях, когда, например, одно измерение является отметкой времени, а отметка времени иногда является фиктивной.

0 голосов
/ 18 сентября 2010

Если удаление выбросов на глаз невозможно, попробуйте кригинг (с ошибками), как в http://www.ipf.tuwien.ac.at/cb/publications/pipeline.pdf.Это, кажется, работает довольно хорошо, чтобы автоматически справляться со случайным экстремальным шумом.Я знаю, что французские метеорологи используют такой подход, чтобы устранить выбросы в своих данных (например, пожар рядом с датчиком температуры или что-то, пинающее датчик ветра).

Обратите внимание, что это сложная проблема в целом,Любая информация об ошибках драгоценна.Кто-то пнул измерительное устройство?Тогда вы ничего не можете сделать, кроме как вручную удалить оскорбительные данные.Ваш шум систематичен?Тогда вы можете сделать много вещей, выдвинув (разумные) гипотезы об этом.

...