Вступление

Анализ временных рядов и методы прогнозирования незаменимы в нескольких областях, например, в технике, медицине, экономике, метеорологии и т. Д.

Существует несколько методов анализа и прогнозирования, от традиционных и освященных статистических инструментов (ARMA, ARIMA, SARIMA, Holt-Winters и т. Д.) До новых инструментов вычислительного интеллекта (рекуррентные нейронные сети, LSTM, GRU и т. Д.). Не существует идеального метода, ни тот, который я собираюсь здесь представить. Но некоторые ключевые особенности отличают нечеткие временные ряды и делают его привлекательным вариантом:

  • Читаемость
  • Управляемость
  • Простота
  • Масштабируемость

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

Что такое нечеткие множества?

Если вы уже знаете о нечеткой логике и нечетких наборах, вы можете перейти к следующему разделу. Здесь представлены как раз самые вводные концепции!

Теория логики и классическая математика определяют Набор как дихотомию: каждый элемент находится в ИЛИ вне множества. Середины тут нет! Членство в элементе - это логическое значение, то есть значение в наборе {0, 1}, налагающее на каждый набор строгие и негибкие границы.

Этот дихотомический образ мышления неудобен для человека, потому что бесчисленные реальности таковыми не являются. У нас возникнут трудности, когда мы попытаемся классифицировать людей по категориям со строгими ограничениями, например: вес = {худые, стройные, полные}, возраст = {ребенок, подросток, молодой, взрослый, пожилой}, рост = {низкий, средний, высокий}. Если мы хотим описать кого-то, использующего эти концепции хотя бы в одном из них, мы обнаружим, что этот человек может находиться в средней категории между этими двумя ценностями. Но классические / жесткие наборы не дают нам такой гибкости.

Нечеткая логика, предложенная Заде (1965), утверждает двойственность вместо этой дихотомии: определенный элемент может принадлежать и одновременно не принадлежать одному и тому же набору на определенных уровнях, так что членство является значением в интервале [0, 1]. Нечеткие множества не имеют строгих границ и обычно перекрываются, поэтому - используя предыдущий пример - я могу быть, например, средним высоким и средним или 90% средним и 10% высоким.

Дана X, числовая переменная, такая что X ∈ ℝ - например, мера высоты - ее Вселенная дискурса, сокращенно U - это диапазон значений, которые может принимать эта переменная, например, что U = [min (X), max (X)].

Лингвистическая переменная A - это преобразование значений числовой переменной X в набор слов / лингвистических терминов (то, что мы называем фаззификацией). Каждое слово / лингвистический термин представляет собой нечеткое множество ã ∈ Ã, и каждое нечеткое множество ã связано с функцией μ (греческая буква mu) , такое, что μã: X → [0,1] (это означает, что μã получает входное значение от X и возвращает выходное значение на интервале [0,1]) .

Вернемся к числовой переменной роста, измеряемой в сантиметрах. Мы определяем U = [20,220] и лингвистическую переменную Ã как:

à = { «очень маленький», «маленький», «короткий», «средний», «высокий», «очень высокий» }

Вы понимаете, что мы пытаемся сделать? Мы хотим прекратить работу с числовыми данными X и начать работать со словарем, выраженным Ã, и для этого нам нужно отобразить значения X для каждого набора ã ∈ Ã.

Мы сделаем это, разделив U на 6 перекрывающихся интервалов, по одному для каждого набора ã ∈ Ã. Для каждого интервала мы связываем функцию μã (X). Есть несколько типов функций принадлежности, но для упрощения мы будем использовать треугольную функцию принадлежности. Треугольная функция принадлежности может быть определена как:

def triangular(x, a, b, c):
    return max( min( (x-a)/(b-a), (c-x)/(c-b) ), 0 )

Где a, b и c рисует треугольник с a слева, b сверху и c как правая точка. Когда заданное входное значение x равно b, мы говорим, что оно на 100% находится внутри нечеткого набора (другими словами: его уровень членства равен 1). С другой стороны, членство увеличивается линейно от 0 до 1 на интервале [a, b] и линейно уменьшается от 1 до 0 на интервале [b, c ]. Если x меньше a или больше c, мы говорим, что x полностью вне нечеткого set (int другими словами: его статус членства равен 0).

Итак, как бы наши наборы выглядели для лингвистической переменной Ã?

Предположим, рост человека составляет 163 см. Для переменной Ã это будет 0,27 медиана и 0,73 высоты, то есть:

μ_median (163) = треугольник (163, 90, 130, 175) = 0,2666666…

μ_high (163) = треугольник (163, 130, 175 220) = 0,7333…

Посмотрите код здесь!

Но это только начало огромной области знаний. Если вы хотите узнать больше о нечеткой логике и нечетких системах….

