<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Viterbi-Algorithmus</id>
	<title>Viterbi-Algorithmus - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Viterbi-Algorithmus"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Viterbi-Algorithmus&amp;action=history"/>
	<updated>2026-05-29T17:13:06Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Viterbi-Algorithmus&amp;diff=255380&amp;oldid=prev</id>
		<title>imported&gt;Invisigoth67: typo</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Viterbi-Algorithmus&amp;diff=255380&amp;oldid=prev"/>
		<updated>2024-08-16T15:24:46Z</updated>

		<summary type="html">&lt;p&gt;typo&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Der &amp;#039;&amp;#039;&amp;#039;Viterbi-Algorithmus&amp;#039;&amp;#039;&amp;#039; ist ein [[Algorithmus]] der [[Dynamische Programmierung|dynamischen Programmierung]] zur Bestimmung der wahrscheinlichsten Sequenz von verborgenen Zuständen bei einem gegebenen [[Hidden Markov Model]] (HMM) und einer beobachteten Sequenz von Symbolen. Diese Zustandssequenz wird auch als &amp;#039;&amp;#039;&amp;#039;Viterbi-Pfad&amp;#039;&amp;#039;&amp;#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Er wurde von [[Andrew J. Viterbi]] 1967 zur [[Dekodierung]] von [[Faltungscode]]s entwickelt, er fiel quasi als Nebenprodukt bei der Analyse der Fehlerwahrscheinlichkeit von Faltungscodes ab. G. D. Forney leitete daraus 1972 den [[Optimalfilter|Optimalempfänger]] für verzerrte und gestörte Kanäle her. Der Viterbi-Algorithmus wird heutzutage zum Beispiel in [[Mobiltelefon]]en oder [[Wireless LAN]]s zur [[Fehlerkorrektur]] der [[Funkübertragung]] verwendet, ebenso in [[Festplatte]]n, da bei der Aufzeichnung auf die Magnetplatten ebenfalls Übertragungsfehler entstehen.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus ist in der [[Nachrichtentechnik]] und [[Informatik]] weit verbreitet: Die [[Informationstheorie]], [[Bioinformatik]], [[Spracherkennung]] und [[Computerlinguistik]] verwenden häufig den Viterbi-Algorithmus.&lt;br /&gt;
