[Искусственный интеллект плиты] Машинное обучение 044 — Создание скрытых марковских моделей
(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)
Скрытая марковская модель (HMM) — очень классическая модель машинного обучения, которая широко используется в распознавании речи, обработке естественного языка, распознавании образов и других областях. Поэтому понимание и количественное владение HMM является важным навыком в области машинного обучения.
1. Что такое скрытая марковская модель
Скрытая марковская модель — статистическая модель, используемая для описания марковского процесса со скрытыми неизвестными параметрами.Сложность состоит в том, чтобы определить скрытые параметры в процессе из наблюдаемых параметров, а затем использовать эти параметры для дальнейшего анализа.
Скрытая модель Маркова — это вероятностная модель временных рядов, которая описывает процесс, в котором ненаблюдаемая случайная последовательность состояний генерируется случайным образом скрытой цепью Маркова, а затем из каждого состояния генерируется наблюдаемая случайная последовательность наблюдений.
1.1 Марковский процесс
Что такое Марковский процесс? Случайный процесс без памяти, который обращает внимание на три момента времени: прошлое, настоящее, будущее (или: вчера, сегодня, завтра). При известном настоящем состоянии то, в каком состоянии человек окажется в будущем, зависит только от известного настоящего состояния, а не от прошлого состояния. То есть, когда состояние "настоящего" известно, состояние "будущего" и состояние "прошлого" не зависят друг от друга. Эта характеристика становится марковским свойством. Случайный процесс с таким свойством называется Марковский процесс, также известный как цепь Маркова.
Например: лягушка прыгает в пруду с лотосами, перепрыгивая с одного листа лотоса на другой. Если предположить, что листья лотоса, через которые перепрыгивает лягушка, имеют номера X0, X1, X2, .... Xn, и теперь лягушка находится на листе лотоса Xn, то на какой лист лотоса лягушка прыгнет в следующий момент, полностью определено. текущим листом лотоса. Он определяется Xn и не имеет ничего общего с листьями лотоса X0, X1....Xn-1. Этот процесс можно рассматривать как марковский процесс.
Таким образом, в цепи Маркова есть сильное понятие времени: в момент времени t0 лягушка находится на листе лотоса X0, а в момент времени t1 лягушка находится на листе лотоса X1.
1.2 Одна цепочка, две последовательности, три вероятности
В марковской модели есть шесть очень важных параметров, цепь относится к марковскому процессу, и вся цепочка связана по времени. Две последовательности — это цепочки (или последовательности), имеющие два значения в каждый момент времени (каждый узел в цепочке):
1) Последовательность состояний: последовательность состояний, порожденная скрытой цепью Маркова, в данный момент находящаяся в определенном состоянии, последовательность, состоящая из этих состояний.
2) Последовательность наблюдения: во многих случаях мы не можем полностью увидеть состояние, мы можем видеть только результаты определенного состояния, и эти результаты мы можем наблюдать, поэтому эти наблюдения Составленная последовательность - это последовательность наблюдения, которая может частично представлять последовательность состояний, но не может полностью представлять последовательность состояний.
Три вероятности относятся к движущей силе цепи Маркова, которая толкает вниз, представляя направление тренда цепи.
1) Вероятность начального состояния: указывает вероятность нахождения в каждом состоянии в самом начале.
2) Вероятность перехода состояния: вероятность того, что состояние в момент времени tn перейдет в следующее состояние в момент времени tn+1.
3) Вероятность наблюдения: если цепь Маркова рассматривать как матрицу, каждая строка представляет каждый момент, и она упорядочена по времени сверху вниз, Каждая строка представляет определенный момент, а также соответствует определенному значению состояния, каждый столбец — это значение наблюдения в этом состоянии, а вероятность наблюдения — это вероятность того, что определенное значение наблюдения появится в определенном состоянии.
Есть также два основных предположения:
1) Однородная марковская гипотеза: значение состояния скрытой цепи Маркова в любой момент времени T зависит только от значения состояния в ее предыдущий момент и не имеет ничего общего с другими значениями состояния и наблюдениями, что также является скрытой марковской особенностью.
2) Предположение о независимости наблюдения: значение наблюдения в любой момент времени зависит только от состояния в этот момент и не имеет ничего общего с другими наблюдениями и другими состояниями.
Существует очень хороший пост в блоге, который помогает понять скрытые марковские модели, пост в блоге:Понять HMM (скрытая модель Маркова) в одной статье
Ниже я использую изображения и примеры из этого сообщения в блоге, чтобы проиллюстрировать вышеупомянутые ключевые параметры.
1.3 Примеры
Если есть три разных кубика, как показано на рисунке ниже, первый из них имеет квадратную форму, которую мы обычно видим, с шестью гранями и меткой D 6. Вы можете получить любое число от 1 до 6 каждый раз, когда бросаете его. Вероятность 1/6.Второй тетраэдр, помеченный D4, который получит любое число от 1 до 4, с вероятностью 1/4, а третий октаэдр, помеченный D8, который получит 1-8 , для любого числа с вероятностью 1/8.
Теперь мы случайным образом выбираем один из этих трех кубиков, а затем бросаем каждый кубик по одному разу, чтобы получить число, выбираем в общей сложности 10 слов и бросаем 10 раз. Тогда последовательность игральных костей, которую мы можем выбрать, будет: D6 D8 D8 D6 D4 D8 D6 D6 D4 D8, и в результате выпадут следующие числа: 1 6 3 5 2 7 3 5 2 4. В каждый момент времени последовательность игральных костей, которую мы выбираем, представляет собой последовательность состояний, как указано выше (D6 D8 D8 D6 D4 D8 D6 D6 D4 D8), а число, полученное игральными костями, является нашим значением наблюдения, которое представляет собой последовательность наблюдения (например, цифры 1 6 3 5 2 7 3 5 2 4).
Очевидно, что последовательность наблюдения — это то, что мы можем легко получить и наблюдать, поэтому ее иногда называют видимой цепочкой состояний, и часто мы не знаем, какие кости выбрать, поэтому последовательность состояний костей — это скрытая последовательность состояний. , Последовательности, также известные как цепочки скрытых состояний.
Цепь Маркова, упомянутая в скрытой модели Маркова, на самом деле является цепью скрытых состояний.
Упомянутая выше вероятность начального состояния - это вероятность того, что мы выбираем кости в начале Например, здесь мы выбираем случайным образом, тогда вероятность начального состояния равна 1/3.
Вероятность перехода состояния — это вероятность перехода от одной кости к другой, то есть в этот раз мы использовали кости D4, так какую же кость нам выбрать в следующий раз? Здесь мы выбираем случайным образом, поэтому вероятность следующего кубика D4, D6 и D8 равна 1/3.Если мы изменим правила, например, D4 нельзя выбрать после D6, а вероятность выбора D6 после D6 равно 0,9, D8 Вероятность равна 0,1, тогда вероятность перехода состояния в это время равна (0, 0,9, 0,1). По мере изменения правил меняется и вероятность перехода состояний, и получается еще один совершенно новый HMM. Следует отметить, что вероятность перехода состояния существует только в процессе перехода между состояниями, а не в процессе изменения наблюдаемого значения.
Вероятность наблюдения относится к вероятности получения определенного значения наблюдения в определенном состоянии.В этом примере добавление текущего кубика равно D6, тогда при нормальных обстоятельствах значение наблюдения, которое мы получаем здесь, представляет собой любое число от 1 до 6. Вероятность каждого числа составляет 1/6, то наблюдаемая вероятность состояния в это время составляет 1/6 для каждого. Если кто-то из кожи вон лезет и манипулировал кубиком D6, например, вероятность выпадения 1 равна 1/2, а вероятность других чисел (2-6) равна 1/10, то вероятность наблюдения в этот момент времени также изменения, также совершенно новая модель HMM.
Он представлен следующим образом: обратите внимание, что скрытая цепочка состояний на рисунке — это последовательность состояний, цепочка видимых состояний — это последовательность наблюдений, а вероятность перехода из одного неявного состояния в следующее состояние банка, указанное черной стрелкой, — это вероятность перехода состояния, красный Вероятность выхода из скрытого состояния в наблюдаемое значение, представленное стрелкой, является наблюдаемой вероятностью.
Для полностью случайного процесса выбора игральной кости вероятность выбора игральной кости в следующий раз равна 1/3. Эта вероятность перехода состояния может быть выражена как:
1.4 Типы алгоритмов
В реальном мире мы часто не знаем всех вышеперечисленных пяти значений параметров, только некоторые из них, поэтому существуют различные способы решения этих проблем.Нижеследующее в основном объясняет три типа алгоритмов, относящихся к модели HMM., соответственно, решить три задачи.
1) Знайте количество состояний, вероятность перехода состояния, последовательность наблюдений и решите последовательность состояний. -- Проблема декодирования, решенная с помощью алгоритма Витерби.
Проблема такого рода: если я знаю, какие бывают кости (количество состояний), как выбрать следующую игральную кость после каждой кости (вероятность перехода состояния), а также знаю результат игры в кости (последовательность наблюдений), например, серия результатов (числа 1 6 3 5 2 7 3 5 2 4), то как мы узнаем, какие кости бросаются для каждого шага (решение последовательности состояний), например, на какой кости номер 1 равен D4, Откуда взялись D6, D8?
Эта проблема называется проблемой декодирования в области распознавания речи.Есть два решения.Первое решение состоит в том, чтобы найти путь состояния максимального правдоподобия, то есть решить серию последовательностей игральных костей.5 2 7 3 5 2 4 является наивысшая вероятность. Второе решение состоит в том, чтобы найти вероятность того, что каждый раз выбрасываются игральные кости определенного типа, например, вероятность выпадения D4 в первый раз равна 0,5, вероятность D6 равна 0,3, а вероятность D8 равна 0,2. , Конкретные решения Пожалуйста, обратитесь к другим сообщениям блога для процесса.
2) Зная количество состояний, вероятность перехода состояния и последовательность наблюдений, решить вероятность получения определенного значения наблюдения. --Вероятностная задача, алгоритм прямого-назад.
Этот тип задачи похож на предыдущую, но на этот раз мы хотим узнать вероятность получения определенного числа в определенный момент. Представляется, что решение этой задачи не имеет особого смысла, поскольку это всего лишь вероятность определенного числа, а не действительное число, но оно имеет большое практическое значение в лотерейных ставках, предсказании курса акций и т. д. Зная вероятность определенное число, появившееся в следующий момент, или в операции с ценой акции, зная вероятность появления определенной цены в следующий торговый день, то мы можем сделать на этом много денег.
3) Знайте количество состояний, соблюдайте последовательность и решайте вероятность перехода состояния. --Обучающая задача, алгоритм B-W.
Это самая распространенная ситуация.Много раз мы знаем только, что есть несколько костей, и мы получаем много чисел, бросая эти кости, так как же рассчитать, как выбрать следующие кости после каждого типа костей?
Для решения этих проблем, пожалуйста, обратитесь к сообщению в блоге:Понять HMM (скрытая модель Маркова) в одной статье
2. Создайте модель HMM
Скрытая марковская модель является генеративной моделью, что означает, что после понимания базовой структуры данные могут быть получены.
2.1 Просмотр последовательности набора данных
Данные для построения модели HMM на этот раз хранятся в data_hmm.txt, Сначала мы загружаем этот набор данных в память. Первые два столбца этого набора данных — это даты, а третий столбец — это данные последовательности, которые мы хотим проанализировать. График этого столбца данных показывает его внутреннюю логику и структуру следующим образом:
2.2 Построение модели HMM
Код для построения модели HMM:
dataset_X=df.iloc[:,2].values.reshape(1,-1).T # 前面两列是日期,用第2列作数据集
# 需要构建成二维数组形式,故而需要加上一个轴
print(dataset_X.shape) # 有3312个训练样本组成一列
# 建立HMM模型,并训练
from hmmlearn.hmm import GaussianHMM
model = GaussianHMM(n_components=4, covariance_type="diag", n_iter=1000)
model.fit(dataset_X)
Поскольку здесь у нас есть только один столбец данных, нам нужно подготовить этот столбец данных и преобразовать его в двумерный массив Здесь мы получаем двумерный массив (3312,1), каждая строка представляет собой значение наблюдения, формирование последовательности наблюдения.
Этот код использует модуль hmmlearn, который необходимо установить с помощью команды pip install hmmlearn. Этот модуль реализует три класса моделей HMM, которые можно разделить на две категории в зависимости от того, является ли состояние наблюдения непрерывным или дискретным состоянием: GaussianHMM и GMMHMM — модели HMM непрерывных состояний наблюдения, а MultinomialHMM — модель дискретных состояний наблюдения. .
Первый и второй столбцы этого проекта представляют время, и видно, что время непрерывно, поэтому используется модель GaussianHMM.Эта модель предполагает, что наблюдаемое состояние соответствует распределению Гаусса, в то время как класс GMMHMM предполагает, что наблюдаемое состояние состояние соответствует смешанному распределению Гаусса. Как правило, мы можем использовать GaussianHMM.
Несколько параметров GuassianHMM:
1, n_components: количество состояний, по умолчанию 1.
2, covariance_type: существует четыре вида: сферический: в каждом состоянии все характеристические компоненты наблюдаемого значения используют одно и то же значение дисперсии, внедиагональное значение соответствующей ковариационной матрицы равно 0, а диагональные значения равны равные, то есть сферические характеристики, Это простейшее гауссовское распределение PDF. diag: в каждом состоянии наблюдения используют диагональную ковариационную матрицу, которая равна 0 внедиагональным и неравным диагональным значениям и является параметром по умолчанию для covariance_type. полный: в каждом состоянии наблюдения используют полную ковариационную матрицу, где все элементы отличны от нуля. связанный: означает, что все состояния используют одну и ту же полную ковариационную матрицу. Среди четырех типов PDF сферический, диаг. и полный представляют собой три различные функции плотности вероятности гауссовского распределения, в то время как связанный можно рассматривать как уникальную реализацию GaussianHMM и GMMHMM. Среди них полный — самый мощный, но требует достаточно данных для разумной оценки параметров, сферический — самый простой и обычно используется, когда данных недостаточно или производительность аппаратной платформы ограничена, а диагностика — компромиссный вариант. При использовании необходимо выбрать соответствующий тип по соотношению различных характеристик наблюдаемого вектора состояния.
3, n_iter: максимальное количество циклов.
Есть и другие параметры, но только три параметра являются наиболее важными, остальные могут использовать значения по умолчанию.
После обучения приведенной выше модели HMM вы можете просмотреть некоторые внутренние структуры и содержимое модели, например, вычислить среднее значение и дисперсию каждого скрытого состояния:
for i in range(model.n_components): # 打印出每个隐含状态
mean=model.means_[i][0]
variance=np.diag(model.covars_[i])[0]
print('Hidden state: {}, Mean={:.3f}, Variance={:.3f}'
.format((i+1),mean,variance))
------------------------------------- потерять-- ------------------------------
Hidden state: 1, Mean=5.092, Variance=0.677 Hidden state: 2, Mean=2.601, Variance=0.257 Hidden state: 3, Mean=8.099, Variance=0.678 Hidden state: 4, Mean=0.600, Variance=0.254
--------------------------------------------Заканчивать----- --------------------------------
2.3. Просмотр прогнозного эффекта модели HMM
Модель HMM — это генеративная модель.Конечная цель обучения этой модели — надеяться, что она сможет предсказать значение определенной точки в будущем.Для этой модели мы прогнозируем 1000 точек данных, чтобы увидеть, насколько хорошо модель работает.
# 使用HMM模型生成数据
N=1000
samples,_=model.sample(N)
plt.plot(samples[:,0])
2.4 Улучшить производительность модели HMM
Из приведенного выше видно, что диаграмма последовательности данных, сгенерированных этой моделью, далека от исходной диаграммы последовательности данных.Хотя она кажется совместимой с некоторыми колебаниями, все же трудно удовлетворить наши потребности.Что нам нужно, что чем больше сходство между ними, тем лучше.Чем больше значение, тем больше модель HMM нашла правило изменения данных.
# 模型的提升,修改n_components
for i in [8,12,16,18,20]:
model = GaussianHMM(n_components=i, covariance_type="diag", n_iter=1000)
model.fit(dataset_X)
samples,_=model.sample(1000)
plt.plot(samples[:,0])
plt.title('hidden state N={}'.format(i))
plt.show()
После запуска вы получите пять картинок.Вы можете посмотреть мой исходный код.Здесь выложена только последняя картинка:
Можно видеть, что по мере того, как скрытое состояние становится больше, сходство между полученным графом результатов прогнозирования и исходным графом последовательности увеличивается, что указывает на то, что модель HMM является более точной.
########################резюме########################## ######
1. Построение и обучение модели HMM очень просто.Вы можете напрямую использовать функцию GuassianHMM в модуле hmmlearn.Для обучения требуются только данные временного ряда.
2. Модель HMM сложнее понять, в основном понять скрытую цепь Маркова, две последовательности и три вероятности, и вы можете иметь общее представление.
3. Пространство оптимизации параметров функции GuassianHMM в модели HMM невелико, но можно оптимизировать только количество скрытых состояний Из рисунка видно, что даже если количество скрытых состояний относительно велико, результаты полученные не очень идеальны, и в это время требуется глубокое обучение RNN или LSTM внутри, чтобы получить модель с более высокой точностью.
#################################################################
Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.
Использованная литература:
1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.