Но где здесь говорить о временных рядах, верно? Итак, поговорим о времени!

Что такое временные ряды?

Если вы уже знаете о временных рядах, вы можете перейти к следующему разделу, он очень вводный!

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

Согласно Ehlers (2009), «соседние наблюдения являются зависимыми, и мы заинтересованы в анализе и моделировании этой зависимости». Что это обозначает? Чтобы предсказать будущие значения временного ряда, я использую прошлые / запаздывающие значения того же ряда.

Простым примером является авторегрессионная модель AR (p), где p указывает количество запаздывающих переменных, используемых при прогнозировании. Учитывая временной ряд X (t), где t обозначает момент времени, если мы собираемся использовать только запаздывание в прогнозе, тогда у нас есть AR (1 ) модель, это будет что-то вроде X (t) = α · X (t-1) + ε, где X (t-1) - запаздывающее значение, α - коэффициент, скорректированный статистическими методами, а ε - шум или случайная ошибка, которая указывает на неопределенность, связанную с этим прогнозом, ε ~ 𝓝 (0,1). Если мы хотим использовать последние два лага при прогнозировании, у нас будет модель AR (2), которая будет выглядеть примерно так: X (t) = α0 · X (t-1) + α1 · X (t-2) + ε.

Какое количество лагов и какие лаги следует использовать? Для этого необходимо изучить компоненты временных рядов и проанализировать их свойства, используя графики типа ACF и PACF. Обычно временные ряды моделируются (с использованием аддитивной модели) на высоком уровне как:

X(t) =C(t) + T(t) + S(t) + R(t)

Где:

  • t - временной индекс;
  • X (t) - точечная оценка ряда в момент времени t;
  • C (t) - циклическая составляющая, прогнозируемые краткосрочные / очень краткосрочные колебания;
  • T (t) - составляющая тренда, которая указывает на долгосрочное поведение ряда. Обычно имеется тенденция роста / подъема или уменьшения / спуска, в противном случае говорят, что ряд не имеет тенденции;
  • S (t) - сезонная составляющая, представляющая собой периодические средне- и долгосрочные колебания. Хороший пример сезонной составляющей… угадайте, что? Времена года! Это интервалы в 4 месяца, которые имеют свои собственные характеристики и повторяются ежегодно, что делает любую переменную с такой сезонностью намного более предсказуемой.
  • R (t) - составляющая шума, случайная величина с постоянным средним значением и дисперсией. Этот случайный шум непредсказуем!

Не все временные ряды имеют тенденцию или сезонность. Известно, что некоторые ряды являются стационарными, что означает, что их средние значения (более или менее) постоянны. В нестационарных рядах среднее значение изменяется со временем. В гомокедастических сериях дисперсия постоянна, а в гетероскедастических сериях дисперсия меняется со временем. Подводя итог: стационарные и гомоскедастические временные ряды «хорошо управляются» и их проще предсказать, а нестационарные и гетероскедастические ряды намного сложнее. В последнем случае мы можем применить математические преобразования (такие как дифференцирование, Бокс-Кокса и т. Д.), Чтобы сделать ряд стационарным и гомоскедастичным.

Но…. Где в этой истории появляются нечеткие множества?

Что такое нечеткие временные ряды?

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

Первой работой по нечетким временным рядам является Song and Chisson (1993), но здесь мы представляем эволюцию, опубликованную Chen (1996). Идея состоит в том, чтобы разделить Вселенную дискурса из временных рядов на интервалы / части (нечеткие множества) и узнать, как ведет себя каждая область (извлечение правил через шаблоны временных рядов). Правила этих моделей говорят о том, как разделы соотносятся сами с собой с течением времени, когда значения переходят из одного места в другое. Другими словами: давайте создадим лингвистическую переменную для представления числового временного ряда, и эти области будут лингвистическими терминами нашей переменной.

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

Для облегчения я разделю методологию нечетких временных рядов на две процедуры: обучение и прогнозирование.

Порядок обучения

В этом руководстве мы будем использовать очень известные временные ряды от истоков нечетких временных рядов: зачисления в университет Алабамы (зачисления). Вы можете увидеть данные ниже:

1. Определение универсума дискурса U
Сначала нам нужно узнать универсум дискурса U из обучающих данных, таких как U = [min (X), max (X)] . Обычно мы экстраполируем верхнюю и нижнюю границы на 20% в качестве запаса безопасности.

2. Создайте лингвистическую переменную Ã (Universe of Discourse Partitioning)
Теперь нам нужно разделить U на несколько перекрывающихся интервалов (также известных как разделы) и создать нечеткое множество для каждого из них. Количество интервалов - один из наиболее важных параметров нечетких временных рядов, который напрямую влияет на точность модели.

