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 **.
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.
Die Symbole zum Ausdrücken des Markov-Modells sind nachstehend zusammengefasst.
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 >
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 >
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 >
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.
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
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.
Schließlich wird der Konvergenzprozess von $ b_ {11}, b_ {21}, b_ {31} $ unten gezeigt. Die dünne schwarze Linie repräsentiert den wahren Wert.
Ich konnte die HMM-Parameterschätzung in Python implementieren. Wenn Sie Fehler haben, weisen Sie bitte darauf hin.
Recommended Posts