1. 程式人生 > 實用技巧 >最簡單的6種防止資料重複提交的方法!

最簡單的6種防止資料重複提交的方法!

HMM

馬爾科夫鏈即為

  • 狀態空間中從一個狀態到另一個狀態轉換的隨機過程。

  • 該過程要求具備

    “無記憶”

    的性質:

    • 下一狀態的概率分佈只能由當前狀態決定,在時間序列中它前面的事件均與之無關

隱馬爾可夫模型(Hidden Markov Model,HMM)是統計模型,它用來描述一個含有隱含未知引數的馬爾可夫過程。

  • 隱馬爾可夫模型(Hidden Markov Model,HMM)是統計模型,它用來描述一個含有隱含未知引數的馬爾可夫過程。

  • 常見術語

    • 可見狀態鏈
    • 隱含狀態鏈
    • 轉換概率
    • 輸出概率
  • 什麼樣的問題可以用HMM模型解決

    • 基於序列的,比如時間序列;
    • 問題中包含兩類資料,一類是可以觀測到的觀測序列;另一類是不能觀察到的隱藏狀態序列。
  • HMM模型的兩個重要假設

    • 其次馬爾科夫鏈假設
    • 觀測獨立性假設
  • HMM模型的三個基本問題

    • 評估觀察序列概率—— 前向後向的概率計算
    • 預測問題,也稱為解碼問題 ——維特比(Viterbi)演算法
    • 模型引數學習問題 —— 鮑姆-韋爾奇(Baum-Welch)演算法
  • 前向演算法求HMM觀測序列

    • 輸入:HMM模型 λ=(A,B,Π),觀測序列image-20200609235438949
    • 輸出:觀測序列概率P(O|λ)
        1. 計算時刻1的各個隱藏狀態前向概率:image-20191211111014281
        1. 遞推時刻2,3,… …T時刻的前向概率:image-20191211111110223
        1. 計算最終結果:image-20191211111203339
  • 後向演算法求HMM觀測序列

    • 輸入:HMM模型 λ=(A,B,Π),觀測序列image-20200609235438949
    • 輸出:觀測序列概率P(O|λ)
      • 初始化時刻T的各個隱藏狀態後向概率:image-20191211131712030
      • 遞推時刻T−1,T−2,…1時刻的後向概率:image-20191211131727431
      • 計算最終結果:image-20191211131746630

維特比演算法流程總結:

  • 輸入:HMM模型 λ=(A,B,Π),觀測序列image-20200610115739520
  • 輸出:最有可能的隱藏狀態序列image-20200610115759219

流程如下:

  • 1)初始化區域性狀態:

image-20191211153308449

    1. 進行動態規劃遞推時刻 t=2,3,…T 時刻的區域性狀態:

image-20191211153349430

    1. 計算時刻T最大的image-20200610115901486,即為最可能隱藏狀態序列出現的概率。計算時刻T最大的 image-20200610115925436,即為時刻T最可能的隱藏狀態。

image-20191211153412145

    1. 利用區域性狀態image-20200610115945012開始回溯。對於 t=T-1,T-2,…,1

image-20191211153607900

最終得到最有可能的隱藏狀態序列: image-20200610120053531

MultinomialHMM例項

下面我們用我們在前面講的關於球的那個例子使用MultinomialHMM跑一遍。

import numpy as np
from hmmlearn import hmm
# 設定隱藏狀態的集合
states = ["box 1", "box 2", "box3"]
n_states = len(states)

# 設定觀察狀態的集合
observations = ["red", "white"]
n_observations = len(observations)

# 設定初始狀態分佈
start_probability = np.array([0.2, 0.4, 0.4])

# 設定狀態轉移概率分佈矩陣
transition_probability = np.array([
  [0.5, 0.2, 0.3],
  [0.3, 0.5, 0.2],
  [0.2, 0.3, 0.5]
])

# 設定觀測狀態概率矩陣
emission_probability = np.array([
  [0.5, 0.5],
  [0.4, 0.6],
  [0.7, 0.3]
])
# 設定模型引數
model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_=start_probability  # 初始狀態分佈
model.transmat_=transition_probability  # 狀態轉移概率分佈矩陣
model.emissionprob_=emission_probability  # 觀測狀態概率矩陣

現在我們來跑一跑HMM問題三維特比演算法的解碼過程,使用和之前一樣的觀測序列來解碼,程式碼如下:

seen = np.array([[0,1,0]]).T  # 設定觀測序列
box = model.predict(seen)

print("球的觀測順序為:\n", ", ".join(map(lambda x: observations[x], seen.flatten())))
# 注意:需要使用flatten方法,把seen從二維變成一維
print("最可能的隱藏狀態序列為:\n", ", ".join(map(lambda x: states[x], box)))

我們再來看看求HMM問題一的觀測序列的概率的問題,程式碼如下:

print(model.score(seen))
# 輸出結果是:-2.03854530992

要注意的是score函式返回的是以自然對數為底的對數概率值,我們在HMM問題一中手動計算的結果是未取對數的原始概率是0.13022。對比一下:

import math

math.exp(-2.038545309915233)
# ln0.13022≈−2.0385
# 輸出結果是:0.13021800000000003