Помимо количества разделов, способ разделения U также имеет большое влияние на точность. В дальнейшем мы применяем простейший метод разбиения - Grid Partitioning, при котором все разделы имеют одинаковую длину и формат. Чтобы узнать о других методах разбиения, нажмите здесь. Для данных нашего примера мы будем использовать схему из 10 разделов, так что лингвистическая переменная будет Ã = {A0, A1,…, A9}.

3. Нечеткость
Теперь мы можем преобразовать числовые значения X (t) в нечеткие значения лингвистической переменной Ã, что приведет к нечетким временным рядам F (t ). Всегда полезно напоминать, что нечеткие множества на Ã перекрываются, поэтому для каждого x ∈ X (t) возможно, что он принадлежит более чем одному нечеткому множеству Ai ∈ Ã. В методах Chen все немного проще: выбирается только нечеткий набор максимального членства. Однако в других методах FTS учитываются все нечеткие значения.

Используя метод Чена, нечеткие значения для наших тестовых данных будут F (t) = {A1, A2, A2, A3, A4, A4, A4, A4, A5, A5, A5, A4, A4, A4, A4, A4, A5, A7, A8, A8, A8, A7}.

4. Создание временных шаблонов
Временные шаблоны обозначают два нечетких набора, которые появляются последовательно на нечетких временных рядах F (t) и имеют формат Precedent → Consequent , где прецедент указывает нечеткое множество по времени t, а следствие - нечеткое множество, которое появляется вскоре после времени t + 1.

Для предыдущего примера сгенерированные временные паттерны будут следующими:
A1 → A2, A2 → A2, A2 → A3, A3 → A4, A4 → A4,…, A8 → A8, A8 → A7

5. Создание правил
Наши модельные правила также имеют формат Precedent → Consequent. Учитывая ранее сгенерированные временные паттерны, мы сгруппируем их по прецедентам. Наша модель будет содержать правило для каждого обнаруженного прецедента, а следствием каждого правила будет объединение всех консеквентов каждого временного паттерна с одним и тем же прецедентом.

В предыдущем примере сгенерированные правила будут такими:
A1 → A2
A2 → A2, A3
A3 → A4
A4 → A4, A5
A5 → A4, A5, A7
A7 → A8
A8 → A7, A8

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

У такой простой и удобочитаемой модели есть и другие преимущества:

а) его очень легко распараллеливать / распространять, что делает его очень привлекательным для больших данных;

б) его очень легко обновлять, что делает его очень привлекательным для часто меняющихся данных.

Но как мы можем использовать эти правила для прогнозирования?

Порядок прогнозирования

Поскольку мы знаем числовое значение для времени t, x (t) ∈ X (t), теперь мы хотим предсказать следующий момент, x (t + 1).

1. Нечеткость входного значения
Входное значение x (t) будет преобразовано в нечеткие значения лингвистической переменной Ã, генерируя значение f (t). Так как в тренировочном процессе выбирается только самый подходящий набор.

В примере данных для t = 1992 значение равно x (t) = 18876. При нечетком определении x (t) наиболее подходящим набором будет A7, поэтому f (t) = A7.

2. Найдите совместимые правила.
Найдите правило, прецедент которого равен f (t). Следствием правила будет нечеткий прогноз для t + 1, то есть f (t + 1).

Для f (t) = A7 у нас есть правило A7 → A8. Тогда f (t + 1) = A8.

3. Дефаззификация
Теперь вам нужно преобразовать f (t + 1) в числовое значение. Для этого мы используем метод центра масс, где числовое значение равно среднему значению центров нечетких множеств f (t + 1), то есть x ( t + 1) = n⁻¹∑ Ai, для i = 0..n-1 и n, равного количеству наборов в f (t + 1).

Поскольку f (t + 1) имеет только один набор, то x (t + 1) = 19366,46.

Представленная модель очень проста и, надо сказать, архаична (она 1996 года !!!). Но это хорошее руководство для понимания того, как работают нечеткие временные ряды. Самые точные методы теперь используют больше лагов (этот использует только лаг t-1), веса в правилах (из работы Yu (2005)), оптимизаторы для поиска наилучшего количества наборов, лагов и т. Д. В следующих уроках мы углубимся в более продвинутые модели.

Все описанные выше процедуры могут быть воспроизведены на этом блокноте Google Colab.

А теперь пора немного поиграть и запачкать руки !!!! :-)

Библиотека pyFTS

Библиотека pyFTS: Fuzzy Time Series for Python разработана на базе MINDS - Machine Intelligence and Data Science Федерального университета Минас-Жерайс (UFMG) в Бразилии и предназначена для студентов, исследователей, специалистов по данным или тех, кто хочет использовать методы нечетких временных рядов. PyFTS - это проект, который постоянно развивается, и мы приветствуем любой вклад!

