אלגוריתם ויטרבי

אלגוריתם ויטרבי (באנגלית: Viterbi Algorithm), אלגוריתם תכנון דינמי למציאת רצף המצבים החבויים הסביר ביותר, שתוצאתו היא רצף תצפיות נתון. בין שימושיו הנפוצים - מציאת רצף המצבים בהנחת מודל מרקוב חבוי, פיענוח קודי קונבולוציה ועוד רבים. תחת זאת, משמש באופן תדיר במערכות תקשורת, כגון IEEE 802.11. יתרונו הבולט של האלגוריתם הוא הורדת סיבוכיות המציאה של הרצף הסביר ביותר - מהמימוש הנאיבי (בעל סיבוכיות מעריכית בגודל הרצף) למימוש היעיל של האלגוריתם (בעל סיבוכיות ליניארית בגודל הרצף). האלגוריתם פותח לראשונה על ידי אנדרו ויטרבי בשנת 1967 לטובת פיענוח קוד קונבולוציה מעל ערוץ תקשורת רועש. הוא פותח באופן בלתי-תלוי על ידי מספר גורמים אחרים. אלגוריתם ויטרבי מקבל כקלט רצף תצפיות Y = ( y 1 , y 2 , … , y T ) ∈ { 1 , 2 , … , N } T {\displaystyle Y=(y_{1},y_{2},\ldots ,y_{T})\in \{1,2,\dots ,N\}^{T}} , ומטרתו להוציא את רצף המצבים X = ( x 1 , x 2 , … , x T ) ∈ S = { s 1 , s 2 , … , s K } T {\displaystyle X=(x_{1},x_{2},\ldots ,x_{T})\in S=\{s_{1},s_{2},\dots ,s_{K}\}^{T}} הסביר ביותר בהינתן התצפיות Y {\displaystyle Y} . בהקשר זה, T {\displaystyle T} הוא אורך הרצף (תצפיות ומצבים), N {\displaystyle N} הוא גודל מרחב התצפיות ו- K {\displaystyle K} הוא גודל מרחב המצבים. במהלך פעולתו, האלגוריתם משתמש בשתי טבלאות בגודל K × T {\displaystyle K\times T} : טבלה T 1 {\displaystyle T_{1}} , שבה האיבר T 1 [ i , j ] {\displaystyle T_{1}[i,j]} מכיל את ההסתברות של הנתיב (רצף) הכי סביר עד כה: X ^ = ( x ^ 1 , x ^ 2 , … , x ^ j ) {\displaystyle {\hat {X}}=({\hat {x}}_{1},{\hat {x}}_{2},\ldots ,{\hat {x}}_{j})} . טבלה T 2 {\displaystyle T_{2}} שבה האיבר T 2 [ i , j ] {\displaystyle T_{2}[i,j]} מכיל את x ^ j − 1 {\displaystyle {\hat {x}}_{j-1}} של המסלול הסביר ביותר עד כה. האלגוריתם ממלא את הטבלאות לפי סדר עולה של K ⋅ j + i {\displaystyle K\cdot j+i} , ולפי הנוסחאות הרקורסיביות: T 1 [ i , j ] = max k ( T 1 [ k , j − 1 ] ⋅ A k i ) ⋅ B i y j {\displaystyle T_{1}[i,j]=\max _{k}{(T_{1}[k,j-1]\cdot A_{ki})\cdot B_{iy_{j}}}} T 2 [ i , j ] = argmax k ⁡ ( T 1 [ k , j − 1 ] ⋅ A k i ) {\displaystyle T_{2}[i,j]=\operatorname {argmax} _{k}{(T_{1}[k,j-1]\cdot A_{ki})}} כאשר A k i {\displaystyle A_{ki}} ו- B i y j {\displaystyle B_{iy_{j}}} מוגדרים מטה. קלט מרחב התצפיות O = { o 1 , o 2 , … , o N } {\displaystyle O=\{o_{1},o_{2},\dots ,o_{N}\}} מרחב המצבים S = { s 1 , s 2 , … , s K } {\displaystyle S=\{s_{1},s_{2},\dots ,s_{K}\}} ההסתברויות ההתחלתיות Π = ( π 1 , π 2 , … , π K ) {\displaystyle \Pi =(\pi _{1},\pi _{2},\dots ,\pi _{K})} , כך ש- π i {\displaystyle \pi _{i}} היא ההסתברות ש- x 1 == s i {\displaystyle x_{1}==s_{i}} רצף תצפיות Y = ( y 1 , y 2 , … , y T ) {\displaystyle Y=(y_{1},y_{2},\ldots ,y_{T})} כך ש- y t == i {\displaystyle y_{t}==i} אם התצפית בזמן t {\displaystyle t} היא o i {\displaystyle o_{i}} מטריצת המעברים A {\displaystyle A} ממימד K ⋅ K {\displaystyle K\cdot K} כך ש- A i j {\displaystyle A_{ij}} היא הסתברות המעבר ממצב s i {\displaystyle s_{i}} למצב s j {\displaystyle s_{j}} מטריצת הפלטים B {\displaystyle B} ממימד K ⋅ N {\displaystyle K\cdot N} כך ש- B i j {\displaystyle B_{ij}} הוא ההסתברות לתצפית o j {\displaystyle o_{j}} בהינתן שהמצב הוא s i {\displaystyle s_{i}} פלט רצף המצבים הסביר ביותר X = ( x 1 , x 2 , … , x N ) {\displaystyle X=(x_{1},x_{2},\ldots ,x_{N})} function VITERBI ( O , S , Π , Y , A , B ) : X {\displaystyle (O,S,\Pi ,Y,A,B):X} for each state i ∈ { 1 , 2 , … , K } {\displaystyle i\in \{1,2,\ldots ,K\}} do T 1 [ i , 1 ] ← π i ⋅ B i y 1 {\displaystyle T_{1}[i,1]\leftarrow \pi _{i}\cdot B_{iy_{1}}} T 2 [ i , 1 ] ← 0 {\displaystyle T_{2}[i,1]\leftarrow 0} end for for each observation i = 2 , 3 , … , T {\displaystyle i=2,3,\ldots ,T} do for each state j ∈ { 1 , 2 , … , K } {\displaystyle j\in \{1,2,\ldots ,K\}} do T 1 [ j , i ] ← B j y 1 ⋅ max k ( T 1 [ k , i − 1 ] ⋅ A k j ) {\displaystyle T_{1}[j,i]\leftarrow B_{jy_{1}}\cdot \max _{k}{(T_{1}[k,i-1]\cdot A_{kj})}} T 2 [ j , i ] ← arg ⁡ max k ( T 1 [ k , i − 1 ] ⋅ A k j ) {\displaystyle T_{2}[j,i]\leftarrow \arg \max _{k}{(T_{1}[k,i-1]\cdot A_{kj}})} end for end for z T ← arg ⁡ max k ( T 1 [ k , T ] ) {\displaystyle z_{T}\leftarrow \arg \max _{k}{(T_{1}[k,T])}} x T ← s z T {\displaystyle x_{T}\leftarrow s_{z_{T}}} for i ← T , T − 1 , … , 2 {\displaystyle i\leftarrow T,T-1,\dots ,2} do z i − 1 ← T 2 [ z i , i ] {\displaystyle z_{i-1}\leftarrow T_{2}[z_{i},i]} x i − 1 ← s z i − 1 {\displaystyle x_{i-1}\leftarrow s_{z_{i-1}}} end for return X {\displaystyle X} end function סיבוכיות האלגוריתם היא O ( T × | S | 2 ) {\displaystyle O(T\times \left|{S}\right|^{2})} . מדיה וקבצים בנושא אלגוריתם ויטרבי בוויקישיתוף מימושים ב-Java, C#, ועוד באתר wikibooks. הסבר מפורט(הקישור אינו פעיל) על האלגוריתם בהקשרי קודי קונבולוציה ההיסטוריה של האלגוריתם - מאת David Forney