Implementierung der HMM-Parameterschätzung in Python

Einführung

Implementierung der HMM-Parameterschätzung in Python. Als Lehrbuch verwendete ich ["Fortsetzung / leicht verständliche Mustererkennung"](https://www.amazon.co.jp/ Fortsetzung / leicht verständliche Mustererkennung - Einführung in das Lernen ohne Lehrer - Ishii-Kenichiro / dp / 427421530X).

Struktur dieses Artikels

Hidden Markov Model

Ein Merkmal, bei dem der aktuelle Zustand abhängig vom Zustand vor einer Zeit wahrscheinlich bestimmt wird, heißt ** Markov-Eigenschaft **. Der Prozess der Erfüllung der Markov-Eigenschaft wird als ** Markov-Prozess ** bezeichnet. Beispiele für solche Ereignisse sind Aktienkurse, Sprachsignale und Sprachen. Im Markov-Modell ein Modell, bei dem nur die Reihe von Ausgabesymbolen und die Reihe von Zuständen nicht beobachtet werden kann. Es heißt ** Hidden Markov Model **.

Würfel werfen

HMM wird am Beispiel des Würfelns erklärt. Wirf $ c $ Samenwürfel mit $ m $ Samen $ v_1, v_2, \ cdots, v_m $ $ \ omega_1, \ omega_2, \ cdots, \ omega_c $ $ n $ mal. Die Art der Würfel, die zum $ t $ -ten Zeitpunkt geworfen werden, wird durch $ s_t $ dargestellt, und die beobachteten Augen nach dem Würfeln werden durch $ x_t $ dargestellt. $ s_t $ und $ x_t $ werden wie folgt ausgedrückt.

\begin{eqnarray}
\left\{\begin{array}{ll}
s_t \in \bigl\{\omega_1, \omega_2, \cdots, \omega_c\bigr\} \\
x_t \in \bigl\{v_1, v_2, \cdots, v_m\bigr\} \\
\end{array} \right.
\end{eqnarray}

Die zum $ t $ -ten Zeitpunkt herausgenommenen Würfel $ s_t $ werden stochastisch durch die zum $ (t -1) $ -Zeit entnommenen Würfel $ s_ {t-1} $ bestimmt. Die Wahrscheinlichkeit wird durch $ a (s_ {t -1}, s_t) $ dargestellt. Wenn der herausgenommene $ (t -1) $ -Würfel $ \ omega_i $ ist, ist die Wahrscheinlichkeit, dass der herausgenommene $ t $ -Würfel $ \ omega_j $ ist, gleich Es wird wie folgt ausgedrückt.

a(\omega_i, \omega_j) = P(s_t = \omega_j \ | \ s_{t - 1} = \omega_i) \ \ \ \ \ (i, j = 1, 2, \cdots, c) \tag{1}

Die Wahrscheinlichkeit, dass $ x_t $ durch Werfen der Würfel $ s_t $ zum $ t $ -ten Zeitpunkt beobachtet wird, wird durch $ b (s_t, x_t) $ dargestellt. Die Wahrscheinlichkeit, dass $ v_k $ durch Werfen der Würfel $ \ omega_j $ beobachtet wird, wird wie folgt ausgedrückt.

b(\omega_j, v_k) = P(x_t = v_k \ | \ s_t = \omega_j) \ \ \ \ \ (j = 1, 2, \cdots, c) \ \ (k = 1, 2, \cdots, m) \tag{2}

Der Einfachheit halber wird $ a (\ omega_i, \ omega_j) $ als $ a_ {ij} $ abgekürzt, $ b (\ omega_j, v_k) $ wird als $ b_ {jk} $ abgekürzt und $ a_ {ij} $ wird als * abgekürzt. * Übergangswahrscheinlichkeit ** und $ b_ {jk} $ heißen ** Ausgabewahrscheinlichkeit **. Mit HMM können Sie Informationen über die ** Ausgangsaugen ** (= Beobachtungsergebnisse) erhalten, indem Sie einen Würfel werfen. Informationen über den ** Würfeltyp ** (= Zustand), der den Wurf ausgibt, können nicht erhalten werden.

Anordnung der Symbole

Die Symbole zum Ausdrücken des Markov-Modells sind nachstehend zusammengefasst.

Auswertung

Wenn die Parameter $ \ boldsymbol A, \ boldsymbol B, \ boldsymbol \ rho $ bekannt sind Das Finden der Wahrscheinlichkeit $ P (\ boldsymbol x) $, um das Beobachtungsergebnis $ \ boldsymbol x $ zu erhalten, wird als ** Bewertung ** bezeichnet.

\begin{align}
P(\boldsymbol x) &= \sum_{\boldsymbol s} P(\boldsymbol x, \boldsymbol s) \tag{3} \\
&= \sum_{s_1} \sum_{s_2} \cdots \sum_{s_n} P(\boldsymbol x, s_1s_2 \cdots s_n) \\
P(\boldsymbol x, \boldsymbol s) &= \prod_{t = 1}^n a(s_{t - 1}, s_t)b(s_t, x_t) \tag{4}
\end{align}

Wenn sowohl $ \ boldsymbol x $ als auch $ \ boldsymbol s $ gleichzeitig beobachtet werden können, kann $ P (\ boldsymbol x, \ boldsymbol s) $ leicht berechnet werden. Wenn andererseits nur $ \ boldsymbol x $ beobachtet werden kann, ist der Umfang der Marginalisierungsberechnung für alle möglichen Zustände $ \ boldsymbol s $ enorm. Wir werden ** Vorwärtsalgorithmus ** und ** Rückwärtsalgorithmus ** als Algorithmen für eine effiziente Berechnung einführen.

forward algorithm

Die Wahrscheinlichkeit, dass das Beobachtungsergebnis $ \ boldsymbol x $ erhalten wird und die Würfel $ \ omega_i $ zum $ t $ -ten Zeitpunkt herausgenommen werden, ist wie folgt.

\begin{align}
& P(\boldsymbol x, s_t = \omega_i) \\
&= P(x_1x_2 \cdots x_t, s_t = \omega_i) \cdot P(x_{t + 1}x_{t + 2} \cdots x_n \ | \ s_t = \omega_i) \\
&= \alpha_t(i) \cdot \beta_t(i) \tag{5}
\end{align}

$ \ Alpha_t (i) $ in der Formel $ (5) $ ist die Wahrscheinlichkeit, dass $ x_1x_2 \ cdots x_t $ erhalten wird und die Würfel $ \ omega_i $ zum $ t $ -ten Zeitpunkt herausgenommen werden. $ \ Alpha_t (i) $ kann wie folgt rekursiv berechnet werden.

\begin{align}
& \alpha_t(j) = \Biggl[\sum_{i = 1}^c \alpha_{t - 1}(i) a_{ij} \Biggr]b(\omega_j, x_t) \tag{6} \\
& (t = 2, 3, \cdots, n) \ \ (j = 1, 2, \cdots, c)
\end{align}

$ \ Alpha_1 (i) $ ist jedoch wie folgt.

\begin{align}
\alpha_1(i) &= P(x_1, s_1 = \omega_i) \\
&= \rho_i b(\omega_i, x_1) \ \ \ \ \ (i = 1, 2, \cdots, c) \tag{7}
\end{align}

Die folgende Gleichung wird erhalten, indem $ t = n $ in der Gleichung $ (6) $ gesetzt wird.

\alpha_n(i) = P(x_1x_2 \cdots x_n, s_n = \omega_i) \tag{8}

Die folgende Gleichung wird erhalten, indem die Gleichung $ (8) $ in Bezug auf $ s_n $ marginalisiert wird.

\begin{align}
P(\boldsymbol x) &= P(x_1x_2 \cdots x_n) \\
&= \sum_{i = 1}^c P(x_1x_2 \cdots x_n, s_n = \omega_i) \\
&= \sum_{i = 1}^c \alpha_n(i) \tag{9}
\end{align}

Basierend auf dem Obigen ist das Verarbeitungsverfahren des Vorwärtsalgorithmus unten gezeigt. < forward algorithm >

  1. Initialisierung \ \ \ \ \alpha_1(i) = \rho_i b(\omega_i, x_1) \ \ \ \ \ (i = 1, 2, \cdots, c)
  2. Rekursive Berechnung \ \ \ \ \alpha_t(j) = \Biggl[\sum_{i = 1}^c \alpha_{t - 1}(i) a_{ij} \Biggr]b(\omega_j, x_t)
  3. Berechnung der Wahrscheinlichkeit \ \ \ \ P(\boldsymbol x) = \sum_{i = 1}^c \alpha_n(i)

backward algorithm

$ \ Beta_t (i) $ in der Formel $ (5) $ unterliegt der Bedingung, dass die Würfel $ \ omega_i $ zum $ t $ -ten Zeitpunkt herausgenommen werden. Es ist die Wahrscheinlichkeit, dass das Beobachtungsergebnis danach $ x_ {t + 1} x_ {t + 2} \ cdots x_n $ ist. $ \ Beta_t (i) $ kann wie folgt rekursiv berechnet werden.

\begin{align}
& \beta_t(i) = \sum_{j = 1}^c a_{ij}b(\omega_j, x_{t + 1})\beta_{t + 1}(j) \tag{10} \\
& (t = 1, 2, \cdots, (n - 1)) \ \ (i = 1, 2, \cdots, c)
\end{align}

$ \ Beta_n (i) $ ist jedoch wie folgt.

\beta_n(i) = 1 \ \ \ \ \ (i = 1, 2, \cdots, c) \tag{11}

Die folgende Gleichung wird erhalten, indem $ t = 1 $ in der Gleichung $ (10) $ gesetzt wird.

\beta_1(i) = P(x_2x_3 \cdots x_n \ | \ s_1 = \omega_i) \tag{12}

Aus der Formel $ (12) $ kann $ P (x_1x_2 \ cdots x_n, s_1 = \ omega_i) $ wie folgt ausgedrückt werden.

\begin{align}
& P(x_1x_2 \cdots x_n, s_1 = \omega_i) \\
&= P(s_1 = \omega_i)P(x_1 \ | \ s_1 = \omega_i)P(x_2x_3 \cdots x_n \ | \ s_1 = \omega_i) \\
&= \rho_i b(\omega_i, x_1) \beta_1(i) \tag{13}
\end{align}

Die folgende Gleichung wird erhalten, indem die Gleichung $ (13) $ in Bezug auf $ s_n $ marginalisiert wird.

\begin{align}
P(\boldsymbol x) &= P(x_1x_2 \cdots x_n) \\
&= \sum_{i = 1}^c P(x_1x_2 \cdots x_n, s_1 = \omega_i) \\
&= \sum_{i = 1}^c \rho_i b(\omega_i, x_1) \beta_1(i) \tag{14}
\end{align}

Basierend auf dem Obigen wird das Verarbeitungsverfahren des Rückwärtsalgorithmus unten gezeigt. < backward algorithm >

  1. Initialisierung \ \ \ \ \beta_n(i) = 1 \ \ \ \ \ (i = 1, 2, \cdots, c)
  2. Rekursive Berechnung \ \ \ \ \beta_t(i) = \sum_{j = 1}^c a_{ij}b(\omega_j, x_{t + 1})\beta_{t + 1}(j) \ \ \ \ \ (t = 1, 2, \cdots, (n - 1)) \ \ (i = 1, 2, \cdots, c)
  3. Berechnung der Wahrscheinlichkeit \ \ \ \ P(\boldsymbol x) = \sum_{i = 1}^c \rho_i b(\omega_i, x_1) \beta_1(i)

Schätzen

Wenn die Parameter $ \ boldsymbol A, \ boldsymbol B, \ boldsymbol \ rho $ unbekannt sind Das Finden eines unbekannten Parameters aus dem Beobachtungsergebnis $ \ boldsymbol x $ wird als ** Schätzung ** bezeichnet. Wir definieren $ \ gamma_t (i) $ und $ \ xi_t (i, j) $ wie folgt, um die Lösung der Schätzung abzuleiten.

\begin{align}
\gamma_t(i) &\overset{\rm{def}}{=} P(s_t = \omega_i \ | \ \boldsymbol x) \tag{15} \\
\xi_t(i) &\overset{\rm{def}}{=} P(s_t = \omega_i, s_{t + 1} = \omega_j \ | \ \boldsymbol x) \tag{16}
\end{align}

Darüber hinaus gilt die folgende Beziehung für $ \ gamma_t (i) $ und $ \ xi_t (i, j) $.

\begin{align}
\sum_{j = 1}^c \xi_t(i, j) &= \sum_{j = 1}^c P(s_t = \omega_i, s_{t + 1} = \omega_j \ | \ \boldsymbol x) \\
&= P(s_t = \omega_i \ | \ \boldsymbol x) \\
&= \gamma_t(i) \tag{17}
\end{align}

Hier wird $ P (\ boldsymbol x, s_t = \ omega_i, s_ {t + 1} = \ omega_j) $ wie folgt ausgedrückt.

\begin{align}
&P(\boldsymbol x, s_t = \omega_i, s_{t + 1} = \omega_j) \\
&= P(x_1 \cdots x_t, s_t = \omega_i) \cdot P(s_{t + 1} = \omega_j \ | \ s_t = \omega_i) \cdot P(x_{t + 1} \ | \ s_{t + 1} = \omega_j) \cdot P(x_{t + 2} \cdots x_n \ | \ s_{t + 1} = \omega_j) \\
&= \alpha_t(i)a_{ij}b(\omega_j, x_{t + 1})\beta_{t + 1}(j) \tag{18}
\end{align}

Aus dem Obigen kann die folgende Gleichung abgeleitet werden.

\begin{align}
\gamma_t(i) &= P(s_t = \omega_i \ | \ \boldsymbol x) \\
&= P(\boldsymbol x, s_t = \omega_i) \bigl/ P(\boldsymbol x) \\
&= \alpha_t(i)\beta_t(i) \Bigl/ \sum_{i = 1}^c \alpha_n(i) \tag{19} \\
\xi_t(i, j) &= P(s_t = \omega_i, s_{t + 1} = \omega_j \ | \ \boldsymbol x) \\
&= P(\boldsymbol x, s_t = \omega_i, s_{t + 1} = \omega_j) \bigl/ P(\boldsymbol x) \\
&= \alpha_t(i)a_{ij}b(\omega_j, x_{t + 1})\beta_{t + 1}(j) \Bigl/ \sum_{i = 1}^c \alpha_n(i) \tag{20}
\end{align}

Baum-Welch algorithm

Basierend auf den obigen Ergebnissen werden die Parameter von HMM unter Verwendung der wahrscheinlichsten Schätzung geschätzt. Die diesmal erläuterte Schätzmethode heißt ** Baum-Welch-Algorithmus **. Die Parameter $ \ boldsymbol A, \ boldsymbol B, \ boldsymbol \ rho $ sind wie folgt zusammengefasst.

\boldsymbol \theta = (\boldsymbol A, \boldsymbol B, \boldsymbol \rho) \tag{21}

Wenden Sie den EM-Algorithmus an und maximieren Sie die folgende $ Q $ -Funktion.

\begin{align}
Q(\boldsymbol \theta^0, \boldsymbol \theta) &= \sum_{\boldsymbol s} P(\boldsymbol s \ | \ \boldsymbol x; \boldsymbol \theta^0) \log P(\boldsymbol x, \boldsymbol s; \boldsymbol \theta) \\
&= \sum_{\boldsymbol s} P(\boldsymbol s \ | \ \boldsymbol x; \boldsymbol \theta^0) \bigl\{\log P(\boldsymbol s; \boldsymbol \theta) + \log P(\boldsymbol x \ | \ \boldsymbol s; \boldsymbol \theta)\bigr\} \\
&= \sum_{\boldsymbol s} P(\boldsymbol s \ | \ \boldsymbol x; \boldsymbol \theta^0) \bigl\{\log P(s_1) + \sum_{t = 1}^{n - 1} \log a(s_t, s_{t + 1}) + \sum_{t = 1}^n \log b(s_t, x_t) \bigr\} \tag{22}
\end{align}

Hier ist es wie folgt definiert.

\begin{align}
Q(\boldsymbol \theta^0, \boldsymbol \rho) &\overset{\rm{def}}{=} \sum_{\boldsymbol s} P(\boldsymbol s \ | \ \boldsymbol x; \boldsymbol \theta^0) \log P(s_1) \tag{23} \\
Q(\boldsymbol \theta^0, \boldsymbol A) &\overset{\rm{def}}{=} \sum_{\boldsymbol s} P(\boldsymbol s \ | \ \boldsymbol x; \boldsymbol \theta^0) \sum_{t = 1}^{n - 1} \log a(s_t, s_{t + 1}) \tag{24} \\
Q(\boldsymbol \theta^0, \boldsymbol B) &\overset{\rm{def}}{=} \sum_{\boldsymbol s} P(\boldsymbol s \ | \ \boldsymbol x; \boldsymbol \theta^0) \sum_{t = 1}^n \log b(s_t, x_t) \tag{25}
\end{align}

Maximieren Sie die Gleichungen $ (23), (24), (25) $ für $ \ boldsymbol \ rho, \ boldsymbol A, \ boldsymbol B $. Die geschätzten Parameter sind wie folgt. (Ableitung entfällt)

\begin{align}
\hat{a}_{ij} &= \sum_{t = 1}^{n - 1} \xi_t(i, j) \Bigl/ \sum_{t = 1}^{n - 1} \gamma_t(i) \tag{26} \\
\hat{b}_{jk} &= \sum_{t = 1}^n \delta(x_t, v_k) \gamma_t(i) \Bigl/ \sum_{t = 1}^n \gamma_t(i) \tag{27} \\
\hat{\rho}_i &= \gamma_1(i) \tag{28}
\end{align}

Das Verarbeitungsverfahren des Baum-Welch-Algorithmus ist unten gezeigt. < Baum-Welch algorithm >

  1. Initialisierung Legen Sie die entsprechenden Anfangswerte für die $ \ \ \ $ -Parameter $ a_ {ij}, b_ {jk}, \ rho_i $ fest
  2. Rekursive Berechnung Berechnen Sie $ \ hat a_ {ij}, \ hat b_ {jk}, \ hat \ rho_i $ aus der $ \ \ \ $ Formel $ (26), (27), (28) $ $ \ \ \ $ $ \ Alpha_t (i), \ beta_t (i) $ zur Berechnung von $ \ gamma_t (i), \ xi_t (i, j) $ werden jedoch durch Vorwärtsalogorithmus und Rückwärtsalogorithmus berechnet.
  3. Parameteraktualisierung Aktualisieren Sie die Parameter mit $ \ \ \ \ a_ {ij} \ leftarrow \ hat a_ {ij}, b_ {jk} \ leftarrow \ hat b_ {jk}, \ rho_i \ leftarrow \ hat \ rho_i $
  4. Beenden Sie das Urteil $ \ \ \ $ Wenn das Inkrement der logarithmischen Wahrscheinlichkeit kleiner oder gleich dem voreingestellten Schwellenwert ist, wird davon ausgegangen, dass es konvergiert hat und die Aktualisierung endet.

Skalierung

Der Baum-Welch-Algorithmus verwendet den Vorwärtsalgorithmus und den Rückwärtsalgorithmus, um $ \ alpha_t (i) und \ beta_t (i) $ zu berechnen. Wenn die Reihe lang wird, tritt ein Unterlauf auf und es ist nicht möglich, $ \ alpha_t (i) und \ beta_t (i) $ zu berechnen. Wir werden ** Skalierung ** als Gegenmaßnahme gegen Unterlauf einführen. Führen Sie das neue $ \ hat \ alpha_t (i), c_t $ ein.

\begin{align}
& \hat \alpha_t(i) \overset{\rm{def}}{=} P(s_t = \omega_i \ | \ x_1 \cdots x_t) = \frac{P(x_1 \cdots x_t, s_t = \omega_i)}{P(x1 \cdots x_t)} \tag{29} \\
& c_t = P(x_t \ | \ x_1 \cdots x_{t - 1}) \tag{30}
\end{align}

Hier wird $ P (x_1 \ cdots x_t) $ wie folgt ausgedrückt.

\begin{align}
P(x_1 \cdots x_t) &= P(x_1) \cdot P(x_2 \ | \ x_1) \cdot \cdots \cdot P(x_{t - 1} \ | \ x_1 \cdots x_{t - 2}) \cdot P(x_t \ | \ x_1 \cdots x_{t - 1}) \\
&= c_1 \cdot c_2 \cdot \cdots \cdot c_{t - 1} \cdot c_t \\
&= \prod_{m = 1}^t c_m \tag{31}
\end{align}

Daraus ergibt sich folgende Beziehung.

\begin{align}
\hat \alpha_t(i) &= \frac{\alpha_t(i)}{P(x_1 \cdots x_t)} \\
&= \frac{\alpha_t(i)}{\prod_{m = 1}^t c_m} \\
&= \frac{\alpha_t(i)}{c_t \cdot \prod_{m = 1}^{t - 1} c_m} \\
&= \frac{\alpha_t(i)}{c_t \cdot P(x_1 \cdots x_{t - 1})} \tag{32}
\end{align}

Der Ausdruck $ (6) $ kann wie folgt umgeschrieben werden.

\begin{align}
\alpha_t(j) &= \Biggl[\sum_{i = 1}^c \alpha_{t - 1}(i) a_{ij} \Biggr]b(\omega_j, x_t) \\
&= \Biggl[\sum_{i = 1}^c \hat\alpha_{t - 1}(i) P(x_1 \cdots x_{t - 1}) a_{ij} \Biggr]b(\omega_j, x_t) \\
\frac{\alpha_t(j)}{P(x_1 \cdots x_{t - 1})} &= \Biggl[\sum_{i = 1}^c \hat\alpha_{t - 1}(i) a_{ij} \Biggr]b(\omega_j, x_t) \\
c_t \hat\alpha_t(j)&= \Biggl[\sum_{i = 1}^c \hat\alpha_{t - 1}(i) a_{ij} \Biggr]b(\omega_j, x_t) \tag{33}
\end{align}

Aus der Formel $ (33) $ kann $ c_t $ wie folgt berechnet werden.

\begin{align}
\sum_{j = 1}^c c_t \hat\alpha_t(j) &= \sum_{j = 1}^c \Biggl[\sum_{i = 1}^c \hat\alpha_{t - 1}(i) a_{ij} \Biggr]b(\omega_j, x_t) \\
c_t &= \sum_{j = 1}^c \Biggl[\sum_{i = 1}^c \hat\alpha_{t - 1}(i) a_{ij} \Biggr]b(\omega_j, x_t) \tag{34}
\end{align}

Außerdem wird $ \ hat \ beta_t (i) $ wie folgt ausgedrückt, wobei $ c_t $ verwendet wird, das durch den Vorwärtsalgorithmus erhalten wird.

c_{t + 1} \hat\beta_t(i) = \sum_{j = 1}^c a_{ij}b(\omega_j, x_{t + 1})\hat\beta_{t + 1}(j) \tag{35}

Mit $ \ hat \ alpha_t (i), \ hat \ beta_t (i) $, $ \ gamma_t (i), \ xi_t (i, j) $ können wie folgt umgeschrieben werden.

\begin{align}
\gamma_t(i) &= \hat\alpha_t(i)\hat\beta_t(i) \tag{36} \\
\xi_t(i) &= \frac{\hat\alpha_t(i)a_{ij}b(\omega_j, x_{t + 1})\hat\beta_{t + 1}(j)}{c_{t + 1}} \tag{37}
\end{align}

Die Parameter werden aktualisiert, indem die Gleichungen $ (36), (37) $ in die Gleichungen $ (26), (27), (28) $ eingesetzt werden.

Implementierung

Implementierte Parameterschätzung unter Verwendung des Baum-Welch-Algorithmus in Python. Den Implementierungscode finden Sie hier. Basierend auf dem Würfeln ist die Anzahl der Zustände $ 3 $ Arten ($ c = 3 $) von $ \ omega_1, \ omega_2, \ omega_3 $, Das Ausgabesymbol ist die $ 2 $ -Spezies ($ m = 2 $) von $ v_1 und v_2 $. Dies entspricht dem Auswählen und Werfen verschiedener Würfel von $ 3 $ -Spezies und dem Beobachten von ungeraden ($ v_1 ) und geraden ( v_2 $) Würfen.

Ergebnis

Die wahren Parameter sind unten gezeigt.

\boldsymbol A = \begin{pmatrix}
0.1 & 0.7 & 0.2 \\
0.2 & 0.1 & 0.7 \\
0.7 & 0.2 & 0.1
\end{pmatrix}, \ \ \  
\boldsymbol B = \begin{pmatrix}
0.9 & 0.1 \\
0.6 & 0.4 \\
0.1 & 0.9
\end{pmatrix},  \ \ \ 
\boldsymbol \rho = \begin{pmatrix}
1.0 & 0.0 & 0.0
\end{pmatrix}

Die Anfangswerte für die Schätzung wurden wie folgt eingestellt.

\boldsymbol A = \begin{pmatrix}
0.15 & 0.60 & 0.25 \\
0.25 & 0.15 & 0.60 \\
0.60 & 0.25 & 0.15
\end{pmatrix}, \ \ \  
\boldsymbol B = \begin{pmatrix}
0.5 & 0.5 \\
0.5 & 0.5 \\
0.5 & 0.5
\end{pmatrix},  \ \ \ 
\boldsymbol \rho = \begin{pmatrix}
1.0 & 0.0 & 0.0
\end{pmatrix}

Das Schätzergebnis ist wie folgt.

\boldsymbol A = \begin{pmatrix}
0.11918790 & 0.63863200 & 0.24218010 \\
0.13359797 & 0.07275209 & 0.79364994 \\
0.72917405 & 0.18715812 & 0.08366783
\end{pmatrix}, \ \ \  
\boldsymbol B = \begin{pmatrix}
0.92503797 & 0.07496203 \\
0.56298958 & 0.43701042 \\
0.14059588 & 0.85940412
\end{pmatrix}

Der Prozess zum Erhöhen der logarithmischen Wahrscheinlichkeit ist wie folgt.

logP.png

Schließlich wird der Konvergenzprozess von $ b_ {11}, b_ {21}, b_ {31} $ unten gezeigt. Die dünne schwarze Linie repräsentiert den wahren Wert.

B1.png

abschließend

Ich konnte die HMM-Parameterschätzung in Python implementieren. Wenn Sie Fehler haben, weisen Sie bitte darauf hin.

Recommended Posts

Implementierung der HMM-Parameterschätzung in Python
RNN-Implementierung in Python
ValueObject-Implementierung in Python
SVM-Implementierung in Python
Schätzung der Kerneldichte in Python
Implementierung eines neuronalen Netzwerks in Python
Implementierung der schnellen Sortierung in Python
Übertragen Sie Parameterwerte in Python
Höchstwahrscheinlich Schätzungsimplementierung des Themenmodells in Python
Optimierung der FX-Systolenparameter in Python
Implementierung einer gemischten Normalverteilung in Python
Implementierung eines Lebensspiels in Python
Implementierung der ursprünglichen Sortierung in Python
Warteschlangen- und Python-Implementierungsmodul "deque"
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Minimale Implementierung von Union Find in Python
[Implementierung zum Lernen] Implementieren Sie Stratified Sampling in Python (1)
Erläuterung der Bearbeitungsentfernung und Implementierung in Python