Давайте узнаем некоторые из основных функций библиотеки:

1. Данные тестирования

В пакете pyFTS.data есть несколько наборов данных общих временных рядов, таких как TAIEX, NASDAQ, S&P 500, пассажиры и т. Д. Каждый набор данных имеет свои особенности - некоторые одномерные, другие многовариантные и т.д., но все они в основном имеют два функции:

  • get_data (): вернуть одномерный временной ряд
  • get_dataset (): вернуть многомерный временной ряд
from pyFTS.data import Enrollments
train = Enrollments.get_data()

2. Преобразование данных

В пакете pyFTS.common.Transformations можно использовать несколько преобразований данных для предварительной и / или последующей обработки данных, что напрямую влияет на разделение вселенной дискурса.

from pyFTS.common import Transformations
tdiff = Transformations.Differential(1)

3. Разделители

В пакете pyFTS.partitioners есть множество разделителей дискурса. Каждый разделитель выполняет функцию представления лингвистической переменной, создавая разделы Вселенной Дискурса и ее нечетких множеств. Во всех из них требуется как минимум два параметра конструктора:

  • data: (обязательно!) данные поезда;
  • npart: (обязательно!) минимальное количество нечетких множеств для построения;
  • mf: функция принадлежности, которая будет использоваться для нечетких множеств, которые по умолчанию имеют треугольную форму (trimf). Различные функции членства можно найти в pyFTS.common.Membership;
  • преобразование: если в серии используется какое-либо преобразование, об этом следует сообщить здесь.
from pyFTS.partitioners import Grid, Entropy, Util as pUtil
fs = Grid.GridPartitioner(data=train, npart=20)
print(fs)

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

4. Методы нечетких временных рядов

Различные методы находятся в пакете pyFTS.models. Все методы наследуются от класса common.fts.FTS. Для конечного пользователя есть два основных метода, которые нужно знать:

  • FTS.fit (data, partitioner = fs): обучает модель на основе обучающих данных по параметру data и лингвистической переменной, уже созданной секционером fs. Желательно изучить помощь этой функции, потому что здесь уже можно проводить распределенное обучение с помощью кластеров диспы. В ближайшее время будет выпущена также версия, совместимая с pySpark.
  • FTS.predict (data, type = ’point’, steps_ahead = 1): он использует уже обученную модель для прогнозирования задержек, содержащихся в данных. Существует три возможных типа прогнозирования, обозначенных параметром «тип»: «точка» (по умолчанию), «интервал» и «распределение». При выборе метода следует быть осторожным, потому что не все из них работают со всеми этими типами. Наконец, параметр «steps_ahead» указывает горизонт прогнозирования или количество шагов вперед, которые вы хотите предсказать.
from pyFTS.models import chen
model = chen.ConventionalFTS(partitioner=fs)
model.fit(train)
print(model)
forecasts = model.predict(test)

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

Двигаясь вперед - второй раз еще лучше

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

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

Обязательно их прочтите!

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

Чен Ши-Мин. Прогнозирование зачисления на основе нечетких временных рядов. Нечеткие множества и системы, т. 81, номер 3, с. 311–319, 1996. URL: https://doi.org/10.1016/0165–0114(95)00220–0. Доступ 25.07.2018.

Элерс, Р. Análise de séries temporais. Departamento de Estatística, Федеральный университет Параны. URL: http://conteudo.icmc.usp.br/pessoas/ehlers/stemp/stemp.pdf. Доступ 25.07.2018.

Мореттин, П.А. e Toloi, C.M.C. Análise de Séries Temporais. Блюхер, 2004 г.

Сильва, П. К. Л. и др. pyFTS: нечеткие временные ряды для Python, версия 4.0. URL: https://doi.org/10.5281/zenodo.597359. Доступ 25.07.2018.

Сун, Цян; Чиссом, Брэд С. Нечеткие временные ряды и их модели. Нечеткие множества и системы, т. 54, номер 3, с. 269–277, 1993. URL: https://doi.org/10.1016/0165-0114(93)90372-O. Доступ 25.07.2018.

Ю, Хуэй-Куанг, Модели взвешенных нечетких временных рядов для прогнозирования TAIEX Physica A: Statistical Mechanics and its Applications, vol. 349, № 3, стр. 609–624, 2005. URL: https://doi.org/10.1016/j.physa.2004.11.006. Доступ 25.07.2018.

Заде, Л. А. Нечеткие множества. Информация и контроль 8 (3) 338–353, 1965. URL: https://doi.org/10.1016/S0019-9958(65)90241-X. Доступ 25.07.2018.