Обработка научных данных (сравнение и интерпретация графиков) - PullRequest
3 голосов
/ 29 мая 2010

Я пытаюсь написать программу для автоматизации одного из моих скучных и повторяющихся рабочих заданий. У меня есть некоторый опыт программирования, но нет опыта работы с большими объемами данных или их интерпретации, поэтому я обращаюсь к вам за советом (как предложения методов, которые нужно попробовать, так и материалы для чтения, чтобы узнать больше о том, как делать это).

У меня есть оборудование, которое следит за экспериментом, отбирая повторные пробы, и отображает показания на экране в виде графика. Исход эксперимента может быть изменен, и одно из этих изменений должно привести к изменению раздела графика, который я в настоящее время определяю на глаз и который я ищу в эксперименте. Я хочу автоматизировать его так, чтобы компьютер просматривал набор результатов и определял входные данные эксперимента, которые вызывают изменения.

Я уже могу извлечь результаты из машины. В настоящее время результаты для прогона представлены в виде целочисленного массива с индексом, представляющим номер выборки, и соответствующим значением, являющимся измерением.

Общая форма графика будет одинаковой для каждого эксперимента. Изменения, которые я ищу, будут примерно одинаковыми и будут происходить примерно в одном и том же месте каждый раз для правильного ввода эксперимента. К сожалению, есть несколько ошибок, которые усложняют эту проблему.

  1. В процессе измерения присутствует некоторый шум, который означает, что между различными прогонами есть некоторые случайные изменения измеренных значений. Хотя общая форма графика остается прежней.

  2. Время, затрачиваемое на эксперимент, незначительно меняется при каждом запуске, вызывая два эффекта. Во-первых, весь график может быть немного смещен по оси x относительно графика другого прогона. Во-вторых, отдельные элементы могут выглядеть немного шире или уже в разных сериях.

В обоих этих случаях вариация не особенно велика, и вы можете предположить, что единственное неслучайное отклонение вызвано найдением правильного ввода.

Ответы [ 2 ]

2 голосов
/ 29 мая 2010

Я думаю, вы ищете информацию о Цифровая обработка сигналов . Он может варьироваться от очень простого до очень сложного для понимания. Если, скажем, ваш сигнал перед событием был 0, а каждый сигнал после соответствующего сигнала - 1, вы можете просто найти первую 1, выяснить время, когда это произошло, и все будет готово. Это в основном ограничивающий случай простоты, и это может быть хорошим местом для начала. Реализуйте это, и у вас есть представление о том, как ответить на ваш вопрос. Теперь у вас есть шум. Так, скажем, до события может варьироваться от -10 до 10, а после события может варьироваться от 90 до 110. Все еще просто; следите за первым значением больше 10. Но, конечно, все не так просто. Возможно, вам придется усреднить окно показаний, возможно, придется искать какой-то порог изменения по сравнению с предыдущим измерением и т. Д. В сложных случаях вы можете использовать преобразования в другие пространства, применять фильтры, сопоставление с образцом и тому подобное. Но из вашего описания звучит так, что достаточно простые методы должны сделать эту работу за вас. Не пугайтесь таких понятий, как FFT - они, вероятно, вам пока не нужны. Пока, по крайней мере, предположим, что это можно решить просто. Начните с тривиально простого (но недостаточного) решения и пройдите к решению, которое работает.

1 голос
/ 31 мая 2010

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

В случае, подобном вашему, идея состоит в том, чтобы иметь «идеальную» версию искомой формы кривой - либо сгенерированную из теории / моделирования, либо путем усреднения результатов ряда определенных экспериментальных кривых, определенных и выровнять на глаз - и сравнить его с экспериментальными данными.

Для простоты давайте предположим, что набор данных длиннее идеального и имеет достаточно свободного места на обоих концах, чтобы мы могли игнорировать любые проблемы с границами. Так как вы ищете одно конкретное событие, должно быть тривиально урезать ваш идеал, чтобы соответствовать этому предположению. Грубо закодированный в Java, процесс может выглядеть примерно так:

int offset ( double[] data, double[] ideal )
{
    double cMax = -Double.MAX_VALUE;
    int tMax = 0;

    for ( int t = 0; t < data.length - ideal.length; ++t )
    {
        double c = 0;
        for ( int i = 0; i < ideal.length; ++i )
        {
            c += data[t + i] * ideal[i];
        }

        if ( c > cMax )
        {
            cMax = c;
            tMax = t;
        }
    }

    return tMax;
 }

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

...