Автор оригинала: Team Python Pool.
Привет, кодеры!! В этой статье мы познакомимся с алгоритмом Витерби и его реализацией в python. Это href=”https://en.wikipedia.org/wiki/Dynamic_programming”>динамическое программирование href=”https://en.wikipedia.org/wiki/Algorithm”>алгоритм используется для поиска наиболее вероятной последовательности скрытых состояний. href=”https://en.wikipedia.org/wiki/Dynamic_programming”>динамическое программирование href=”https://en.wikipedia.org/wiki/Algorithm”>алгоритм используется для поиска наиболее вероятной последовательности скрытых состояний. href=”https://en.wikipedia.org/wiki/Algorithm”>алгоритм используется для поиска наиболее вероятной последовательности скрытых состояний.
Ключевые особенности алгоритма Витерби
- Алгоритм динамического программирования
- Реализовано для поиска наиболее вероятной последовательности скрытых состояний (путь Витерби)
- Он сокращает количество вычислений за счет хранения повторяемых вычислений
Математическое определение алгоритма Витерби:
Путь<сильный> Генерируется X = (x1,x2,….. xT), который в основном представляет собой последовательность состояний x ∈ S = {s1,s2,….. sK}. Это порождает наблюдение Y = (y1, y2, …, yT) с y ∈ O = {o1,o2,…. On}. Здесь N-возможное число наблюдений в пространстве наблюдений O.
В этом случае мы построим две 2D – таблицы размера Kx T
- Каждый элемент таблицы T1, т. е. T1[i,j] хранит вероятность наиболее вероятного пути до сих пор X = (x1, x2 ….. xj) , где будет генерировать Y = (y1,y2 …yj)
- Каждый элемент таблицы T2, т. е. T2[i,j] хранит xj-1 наиболее вероятного пути до сих пор X = (x1, x2 ….. xj) ∀ j, 2
- Элементы таблицы T1[i,j] и T2[i,j] заполняются в порядке возрастания K. j+i
- T1[i,j](T1[k,j-1].Aki.Biyj)
- T2[i,j](T1[k,j-1].Aki.Biyj)
Ввод:
- Пространство наблюдения O = {o1,o2,…oN}
- href=”https://en.wikipedia.org/wiki/State_space”>Пространство состояний S = {s1,s2,…., sk} href=”https://en.wikipedia.org/wiki/State_space”>Пространство состояний S = {s1,s2,…., sk}
- Массив,состоящий из начальных вероятностей π = (π1, π2….nk) , где ni хранит вероятность
- Последовательность наблюдений Y = (y1, y2, …., yT)
- href=”https://en.wikipedia.org/wiki/Stochastic_matrix”>Матрица перехода A размера K x K где A[i,j] хранит href=”https://en.wikipedia.org/wiki/Transition_probability”>вероятность перехода перехода из состояния Si в Sj href=”https://en.wikipedia.org/wiki/Stochastic_matrix”>Матрица перехода A размера K x K где A[i,j] хранит href=”https://en.wikipedia.org/wiki/Transition_probability”>вероятность перехода перехода из состояния Si в Sj href=”https://en.wikipedia.org/wiki/Transition_probability”>вероятность перехода перехода из состояния Si в Sj
- href=”https://en.wikipedia.org/wiki/Hidden_Markov_model”>Матрица излучения B размера K x N где B[i,j] хранит вероятность наблюдения Oj из состояния Si href=”https://en.wikipedia.org/wiki/Hidden_Markov_model”>Матрица излучения B размера K x N где B[i,j] хранит вероятность наблюдения Oj из состояния Si
Выход:
Наиболее вероятная скрытая последовательность состояний X=(x1,x2…xj)
Реализация алгоритма Витерби в Python на примере:
Чтобы проиллюстрировать работу алгоритма Витерби, мы рассмотрим пример для лучшего понимания.
Рассмотрим небольшой городок, где люди либо:
- здоровый
- есть меньше
Только врач может отличить или идентифицировать людей, страдающих лихорадкой, от здоровых людей. Он делает это, спрашивая об их симптомах. У людей может быть один из следующих ответов:
- обычный
- головокружительный
- холодный
Врач считает, что состояние здоровья его пациентов действует как дискретное href=”https://en.wikipedia.org/wiki/Markov_chain”>Цепь Маркова. href=”https://en.wikipedia.org/wiki/Markov_chain”>Цепь Маркова.
Эти два состояния являются:
- здоровый
- лихорадка
Однако эти состояния “скрыты” от врача. Наблюдения могут быть:
- обычный
- головокружительный
- холодный
Таким образом, это образует скрытую марковскую модель, которая может быть представлена:
observations = ("normal", "cold", "dizzy") states = ("Healthy", "Fever") start_p = {"Healthy": 0.6, "Fever": 0.4} trans_p = { "Healthy": {"Healthy": 0.7, "Fever": 0.3}, "Fever": {"Healthy": 0.4, "Fever": 0.6}, } emit_p = { "Healthy": {"normal": 0.5, "cold": 0.4, "dizzy": 0.1}, "Fever": {"normal": 0.1, "cold": 0.3, "dizzy": 0.6}, }
- start_p: анализ состояния пациента врачом при первом посещении.
- trans_p: изменение состояния
- В этом примере мы рассмотрели 30% – ное изменение
- emission_p: насколько вероятно, что состояние определяется на основе наблюдений
Графическое представление вышеизложенного ХМ
Теперь рассмотрим ситуацию, когда пациент посещает пациента три дня подряд. Все три дня у него проявляются разные симптомы (нормальная/холодная/головокружительная). Вопрос доктора здесь будет:<сильный> Какова наиболее вероятная последовательность состояний здоровья пациента, которая могла бы объяснить эти наблюдения?
На этот вопрос отвечает алгоритм Витерби.
def viterbi_algorithm(observations, states, start_p, trans_p, emit_p): V = [{}] for st in states: V[0][st] = {"prob": start_p[st] * emit_p[st][observations[0]], "prev": None} for t in range(1, len(observations)): V.append({}) for st in states: [t - 1][states[0]]["prob"] * trans_p[states[0]][st] [0] for prev_st in states[1:]: [t - 1][prev_st]["prob"] * trans_p[prev_st][st] if tr_prob > max_tr_prob: * emit_p[st][observations[t]] V[t][st] = {"prob": max_prob, "prev": prev_st_selected} for line in dptable(V): print(line) opt = [] .0 for st, data in V[-1].items(): if data["prob"] > max_prob: ["prob"] opt.append(best_st) for t in range(len(V) - 2, -1, -1): opt.insert(0, V[t + 1][previous]["prev"]) [t + 1][previous]["prev"] print ("The steps of states are " + " ".join(opt) + " with highest probability of %s" % max_prob) def dptable(V): yield " ".join(("%12d" % i) for i in range(len(V))) for state in V[0]: yield "%.7s: " % state + " ".join("%.7s" % ("%f" % v[state]["prob"]) for v in V)
Выход:
Выход
Применение алгоритма Витерби:
- Декодирование href=”https://en.wikipedia.org/wiki/Convolutional_code”>сверточные коды , используемые в обоих href=”https://en.wikipedia.org/wiki/CDMA”>CDMA и href=”https://en.wikipedia.org/wiki/GSM”>GSM цифровая сотовая связь href=”https://en.wikipedia.org/wiki/Convolutional_code”>сверточные коды , используемые в обоих href=”https://en.wikipedia.org/wiki/CDMA”>CDMA и href=”https://en.wikipedia.org/wiki/GSM”>GSM цифровая сотовая связь href=”https://en.wikipedia.org/wiki/CDMA”>CDMA и href=”https://en.wikipedia.org/wiki/GSM”>GSM цифровая сотовая связь href=”https://en.wikipedia.org/wiki/GSM”>GSM цифровая сотовая связь
- Дальняя космическая связь
- Распознавание речи и синтез речи
- Определение ключевых слов
- Компьютерная лингвистика
Должен Читать
- Битоническая сортировка: Алгоритм и реализация в Python
- Серия Фибоначчи в Python и программа чисел Фибоначчи
- Понимание Python Bubble Sort с примерами
- Модуль Python Nmap Полностью объяснен с помощью программ
- Python не распознается как внутренняя или внешняя команда
Вывод:
В этой статье мы узнали об алгоритме Витерби. Мы увидели его реализацию в Python, проиллюстрированную с помощью примера, и, наконец, мы увидели различные приложения алгоритма Витерби в современных технологиях.
Однако, если у вас есть какие-либо сомнения или вопросы, дайте мне знать в разделе комментариев ниже. Я постараюсь помочь вам как можно скорее.
Счастливого Пифонирования!