الگوریتم ویتربی

**الگوریتم ویتربی**  الگوریتمی پویا برای پیدا کردن محتمل‌ترین مسیر از حالت‌های پنهان، با داشتن یک توالی از مشاهدات است.

این الگوریتم اغلب در مواردی بکار می‌رود که با داشتن یک مدل پنهان مارکف و توالی‌ای از مشاهدات، می‌خواهیم بدانیم چه توالی‌ای از حالت‌ها (مسیر) این مشاهدات را تولید کرده‌اند. به عبارت دیگر ما دنبال محتمل‌ترین مسیر به‌وجودآورندهٔ مشاهدات در یک مدل پنهان مارکف هستیم.

الگوریتم ویتربی از نام اندرو ویتربی گرفته شده است که در سال ۱۹۶۷ آن را به عنوان الگوریتمی رمزگشا برای کدهای کانولوشنال از طریق پیوندهای ارتباطی دیجیتالی نویزی ارائه کرد. 

## پیدایش و کاربردها
در بسیاری از کاربردهای مدل‌های پنهان مارکف، متغیرهای پنهان تفسیر معناداری دارند و در نتیجه یکی از مهم‌ترین مسائل در این حیطه، پیدا کردن محتمل‌ترین توالی از متغیرهای پنهان با داشتن یک توالی از مشاهدات است. به‌عنوان مثال، در حوزهٔ بازشناسی گفتار، می‌خواهیم یک توالی از واج‌ها با استفاده از توالی‌ای از آواها داشته باشیم.

این مسئله نباید با مسئلهٔ پیدا کردن محتمل‌ترین مجموعه از حالت‌های پنهان اشتباه گرفته شود. مسئلهٔ دوم می‌تواند با استفاده از الگوریتم پس‌رو-پیش‌رو حل شود. بدین صورت که ابتدا توزیع حاشیه‌ای برای هر متغیر نهان را به‌دست آورده و سپس جداگانه آن‌ها را بیشینه می‌کنیم. اما در حالت کلی، مسئلهٔ پیدا کردن محتمل‌ترین *توالی* پراهمیت‌تر بوده و الگوریتم بهینهٔ ارائه‌شده برای آن، الگوریتم جمع-بیشینه که در حیطهٔ مدل‌های پنهان مارکف، به آن الگوریتم *ویتربی* گفته می‌شود استفاده کرد.

در مسائل طبیعی مانند در، همیشه واقعیت منطبق بر محتمل‌ترین مسیر نیست. اما بسیاری اوقات محتمل‌ترین مسیر نیز اطلاعات خوبی در اختیار می‌گذارد.

### مدل‌های پنهان مارکف برای جزایز سی‌پی‌جی
در این بخش، به بررسی یکی از کاربردهای این مسئله در بیوانفورماتیک می‌پردازیم. مسئله جزایر سی‌پی‌جی (CpG islands) -پیدا کردن ناحیه‌ای از ژنوم که فرکانس بالایی از مکان‌های CG در آن وجود دارد- است. این مسئله را می‌توان با استفاده از دو مدل مخفی مارکف مدل کرد. کافی است حالت‌های مخفی را دو حالتِ model_+ و model_- در نظر گیریم به‌طوری که زمانی که در ناحیهٔ سی‌جی‌پی قرار داریم یا زمانی که در این ناحیه قرار نداریم؛ و حالت‌هایمان نیز حروف A, C، G و T که در واقع نوکلئوتیدهای روی رشته‌اند در نظر گیریم. پس مجموعاً ۸ حالت مخفی که در شکل زیر نمایش داده شده‌اند را داریم.

## جستجوی کامل فضای مسئله
می‌توانیم تمامی مسیرهای ممکن را که مشاهده ما را تولید می‌کنند را پیدا کنیم، سپس با محاسبه احتمال آنها، محتمل‌ترین مسیر را بدست آوریم. به عنوان نمونه در مسئله آب و هوا (می‌توانید در مثال‌هایی برای مدل پنهان مارکف ببینید) مشاهدی ما به صورت خشک، نم‌دار، مرطوب است. برای به‌دست آوردن محتمل‌ترین مسیر باید احتمال زیر بیشینه شود:

Pr(توالی مشاهده شده | انتخابی از حالت‌های مخفی)

برای جستجوی تمامی فضای جواب باید این احتمال را برای تمامی مسیرها بدست بیاوریم:
Pr(خشک، نم‌دار، مرطوب | آفتابی، آفتابی، آفتابی)، Pr(خشک، نم‌دار، مرطوب | آفتابی، آفتابی، ابری)، Pr(خشک، نم‌دار، مرطوب | آفتابی، آفتابی، بارانی)، . . Pr(خشک، نم‌دار، مرطوب | بارانی، بارانی، بارانی)
پیچیدگی زمانی این راه‌حل از اندازهٔ نمایی (O(a^n)) بوده و بهینه نیست. برای سرعت بخشیدن به الگوریتم می‌توان از تکنیک شاخه و حد استفاده کرد اما یک راه حل در زمان چندجمله‌ای برای این مسئله وجود دارد که الگوریتم ویتربی است.