&lt;br /&gt;
== Hidden Markov-Modell ==&lt;br /&gt;
Gegeben sei ein HMM &amp;lt;math&amp;gt;\lambda=(S;V;A;B;\pi)&amp;lt;/math&amp;gt; mit&lt;br /&gt;
*&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; – Menge der verborgenen Zustände&lt;br /&gt;
*&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; – [[Alphabet (Informatik)|Alphabet]] der beobachtbaren Symbole (Emissionen)&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – [[Übergangsmatrix|Zustandsübergangsmatrix]]&lt;br /&gt;
*&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; – Beobachtungsmatrix&lt;br /&gt;
*&amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; – Anfangswahrscheinlichkeitsverteilung&lt;br /&gt;
&lt;br /&gt;
== Aufgabenstellung ==&lt;br /&gt;
Sei &amp;lt;math&amp;gt;\boldsymbol o = o_1 o_2 \ldots o_T \in V^*&amp;lt;/math&amp;gt; die beobachtete Sequenz von Symbolen.&lt;br /&gt;
Es soll die wahrscheinlichste Zustandsfolge &amp;lt;math&amp;gt;\boldsymbol q^* = q^*_1 q^*_2 \ldots q^*_T \in S^T&amp;lt;/math&amp;gt; berechnet werden.&lt;br /&gt;
Also diejenige Sequenz von verborgenen Zuständen, die unter allen Folgen &amp;lt;math&amp;gt;\boldsymbol q&amp;lt;/math&amp;gt; der Länge &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; den Wert von &amp;lt;math&amp;gt;P(\boldsymbol q|\boldsymbol o; \lambda)&amp;lt;/math&amp;gt; maximiert, das ist die Wahrscheinlichkeit, dass das Modell &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; bei Erzeugung der Ausgabe &amp;lt;math&amp;gt;\boldsymbol o&amp;lt;/math&amp;gt; durch die Zustände &amp;lt;math&amp;gt;\boldsymbol q&amp;lt;/math&amp;gt; gelaufen ist.&lt;br /&gt;
&lt;br /&gt;
Nach den Rechenregeln für [[bedingte Wahrscheinlichkeit]]en gilt:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\boldsymbol q|\boldsymbol o;\lambda) = \frac{P(\boldsymbol o;\boldsymbol q|\lambda)}{P(\boldsymbol o|\lambda)} &amp;lt;/math&amp;gt;&lt;br /&gt;
Da außerdem &amp;lt;math&amp;gt;P(\boldsymbol o|\lambda)&amp;lt;/math&amp;gt; nicht von &amp;lt;math&amp;gt;\boldsymbol q&amp;lt;/math&amp;gt; abhängt, ergibt sich folgender Zusammenhang:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(\boldsymbol o;\boldsymbol q^*|\lambda) = \max_{\boldsymbol q \in S^T} P(\boldsymbol o;\boldsymbol q|\lambda)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die eigentliche Berechnung werden nun zwei verschiedene Arten von Variablen – &amp;lt;math&amp;gt;\vartheta_t(i)&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;\psi_t(i)&amp;lt;/math&amp;gt; – verwendet:&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;math&amp;gt;\vartheta_t(i)&amp;lt;/math&amp;gt; ist die maximale [[Multivariate Verteilung|Verbundwahrscheinlichkeit]] gespeichert zum Zeitpunkt &amp;lt;math&amp;gt;1 \le t \le T&amp;lt;/math&amp;gt; bei der Beobachtung des [[Wort (Theoretische Informatik)#Präfix|Präfixes]] &amp;lt;math&amp;gt;o_1 o_2 \ldots o_t&amp;lt;/math&amp;gt; durch eine Zustandsfolge der Länge &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; gelaufen zu sein und im Zustand &amp;lt;math&amp;gt;s_i \in S&amp;lt;/math&amp;gt; zu enden:&lt;br /&gt;
:&amp;lt;math&amp;gt;\vartheta_t(i) = \max_{\boldsymbol q \in S^t \atop q_t = s_i} P(o_1 o_2 \ldots o_t; q_1 q_2 \ldots q_t| \lambda)&amp;lt;/math&amp;gt;&lt;br /&gt;
Die Variable &amp;lt;math&amp;gt;\psi_t(i)&amp;lt;/math&amp;gt; dagegen merkt sich für jeden Zeitpunkt und jeden Zustand, welcher Vorgängerzustand an der Maximumsbildung beteiligt war.&lt;br /&gt;
&lt;br /&gt;
== Algorithmus ==&lt;br /&gt;
Die Variablen &amp;lt;math&amp;gt;\vartheta_t(i)&amp;lt;/math&amp;gt; sowie &amp;lt;math&amp;gt;\psi_t(i)&amp;lt;/math&amp;gt; lassen sich rekursiv bestimmen:&lt;br /&gt;
&lt;br /&gt;
;Initialisierung&lt;br /&gt;
:&amp;lt;math&amp;gt;\vartheta_1(i) = \pi_i \cdot b_i(o_1),\ \psi_1(i) = 0, \qquad 1 \le i \le \left| S \right|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Rekursion&lt;br /&gt;
Für &amp;lt;math&amp;gt;\ 1 &amp;lt; t \le T&amp;lt;/math&amp;gt; berechne&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\vartheta_t(i) &amp;amp;= b_i(o_t)\ \cdot\ \max_{1 \le j \le \left|S\right|} (a_{ji}\ \cdot\ \vartheta_{t-1}(j)), \qquad 1 \le i \le \left| S \right|\\&lt;br /&gt;
\psi_t(i) &amp;amp;= \underset{{1 \le j \le \left|S\right|}}{\operatorname{argmax}}\ (a_{ji}\ \cdot\ \vartheta_{t-1}(j)), \qquad 1 \le i \le \left| S \right|&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Terminierung&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
P(\boldsymbol o;\boldsymbol q^*|\lambda) &amp;amp;= \max_{1 \le j \le \left|S\right|} \vartheta_T(j)\\&lt;br /&gt;
q^*_T &amp;amp;= \underset{{1 \le j \le \left|S\right|}}{\operatorname{argmax}}\ \vartheta_{T}(j)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Pfadermittlung&lt;br /&gt;
:&amp;lt;math&amp;gt;q^*_t = \psi_{t+1}(q^*_{t+1}), \qquad 1 \le t &amp;lt; T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
Die Tabelle der &amp;lt;math&amp;gt;\vartheta_t(i)&amp;lt;/math&amp;gt; benötigt &amp;lt;math&amp;gt;O(\left| S \right| \cdot T)&amp;lt;/math&amp;gt; Speicher, die Matrix der &amp;lt;math&amp;gt;\psi_t(i)&amp;lt;/math&amp;gt; ist von gleichem Umfang.&lt;br /&gt;
Für jede Zelle der beiden Matrizen wird über &amp;lt;math&amp;gt;\left| S \right|&amp;lt;/math&amp;gt; Alternativen optimiert, also ist die Laufzeit in &amp;lt;math&amp;gt;O(\left| S \right|^2 T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Um den Speicherplatz zu halbieren, kann der Pfad &amp;lt;math&amp;gt;\boldsymbol q^*&amp;lt;/math&amp;gt; alternativ auch nach der Terminierung durch [[Backtracking]] in der Matrix aller &amp;lt;math&amp;gt;\vartheta_t(i)&amp;lt;/math&amp;gt; – also ohne die zusätzlichen Variablen &amp;lt;math&amp;gt;\psi_t(i)&amp;lt;/math&amp;gt; – ermittelt werden.&lt;br /&gt;
Da aber in der Praxis die Berechnung von &amp;lt;math&amp;gt;\psi_t(i)&amp;lt;/math&amp;gt; keinen Mehraufwand verursacht, verlängert sich die benötigte Rechenzeit bei dem Backtracking-Ansatz geringfügig.&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
Der Viterbi-Algorithmus ist der optimale Algorithmus zur Dekodierung von Faltungscodes im Sinne der Blockfehlerrate (maximum likelihood sequence estimation). Der im Sinne der Symbolfehlerrate optimale Dekodieralgorithmus ist der [[BCJR-Algorithmus]].&lt;br /&gt;
&lt;br /&gt;
Wie man aus der Beschreibung des Algorithmus sieht, kann er fast überall eingesetzt werden, um [[Mustererkennung|Muster zu erkennen]]. Das ist ein weites Feld, da Lebewesen ständig Sinnesreize interpretieren müssen und aus dem bereits Gelernten diese Signale einordnen. Der Viterbi-Algorithmus tut genau das auch und ist somit ein wichtiger Baustein der [[Künstliche Intelligenz|Künstlichen Intelligenz]].&lt;br /&gt;
&lt;br /&gt;
Einen wichtigen Stellenwert nimmt der Algorithmus in der Bioinformatik ein, denn anhand des Viterbi-Algorithmus kann unter anderem von der tatsächlichen Sequenz eines DNA-Abschnitts auf eventuelle versteckte Zustände geschlossen werden. So kann zum Beispiel untersucht werden, ob es sich bei einer vorliegenden Sequenz wahrscheinlich um ein bestimmtes Strukturmotiv handelt ([[CpG-Insel]], [[Promotor (Genetik)|Promotor]], …) oder nicht. Vorteil dieses rekursiven Algorithmus ist hierbei der linear mit der Sequenzlänge steigende Aufwand im Gegensatz zum exponentiellen Aufwand des zugrundeliegenden Hidden Markov Model.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Forward-Algorithmus]]&lt;br /&gt;
* [[Backward-Algorithmus]]&lt;br /&gt;
* [[Baum-Welch-Algorithmus]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{Literatur&lt;br /&gt;
|Autor=A. Viterbi&lt;br /&gt;
|Titel=Error bounds for convolutional codes and an asymptotically optimum decoding algorithm&lt;br /&gt;
|Sammelwerk=IEEE Transactions on Information Theory&lt;br /&gt;
|Jahr=1967&lt;br /&gt;
|ISSN=0018-9448&lt;br /&gt;
|Seiten=260–269&lt;br /&gt;
|Band=13&lt;br /&gt;
|Nummer=2&lt;br /&gt;
|Online=[http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?isnumber=22634&amp;amp;arnumber=1054010 IEEE Xplore]&lt;br /&gt;
|DOI=10.1109/TIT.1967.1054010&lt;br /&gt;
}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
|Autor=Durbin et al.&lt;br /&gt;
|Titel=Biological sequence analysis&lt;br /&gt;
|Verlag=Cambridge&lt;br /&gt;
|Jahr=2006&lt;br /&gt;
|ISBN=0-521-62971-3&lt;br /&gt;
|Seiten=56&lt;br /&gt;
}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
|Autor=Forney Jr., G. D.&lt;br /&gt;
|Titel=The Viterbi Algorithm.&lt;br /&gt;
|Sammelwerk=In Proceedings of the IEEE&lt;br /&gt;
|Jahr=1973&lt;br /&gt;
|Seiten=268–278&lt;br /&gt;
|Band=61&lt;br /&gt;
|Nummer=3&lt;br /&gt;
|Online=[http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=1450960 IEEE Xplore]&lt;br /&gt;
|DOI=10.1109/PROC.1973.9030&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://home.netcom.com/~chip.f/Viterbi.html Erklärung des Viterbi-Algorithmus für Faltungscodes] (englisch)&lt;br /&gt;
* {{Scholarpedia|http://www.scholarpedia.org/article/Viterbi_algorithm|Viterbi algorithm|Andrew J. Viterbi}}&lt;br /&gt;
* E.G. Schukat-Talamazzini: [http://www.minet.uni-jena.de/fakultaet/schukat/MAS/Scriptum/lect05-HMM.pdf &amp;#039;&amp;#039;Spezielle Musteranalysesysteme&amp;#039;&amp;#039;] (PDF, 1,3 MB) Vorlesung im WS 2012/13 an der Universität Jena. Kapitel 5 Folie 39 ff.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Computerlinguistik]]&lt;br /&gt;
[[Kategorie:Dynamische Programmierung]]&lt;br /&gt;
[[Kategorie:Künstliche Intelligenz]]&lt;br /&gt;
[[Kategorie:Nachrichtentechnik]]&lt;br /&gt;
[[Kategorie:Optimierungsalgorithmus]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Invisigoth67</name></author>
	</entry>
</feed>