Рубрики
Без рубрики

Алгоритм Витерби: Реализация на Python

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

Автор оригинала: 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)

Выход:

Вывод python viterbi пример
Вывод python viterbi пример

Выход

Применение алгоритма Витерби:

  • Декодирование 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, проиллюстрированную с помощью примера, и, наконец, мы увидели различные приложения алгоритма Витерби в современных технологиях.

Однако, если у вас есть какие-либо сомнения или вопросы, дайте мне знать в разделе комментариев ниже. Я постараюсь помочь вам как можно скорее.

Счастливого Пифонирования!