Функция для проверки стабильности системы, которая получает прогнозные временные ряды в качестве входных данных - PullRequest
9 голосов
/ 21 мая 2019

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

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

Мой подход к такой функции, который описан ниже:

vector<tuple<datetime, double>> get_adjusted_timeseries(vector<tuple<datetime, double>>& timeseries_original, const double stddev, const double dist_mid)
{

    auto timeseries_copy(timeseries_original);

    int sign = randInRange(0, 1) == 0 ? 1 : -1;


    auto left_limit = normal_cdf_inverse(0.5 - dist_mid, 0, stddev);
    auto right_limit = normal_cdf_inverse(0.5 + dist_mid, 0, stddev);

    for (auto& pair : timeseries_copy)
    {
        double number;
        do
        {
            nd_value = normal_distribution_r(0, stddev);
        }
        while (sign == -1 && nd_value > 0.0 || sign == 1 && nd_value < 0.0);


        pair = make_tuple(get<0>(pair), get<1>(pair) + (nd_value / 100) * get<1>(pair));


        if (nd_value > 0.0 && nd_value < right_limit || nd_value < 0.0 && nd_value > left_limit)
        {
            sign = sign == -1 ? 1 : -1;
        }
    }

    return timeseries_copy;
}
  • Сделать копию из исходного времениряд, который также относится к типу vector<tuple<datetime, double>>
  • Получите случайное число 0 или 1 и используйте число для установки знака.
  • Используйте функцию обратного кумулятивного распределения, чтобы получитьпределы, которые указывают, когда знак изменяется.Знак изменяется, когда значение скопированного временного ряда близко к исходному значению. Здесь показана реализация обратного CDF enter image description here
  • Цикл For для каждого элемента во временном ряду:
    • получить нормальное значениераспределенное значение, которое должно быть ниже нуля при sign == -1 и больше нуля при sign == 1
    • отрегулировать старое значение временного ряда в соответствии с нормальным распределенным значением
    • изменить sign если нормальноераспределенное значение близко к исходному значению.

Результат для низкого стандартного отклонения, например, можно увидеть здесь желтым цветом: enter image description here Если вычислена средняя абсолютная процентная ошибка (MAPE) двух временных рядов, получится следующее соотношение:

  • stddev: 5 -> MAPE: ~ 0,04
  • stddev: 10-> MAPE: ~ 0,08
  • stddev: 15 -> MAPE: ~ 0,12
  • stddev: 20 -> MAPE: ~ 0,16

Что вы думаете оэтот подход?

Можно ли использовать эту функцию для тестирования системы, которая имеет дело с предсказанными временными рядами?

1 Ответ

1 голос
/ 01 июня 2019

Вы хотите сгенерировать данные временных рядов, которые будут вести себя как некоторые существующие данные временных рядов, которые у вас есть из реальных явлений (погода и фондовая биржа).Эти сгенерированные данные временного ряда будут поданы в некоторую систему для проверки ее стабильности.

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

Например, если вы знаете, что ваши данные линейны, выпроведите линию через них, и ваша модель будет иметь вид:

y = M x + B + E

, где E - случайная величина, которая следует за распределением ошибки вокруг линии, которая соответствует вашим данным, а где M иB - параметры модели.Теперь вы можете использовать эту модель для генерации (x, y) координат, которые являются линейно линейными.При выборке случайной величины E вы можете предположить, что она следует некоторому известному распределению, например нормальному распределению, или использовать гистограмму для генерации отклонений, которые следуют за произвольными функциями плотности.

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

Если модель не подходит вашим данным, вы также можете увидеть ее параметры в качестве случайных величин.В нашем примере выше, предположим, что мы наблюдали данные, когда кажется, что наклон меняется.Мы бы поместили несколько строк и получили бы распределение для M.Затем мы сэмплируем эту переменную вместе с E при генерации данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...