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

מתוך testwiki
קפיצה לניווט קפיצה לחיפוש

{{#invoke:ParamValidator|validateparams|module_options=יחידה:PV-options}} {{#invoke:תבנית מידע|מידע| | טבלה-עיצוב = width: 22em; font-size: 95%; | כותרת תבנית-עיצוב =background: #B2C6FF; border:1px solid #aaaaaa; border-bottom:0px; | כותרת-עיצוב = background: #B2C6FF; | תמונה = | כיתוב= | תווית-מידע10=מחלקה | תווית-מידע20=סוג | תווית-מידע30=מבנה נתונים | תווית-מידע40=סיבוכיות זמן |סיבוכיות זמן-ויקינתונים=P3752 | תווית-מידע50=סיבוכיות מקום |סיבוכיות מקום-ויקינתונים=P3755 | תווית-מידע60=ממציא |ממציא-ויקינתונים-מרובה=P61 |ממציא-ויקינתונים-פרטים=P577 | תווית-מידע70=נקרא על שם |נקרא על שם-ויקינתונים-מרובה=P138 | תווית-מידע80=הומצא |הומצא-ויקינתונים=P575

}}

אלגוריתם ויטרביאנגלית: Viterbi Algorithm), אלגוריתם תכנון דינמי למציאת רצף המצבים החבויים הסביר ביותר, שתוצאתו היא רצף תצפיות נתון. בין שימושיו הנפוצים - מציאת רצף המצבים בהנחת מודל מרקוב חבוי, פיענוח קודי קונבולוציה ועוד רבים. תחת זאת, משמש באופן תדיר במערכות תקשורת, כגון IEEE 802.11.

יתרונו הבולט של האלגוריתם הוא הורדת סיבוכיות המציאה של הרצף הסביר ביותר - מהמימוש הנאיבי (בעל סיבוכיות מעריכית בגודל הרצף) למימוש היעיל של האלגוריתם (בעל סיבוכיות ליניארית בגודל הרצף).

היסטוריה

האלגוריתם פותח לראשונה על ידי אנדרו ויטרבי בשנת 1967 לטובת פיענוח קוד קונבולוציה מעל ערוץ תקשורת רועש. הוא פותח באופן בלתי-תלוי על ידי מספר גורמים אחרים.

פסאודו-קוד

אלגוריתם ויטרבי מקבל כקלט רצף תצפיות Y=(y1,y2,,yT){1,2,,N}T, ומטרתו להוציא את רצף המצבים X=(x1,x2,,xT)S={s1,s2,,sK}T הסביר ביותר בהינתן התצפיות Y. בהקשר זה, T הוא אורך הרצף (תצפיות ומצבים), N הוא גודל מרחב התצפיות ו-K הוא גודל מרחב המצבים.

במהלך פעולתו, האלגוריתם משתמש בשתי טבלאות בגודל K×T:

  • טבלה T1, שבה האיבר T1[i,j] מכיל את ההסתברות של הנתיב (רצף) הכי סביר עד כה: X^=(x^1,x^2,,x^j).
  • טבלה T2 שבה האיבר T2[i,j] מכיל את x^j1 של המסלול הסביר ביותר עד כה.

האלגוריתם ממלא את הטבלאות לפי סדר עולה של Kj+i, ולפי הנוסחאות הרקורסיביות:

T1[i,j]=maxk(T1[k,j1]Aki)Biyj
T2[i,j]=argmaxk(T1[k,j1]Aki)

כאשר Aki ו-Biyj מוגדרים מטה.

קלט
  • מרחב התצפיות O={o1,o2,,oN}
  • מרחב המצבים S={s1,s2,,sK}
  • ההסתברויות ההתחלתיות Π=(π1,π2,,πK), כך ש-πi היא ההסתברות ש-x1==si
  • רצף תצפיות Y=(y1,y2,,yT) כך ש-yt==i אם התצפית בזמן t היא oi
  • מטריצת המעברים A ממימד KK כך ש-Aij היא הסתברות המעבר ממצב si למצב sj
  • מטריצת הפלטים B ממימד KN כך ש-Bij הוא ההסתברות לתצפית oj בהינתן שהמצב הוא si
פלט
  • רצף המצבים הסביר ביותר X=(x1,x2,,xN)
 function VITERBI(O,S,Π,Y,A,B):X
     for each state i{1,2,,K} do
         T1[i,1]πiBiy1
         T2[i,1]0
     end for
     for each observation i=2,3,,T do
         for each state j{1,2,,K} do
             T1[j,i]Bjy1maxk(T1[k,i1]Akj)
             T2[j,i]argmaxk(T1[k,i1]Akj)
         end for
     end for
     zTargmaxk(T1[k,T])
     xTszT
     for iT,T1,,2  do
         zi1T2[zi,i]
         xi1szi1
     end for
     return X
 end function

סיבוכיות האלגוריתם היא O(T×|S|2).


קישורים חיצוניים

תבנית:ויקישיתוף בשורה