2011-10-28 17 views
6

Gizli markov modelleri öğrenmeye başlıyorum, wiki sayfasında ve github'da çok sayıda örnek var ama olasılıkların çoğu zaten orada (% 70 yağmur değişimi,% 30 durum değişikliği, vb.) .). Yazım denetimi ya da cümleler örnekleri kitap okumak gibi görünüyor ve daha sonra kelimelerin olasılıklarını sıralıyor.Gizli markov modellerinde olasılıkları belirleme yolları nelerdir?

Markov modelinde olasılıkların belirlenmesi için bir yol var mı yoksa önceden hesaplamak için başka bir modele mi gerek var?

Bu soru kapalıysa üzgünüz. Gizli markov modelinin olası dizileri nasıl seçtiğini açık bir şekilde görüyorum ama olasılık kısmı benim için biraz greydir (sık sık sağlandığı için). Örnekler veya herhangi bir bilgi harika olurdu.

Markov modelleri ile aşina olmayanlar için

, burada mısın bilinmeyen parametreleri hesaplamak için algoritma bir EM (beklenti maksimizasyonu) aradığınız bir http://en.wikipedia.org/wiki/Viterbi_algorithm (wikipedia dan) örneği ve http://en.wikipedia.org/wiki/Hidden_Markov_model

#!/usr/bin/env python 

states = ('Rainy', 'Sunny') 

observations = ('walk', 'shop', 'clean') 

start_probability = {'Rainy': 0.6, 'Sunny': 0.4} 

transition_probability = { 
    'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3}, 
    'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6}, 
    } 

emission_probability = { 
    'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5}, 
    'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1}, 
    } 

#application code 
# Helps visualize the steps of Viterbi. 
def print_dptable(V): 
    print " ", 
    for i in range(len(V)): print "%7s" % ("%d" % i), 
    print 

    for y in V[0].keys(): 
     print "%.5s: " % y, 
     for t in range(len(V)): 
      print "%.7s" % ("%f" % V[t][y]), 
     print 

def viterbi(obs, states, start_p, trans_p, emit_p): 
    V = [{}] 
    path = {} 

    # Initialize base cases (t == 0) 
    for y in states: 
     V[0][y] = start_p[y] * emit_p[y][obs[0]] 
     path[y] = [y] 

    # Run Viterbi for t > 0 
    for t in range(1,len(obs)): 
     V.append({}) 
     newpath = {} 

     for y in states: 
      (prob, state) = max([(V[t-1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states]) 
      V[t][y] = prob 
      newpath[y] = path[state] + [y] 

     # Don't need to remember the old paths 
     path = newpath 

    print_dptable(V) 
    (prob, state) = max([(V[len(obs) - 1][y], y) for y in states]) 
    return (prob, path[state]) 



#start trigger 
def example(): 
    return viterbi(observations, 
        states, 
        start_probability, 
        transition_probability, 
        emission_probability) 
print example() 

cevap

4

var gözlenen sekansların setleri. Muhtemelen en yaygın kullanılan, forward-backward algoritmasını kullanan Baum-Welch algoritmasıdır.

Başvuru için HMM'leri incelemek üzere daha önce kullanmış olduğum bir set of slides. Forward-Backward, Viterbi ve Baum-Welch

+0

ile ilgili çok genel bir görüşe sahiptir. Slaytlardan önce okuduğum bağlantılar gerçekten çok iyiydi. Sahip olduğum soruların birçoğunu açıkladılar ama olasılıkın nasıl anlaşıldığı konusunda emin değilim. Örneğin, slaytta, 41 her bir düğüme (1/3,1/2, vb.) Sahip olma olasılıkları vardır. Bunları nasıl alacağımı anlamaya çalışıyorum ve bunları güncel tutmaya devam ediyorum. Belki de slaytlarda ve onu özlüyorum, bunun için yeni oluyorum, bu yüzden hafta sonlarında daha dikkatli çalışacağım. Slaytlar ve cevap için teşekkürler. – Lostsoul

+0

@Lostsoul - Doğru, 41. slayt ve bu bölge HMM'lerin genel olarak nasıl çalıştığını açıklıyor. 68. slayt etrafında, bir dizi gözlemden parametrelerin (topluca λ olarak anılacaktır) tahmin edilmesine nasıl başladığınızı anlatmaya başlar. Ve bunu yapan algoritma Baum-Welch. – Dusty

+0

Tekrar teşekkürler Çok teşekkür edemem. Math'ım berbat, bu yüzden neler olup bittiğini anlamak için birkaç slayt okumamı istedi (ve bir sürü googling). Ben matematiği tam olarak anlamıyorum ama şimdi mantığı alıyorum. Tekrar çok teşekkürler, Dusty. – Lostsoul

İlgili konular