## الگوریتم ویتربی
همان‌طور که در بخش قبل توضیح داده‌شد، تعداد حالت‌های ممکن برای متغیرهای پنهان یا معادلاً تعداد مسیرها نسبت به طول توالی از اندازهٔ نمایی است. شکل زیر، حالت‌های متغیرهای نهان یک مدل پنهان مارکف را به‌صورت یک شبکه نشان داده‌است که در آن، حالت‌های مختلف برای هر متغیر نهان با رنگ‌های متفاوت مشخص شده‌اند و متغیرهای نهان به‌صورت افقی از چپ به راست نمایش داده شده‌اند. با استفاده از الگوریتم ویتربی، می‌خواهیم محتمل‌ترین مسیر را در این شبکه بیابیم به‌طوری که هزینهٔ محاسباتی به‌صورت خطی با طول توالی افزایش یابد.

بندانگشتی|تعداد مسیرهای مختلف یا به عبارت دیگر حالت‌های ممکن برای متغیرهای پنهان، از اندازهٔ نمایی است ولی با استفاده از الگوریتم ویتربی می‌توان محتمل‌ترین آن‌ها را با استفاده از الگوریتم چندجمله‌ای به‌دست‌آورد. برای هر مسیر داده‌شده، احتمال متناظر با استفاده از ضرب مقادیر ماتریس انتقال احتمال‌ها برای هر قسمت از مسیر با استفاده از احتمال‌های انتشار متناظر با هر گره در مسیر به‌دست می‌آید.|339x339پیکسل

### تعریف مسئله
با توجه به توضیحات داده‌شده، می‌دانیم می‌توان مسئله را به‌صورت زیر بازنویسی کرد:

می‌خواهیم مسیر بهینه‌ای مانند \pi^*پیدا کنیم به‌گونه‌ای که داشته باشیم: \pi^* = argmax_\pi \mathbb{P}(x, \pi). که در آن x = (x_1, \dots, x_L)یک توالی از مشاهدات و \pi = (\pi_1, \dots, \pi_L)یک توالی از متغیرهای پنهان باشد.

می‌دانیم برای محاسبهٔ احتمال بالا داریم: \mathbb{P}(x, \pi) = p_{0, \pi_1} \Pi_{i=1}^L e_{\pi_i}(x_i) p_}. که در آن p مقادیر احتمال‌های انتقال و e احتمال انتشار را نشان می‌دهد. برای اطلاعات بیشتر به صفحهٔ مدل پنهان مارکف مراجعه کنید.

### ایدهٔ الگوریتم
اگر گره‌های گراف روبرو را با استفاده از دوتایی‌هایی که به‌ترتیب از شمارهٔ متغیر نهان و شمارهٔ حالت‌های ممکن برای آن‌ها تشکیل‌شده باشند، نمایش دهیم، می‌توان وزن بین دو گرهٔ (k, i)و (l, i+1)را برابر با مقدار e_l(x_{i+1}).p_{kl}تعریف کرد. حال می‌توان احتمال p_{k, i} برای یک مسیر مانند \pi به‌طوری که با یال p_{l, i+1} به گرهٔ (k, i)ختم شود را به‌صورت زیر محاسبه کرد:

p_{l,i+1}

= \Pi_{j = 1}^{i+1} e_{\pi_j}(x_j) p_} =
\big ( \Pi_{j = 1}^{i} e_{\pi_j}(x_j) p_{\pi_{j-1}, {\pi_j}} \big ).
e_{\pi_{i+1}}(x_{i+1}) p_{\pi_{i}, {\pi_{i + 1}}}
= p_{k,i}. e_l(xi+1)p_{kl}

حال کافی است متغیر v_k(i)را به‌طوری تعریف کنیم که احتمال بهترین مسیر تا مکان iباشد، به‌طوری که توالی مشاهدات به x_iختم شده‌باشد و متغیر نهان برابر با kباشد؛ بنابراین طبق نتایج بالا داریم:

v_l(i + 1)
= \max_{k \in Q} \{v_k(i).p_{kl}.
e_l(x_{i+1})\}
= e_l (x_{i+1}) \max_{k\in Q} \{v_k(i) p_{kl}\}

### شبه‌کد الگوریتم
**ورودی:**

مدل M=(\Sigma,Q,P,e) که:

:\Sigma: الفبای مشاهدات
:Q: مجموعه حالات
:P: ماتریس احتمال انتقال بین حالات
:e: ماتریس احتمال تولید الفبا در هر حالت
و توالی X=x_1x_2\dots x_L

**خروجی:** محتمل‌ترین مسیر \pi^*به‌گونه‌ای که \pi^*=argmax_{k\in Q}(v_k(L)p_{k0})

**محاسبات آغازین:** (i=۰) قرار بده V_0(0)=1  و برای تمام kهای بزرگتر از صفر قرار بده V_K(0)=0

:برای i از ۱ تا L و تمامی lها عضو Q
::قرار بده v_l(i)=e_l(x_i)\max_{k\in Q}(v_k(i-1)p_{kl})
::قرار بده ptr_i(l)=argmax_{k \in Q}(v_k(i-1)p_{kl})

**خاتمه:** P(X,\pi^*)=\max_{k \in Q}(v_k(L)p_{k0})

و محتمل‌ترین مسیر  \pi^*_L=argmax_{k\in Q}(v_k(L)p_{k0})

**بازگشت**:
:برای i از L تا ۱:
:: قرار بده \pi_{i-1}^*=ptr_i(\pi_i^*)

## منابع
رده:آشکارسازی و اصلاح خطا
رده:برنامه‌نویسی پویا
رده:مدل‌های مارکوف