2011-10-28 24 views
6

Tôi bắt đầu học các mô hình markov ẩn và trên trang wiki, cũng như trên github có rất nhiều ví dụ nhưng hầu hết các xác suất đã có (70% thay đổi mưa, 30% cơ hội thay đổi trạng thái, v.v. .). Các ví dụ kiểm tra chính tả hoặc câu, dường như nghiên cứu sách và sau đó xếp hạng xác suất của các từ.Cách xác định xác suất trong các mô hình markov ẩn là gì?

Vậy mô hình markov bao gồm cách xác định xác suất hoặc chúng tôi giả sử một số mô hình khác khác tính toán trước nó?

Xin lỗi nếu câu hỏi này bị tắt. Tôi nghĩ rằng nó đơn giản như thế nào mô hình markov ẩn chọn chuỗi có thể xảy ra nhưng phần xác suất là một chút màu xám với tôi (vì nó thường được cung cấp). Ví dụ hoặc bất kỳ thông tin nào sẽ tuyệt vời.


Đối với những người không quen thuộc với mô hình Markov, đây là một ví dụ (từ wikipedia) http://en.wikipedia.org/wiki/Viterbi_algorithmhttp://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() 

Trả lời

4

Bạn đang tìm kiếm một EM (kỳ vọng tối đa hóa) thuật toán để tính toán các thông số không rõ từ bộ chuỗi quan sát được. Có lẽ cách được sử dụng phổ biến nhất là thuật toán Baum-Welch, sử dụng thuật toán forward-backward.

Để tham khảo, dưới đây là set of slides Tôi đã sử dụng trước đây để xem xét HMM. Nó có một cái nhìn tổng quan tốt đẹp về Forward-Backward, Viterbi, và Baum-Welch

+0

Cảm ơn bạn rất nhiều. Các liên kết tôi đã đọc trước khi các trang trình bày thực sự tốt. Họ đã làm rõ rất nhiều câu hỏi mà tôi có nhưng tôi vẫn không chắc chắn về cách xác suất được tìm ra. Ví dụ trên slide, 41 chúng có xác suất cho mỗi nút (1/3,1/2, vv ..). Tôi đang cố gắng tìm ra cách để có được những thứ đó và tiếp tục cập nhật chúng. Nó có thể trong các slide và tôi đang thiếu nó, tôi mới đến điều này vì vậy tôi sẽ nghiên cứu kỹ hơn vào cuối tuần. Cảm ơn các trang trình bày và câu trả lời. – Lostsoul

+0

@Lostsoul - Phải, trượt 41 và khu vực đó chỉ giải thích cách HMM hoạt động nói chung. Xung quanh slide 68, nó bắt đầu nói về cách bạn đi về ước tính các tham số (gọi chung là λ) từ một tập hợp các quan sát. Và thuật toán đó là Baum-Welch. – Dusty

+0

Cảm ơn một lần nữa Tôi không thể cảm ơn đủ. Math của tôi hút nên nó đã cho tôi một số bài đọc của slide (và rất nhiều googling) để hiểu những gì đang xảy ra. Tôi không hoàn toàn hiểu được toán học nhưng bây giờ tôi đã có được logic. Cảm ơn rất nhiều lần nữa, Dusty. – Lostsoul

Các vấn đề liên quan