زنجیر مارکوف چیست؟ با مثال های کد پایتون توضیح داده شده است
ابزارهای ریاضی مختلفی وجود دارد که می توان از آنها برای پیش بینی آینده نزدیک بر اساس وضعیت فعلی استفاده کرد. یکی از پرکاربردترین آنها زنجیر مارکوف است.
زنجیره های مارکوف به شما امکان می دهد تا عدم قطعیت رویدادهای آینده را تحت شرایط خاصی پیش بینی کنید. به همین دلیل، به طور گسترده در علوم، مهندسی، اقتصاد و بسیاری از زمینه های دیگر استفاده می شود.
با این حال، انواع مختلفی از زنجیره مارکوف وجود دارد و هر کدام کاربردهای خاص خود را دارند.
این راهنما به معرفی زنجیرههای مارکوف، انواع مختلف زنجیرههای مارکوف، از جمله زمان گسسته، زمان پیوسته، برگشتپذیر و نمونه کد مدلهای مارکوف پنهان (HMM) میپردازد.
خواهیم دید:
زنجیره مارکوف به زبان انگلیسی ساده توضیح داده شده است
مقایسه
تصویربرداری که می خواهید هوای فردا را پیش بینی کنید و این فقط به آب و هوای امروز بستگی دارد. هوا می تواند آفتابی یا بارانی باشد.
در اینجا احتمالات وجود دارد:
اگر امروز آفتابی باشد، به احتمال 80 درصد فردا دوباره آفتابی خواهد بود و 20 درصد احتمال دارد که باران باشد.
اگر امروز باران باشد، احتمال اینکه فردا آفتابی باشد 50 درصد و احتمال بارندگی 50 درصد وجود دارد.
در این سناریو میتوانیم با استفاده از احتمالات، وضعیتهای آینده آب و هوا را بر اساس وضعیتهای فعلی پیشبینی کنیم.
این ایده برای پیشبینی آینده صرفاً بر اساس احتمالات حال، زنجیره مارکوف نامیده میشود.
در اینجا، ایالت ها یا آفتابی یا بارانی هستند و احتمالات احتمال تغییر آب و هوا را بر اساس وضعیت فعلی توصیف می کنند.
زنجیره مارکوف به انگلیسی ساده توضیح داده شده است
یک زنجیره مارکوف فرآیندهای تصادفی را توصیف میکند که در آن سیستمها بین حالتها حرکت میکنند، و یک حالت جدید فقط به وضعیت فعلی بستگی دارد، نه اینکه چگونه به آنجا رسیده است.
از نظر ریاضی، زنجیرههای مارکوف مدلهای تصادفی نامیده میشوند، زیرا آنها رویدادهای زندگی واقعی را مدلسازی (شبیهسازی) میکنند که طبیعتاً تصادفی هستند (تصادفی).
پیادهسازی زنجیرههای مارکوف بسیار آسان است و در مدلسازی سیستمهای پیچیده کارآمد هستند.
مزیت کلیدی دیگر ویژگی "بی حافظه" آنها است. این باعث میشود که آن را سریعتر بر روی رایانهها اجرا کنید، و برای مطالعه فرآیندهای تصادفی و پیشبینی بر اساس شرایط فعلی قدرتمندتر است.
کاربردهای زنجیره مارکوف
در برخی سطوح، تقریباً تمام رویدادهای زندگی واقعی تصادفی هستند. به عبارت دیگر، آنها شامل تصادفی و عدم قطعیت هستند.
دقیقاً به همین دلیل است که آنها بسیار مورد استفاده قرار می گیرند. آنها می توانند رفتار سیستم ها را بر اساس شرایط فعلی پیش بینی کنند.
در امور مالی، از آنها برای تشخیص تغییرات در رتبه بندی اعتباری برای پیش بینی رژیم های بازار استفاده می شود.
در ژنتیک، آنها به درک چگونگی تغییر پروتئین ها در طول زمان کمک می کنند. که هنگام مطالعه تغییرات ژنتیکی مهم است.
در رباتیک، آنها با پیش بینی حرکت بعدی ربات بر اساس مشاهدات فعلی، به تصمیم گیری کمک می کنند.
در آنجا، مثالهای واقعی نشان میدهند که چگونه میتوان از زنجیرههای مارکوف برای حل مشکلات زندگی واقعی در زمینههای مختلف استفاده کرد.
انواع زنجیر مارکوف
زنجیر مارکوف انواع مختلفی دارد. در این بخش، ما تنها به مهم ترین انواع زنجیره های مارکوف می پردازیم.
زنجیره های مارکوف زمان گسسته (DTMC)
در DTMC ها، سیستم در مراحل زمانی خاص تغییر حالت می دهد. آنها گسسته نامیده می شوند زیرا انتقال حالت در بازه های زمانی مجزا و مجزا اتفاق می افتد.
آنها در تئوری صف (مطالعه رفتار خطوط انتظار)، ژنتیک و اقتصاد استفاده می شوند زیرا تجزیه و تحلیل آنها ساده است.
زنجیره های مارکوف زمان پیوسته (CTMC)
تفاوت CTMCها با DTMCها در این است که انتقال حالت می تواند در هر نقطه زمانی پیوسته رخ دهد، نه در فواصل زمانی ثابت.
این باعث می شود آنها مدل های تصادفی باشند که در آن تغییرات حالت به طور مداوم اتفاق می افتد. این در واکنش های شیمیایی و مهندسی قابلیت اطمینان مهم است.
زنجیر مارکوف برگشت پذیر
زنجیر مارکوف برگشت پذیر خاص است. روند تغییر حالت، چه جهت به جلو یا عقب باشد، یکسان است، مانند چرخاندن یک ویدیو به عقب و پخش مجدد آن.
این ویژگی تشخیص پایداری یک سیستم و مطالعه نحوه رفتار یک سیستم در طول زمان را آسان تر می کند. آنها به طور گسترده ای در فیزیک آماری و اقتصاد استفاده می شوند
زنجیر مارکوف تصادفی مضاعف
زنجیره های مارکوف تصادفی مضاعف توسط یک ماتریس احتمال انتقال تعریف می شوند. در ماتریس، مجموع احتمالات در هر سطر و هر ستون برابر با 1 است.
این بدان معنی است که هر سطر و هر ستون یک توزیع احتمال معتبر را نشان می دهد. به عبارت دیگر، هر سطر و ستون فهرستی از شانس ها را برای نتایج متفاوت نشان می دهد.
این ویژگی در محاسبات کوانتومی و مکانیک آماری بسیار مهم است.
به لطف زنجیرههای مارکوف تصادفی دوگانه، سیستمها به گونهای تغییر میکنند که احتمالات و تقارن را حفظ میکند و مدلسازی و تحلیل سیستمهای محاسباتی کوانتومی را بسیار دقیقتر میکند.
نمونه کد پنهان زنجیر مارکوف
قبل از اینکه به مثالهای کد بپردازیم، ابتدا اجازه میدهیم تا بفهمیم زنجیرههای مارکوف پنهان چیست.
زنجیره های مارکوف پنهان: مدل سازی حالت های نادیده
ایده اصلی پشت زنجیرههای مارکوف پنهان، مدلسازی سیستمهایی است که حالتهای پنهانی دارند (حالتی که ارزشهای آنها را نمیدانیم) که فقط از طریق رویدادهای قابل مشاهده قابل کشف هستند.
به عبارت دیگر، زنجیرههای مارکوف پنهان به ما اجازه میدهند تا رفتار یک سیستم را از طریق:
در نظر گرفتن احتمال انتقال از یک حالت به حالت دیگر.
دانستن احتمال مشاهده یک رویداد خاص از هر حالت
ما می توانیم این را با مشاهده چگونگی تغییر دولت ها از دیدگاه غیرمستقیم درک کنیم.
ما بسیاری از ارزش های اصلی ایالات را نمی دانیم.
اما با دانستن نحوه تغییر آنها، میتوانیم پیشبینی کنیم که ارزشهای آنها در آینده چه خواهد بود.
به این ترتیب، زنجیرههای مارکوف پنهان در مدلسازی دنبالهها انعطافپذیر هستند و هم انتقال بین حالتهای پنهان و هم نتایج قابل مشاهده را ثبت میکنند.
به همین دلیل، مدلهای پنهان مارکوف در زمینههایی مانند مهندسی، مدلسازی مالی، تشخیص گفتار، بیوانفورماتیک و بسیاری موارد دیگر استفاده میشوند.
مثال کد
در این مثال کد، یک مثال ساده با داده های مصنوعی را خواهیم دید.
اینم کد کامل:
import numpy as np from hmmlearn import hmm # Set random seed for reproducibility np.random.seed(42) # Define the HMM parameters n_components = 2 # Number of states n_features = 1 # Number of observation features # Create a Gaussian HMM model = hmm.GaussianHMM(n_components=n_components, covariance_type="diag") # Define transition matrix (rows must sum to 1) model.startprob_ = np.array([0.6, 0.4]) model.transmat_ = np.array([[0.7, 0.3], [0.4, 0.6]]) # Define means and covariances for each state model.means_ = np.array([[0.0], [3.0]]) model.covars_ = np.array([[0.5], [0.5]]) # Generate synthetic observation data X, Z = model.sample(100) # 100 samples # Create a new HMM instance new_model = hmm.GaussianHMM(n_components=n_components, covariance_type="diag", n_iter=100) # Fit the model to the data new_model.fit(X) # Print the learned parameters print("Transition matrix:") print(new_model.transmat_) print("Means:") print(new_model.means_) print("Covariances:") print(new_model.covars_) # Predict the hidden states for the observed data hidden_states = new_model.predict(X) print("Hidden states:") print(hidden_states)
بیایید بلوک به بلوک کد را ببینیم!
کتابخانه ها را وارد کنید و دانه های تصادفی را تنظیم کنید
import numpy as np from hmmlearn import hmm np.random.seed(42)
در این بلوک کد، دو کتابخانه پایتون را وارد کردیم:
NumPy : برای عملیات عددی.
hmmlearn : برای پیاده سازی مدل مخفی مارکوف.
بعد با کتابخانه numpy
یک دانه تصادفی تعریف کردیم.
دانه تصادفی چیست؟
دانه تصادفی مقداری است که برای شروع یک تولید کننده اعداد شبه تصادفی استفاده می شود.
با یک دانه تصادفی ثابت، اطمینان حاصل می کنیم که دنباله اعداد شبه تصادفی تولید شده همیشه یکسان است.
این به ما امکان می دهد آزمایش ها را تکرار کنیم و نتایج را تأیید کنیم.
ارزش ویژه بذر تا زمانی که ثابت بماند اهمیتی ندارد.
پارامترهای HMM را تعریف کنید و یک HMM گاوسی ایجاد کنید
n_components = 2 # Number of states n_features = 1 # Number of observation features model = hmm.GaussianHMM(n_components=n_components, covariance_type="diag")
در این بلوک کد، یک HMM با دو حالت پنهان و یک متغیر مشاهده شده ایجاد کردیم.
covariance_type "diag"
به معنای ماتریس هایی است که نشان دهنده کوواریانس است – اینکه چگونه دو متغیر با هم تغییر می کنند – مورب هستند. به عبارت دیگر، هر سطر و ستون مستقل از بقیه فرض می شود.
این بدان معناست که توزیع احتمال هر سطر و ستون مستقل از یکدیگر است.
با این حال، زمانی که ما زنجیره مارکوف پنهان را تعریف کردیم، هنوز چیز عجیبی وجود دارد.
"Gaussian" به چه معناست؟
این یک موضوع بسیار بزرگ در آمار است، اما در چند کلمه، زنجیرههای مارکوف تنها زمانی میتوانند ایجاد شوند که احتمالات انتقال - شانس انتقال از یک حالت به حالت دیگر در زنجیره مارکوف - و توزیع احتمال اولیه را مشخص کنیم.
یک HMM گاوسی فرض میکند که رویدادها در ابتدا توسط یک توزیع گاوسی مدلسازی شدهاند که توزیع نرمال نیز نامیده میشود.
یک توزیع نرمال مانند یک منحنی زنگی شکل است که چگونگی پراکندگی اشیا در طبیعت را توصیف می کند.
توزیع نرمال بسیار مهم است زیرا بسیاری از رویدادهای طبیعی مانند قد انسان، اشتباهات اندازه گیری، احتمال شیوع یک بیماری و بسیاری موارد دیگر را توصیف می کند.
و در حالی که بسیاری از رویدادهای طبیعی ممکن است با یک توزیع نرمال با قضیه حد مرکزی توصیف نشوند، می توان آنها را با یک توزیع نرمال توصیف کرد.
به این ترتیب، بسیاری از مدلهای پنهان مارکوف (HMM) توسط یک توزیع نرمال تعریف میشوند که نشاندهنده بسیاری از پدیدهها در طبیعت و جامعه است.
در کتابخانه hmmlearn نیز امکان ایجاد زنجیره های مارکوف بر اساس توزیع های پواسون وجود دارد.
به عبارت ساده، پواسون احتمالات را مدل سازی می کند که وقوع رویدادها را در یک بازه زمانی یا مکانی ثابت توصیف می کند. این به طور گسترده ای در ارتباطات راه دور استفاده می شود.
HMM های مبتنی بر توزیع پواسون رویدادهایی را پیش بینی می کنند که اغلب تصادفی و مستقل در یک بازه زمانی مشخص هستند.
ماتریس انتقال، میانگین ها و کوواریانس ها را برای هر حالت تعریف کنید
model.startprob_ = np.array([0.6, 0.4]) model.transmat_ = np.array([[0.7, 0.3], [0.4, 0.6]]) model.means_ = np.array([[0.0], [3.0]]) model.covars_ = np.array([[0.5], [0.5]])
model.startprob_ = np.array([0.6, 0.4])
:
این خط احتمالات حالت اولیه را برای مدل پنهان مارکوف (HMM) تنظیم می کند. این نشان می دهد که 60% احتمال شروع در حالت 0 و 40% احتمال شروع در حالت 1 وجود دارد.
model.transmat_ = np.array([[0.7, 0.3], [0.4, 0.6]])
:
این خط ماتریس احتمال انتقال حالت را برای HMM تنظیم می کند. ماتریس احتمال انتقال از یک حالت به حالت دیگر را مشخص می کند:
از حالت 0، 70% احتمال ماندن در حالت 0 و 30% احتمال انتقال به حالت 1 وجود دارد.
از حالت 1، 40% احتمال انتقال به حالت 0 و 60% احتمال ماندن در حالت 1 وجود دارد.
model.means_ = np.array([[0.0], [3.0]])
:
این خط مقادیر میانگین را برای توزیع مشاهده در هر حالت تنظیم می کند. این نشان می دهد که مشاهدات معمولاً با میانگین 0.0 در حالت 0 و میانگین 3.0 در حالت 1 توزیع می شوند.
model.covars_ = np.array([[0.5], [0.5]])
:
این خط مقادیر کوواریانس را برای توزیع مشاهده در هر حالت تنظیم می کند. مشخص می کند که واریانس (کوواریانس در این حالت 1 بعدی) مشاهدات برای هر دو حالت 0 و 1 0.5 است.
داده ها، نمونه HMM جدید ایجاد کنید و مدل را با داده ها مطابقت دهید
X, Z = model.sample(100) # 100 samples new_model = hmm.GaussianHMM(n_components=n_components, covariance_type="diag", n_iter=100) new_model.fit(X) print("Transition matrix:") print(new_model.transmat_) print("Means:") print(new_model.means_) print("Covariances:") print(new_model.covars_)
در این کد یک مدل با 100 نمونه ایجاد کردیم، آن را 100 بار تکرار کردیم و ماتریس انتقال حالت جدید، میانگین ها و کوواریانس ها را چاپ کردیم.
به عبارت دیگر، ما 100 نمونه از مدل اصلی تولید کردیم، یک مدل جدید مارکوف مخفی (HMM) را در این نمونه ها قرار دادیم و سپس پارامترهای آموخته شده این مدل جدید را چاپ کردیم.
X به معنای نمونه داده های مشاهده شده تولید شده توسط مدل اصلی است.
Z به معنای توالی حالت پنهان مربوط به نمونه های داده مشاهده شده تولید شده توسط مدل اصلی است.
ماتریس انتقال چاپ می شود:
[[0.8100804 0.1899196 ] [0.49398918 0.50601082]]
این بدان معناست که مدل تمایل دارد در حالت 0 بماند و در حالت 1 شانس تقریباً برابری برای تغییر یا ماندن دارد.
ابزار چاپ:
[[0.01577373] [3.06245496]]
به این معنی که میانگین مقدار مشاهده شده تقریباً 0.016 در حالت 0 و 3.062 در حالت 1 است.
کوواریانس ها چاپ می شوند:
[[[0.41987084]] [[0.53146802]]]
یعنی مقادیر مشاهده شده در حالت 0 حدود 0.420 و در حالت 1 0.531 تغییر می کند.
به این ترتیب، ما هرگز نمیتوانیم دقیقاً ارزشهای حالتها را بدانیم، اما میدانیم:
چگونه آنها تمایل به تغییر با یکدیگر دارند
میانگین مقدار مشاهده شده آنها
چگونه آنها متفاوت هستند
پیش بینی حالت های پنهان برای داده های مشاهده شده
hidden_states = new_model.predict(X) print("Hidden states:") print(hidden_states)
در این کد، بر اساس نمونه های X مشاهده شده، حالات جدید مدل مارکوف را پیش بینی کردیم.
حالت های پنهان چاپ می شوند:
[0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0]
به این معنی که حالت های پنهان بین حالت 0 و حالت 1 جابجا می شوند و نشان می دهند که چگونه سیستم در طول زمان حالت ها را تغییر می دهد.
نتیجه گیری: آینده زنجیره مارکوف
زنجیره های مارکوف به دلیل توانایی آنها در پیش بینی آینده بر اساس حال به طور گسترده در زمینه های STEM استفاده می شود.
زنجیره های مارکوف بیشتر با هوش مصنوعی، بهبود اتوماسیون و تجزیه و تحلیل پیشگویانه سیستم ها ادغام شده اند.
علاوه بر این، توسعه زنجیرههای مارکوف از نظر محاسباتی کارآمدتر یک اولویت بزرگ است و آنها را برای پردازش بلادرنگ و شبیهسازیهای مقیاس بزرگ در دسترستر میسازد.
به طور خلاصه، زنجیره های مارکوف به دلیل توانایی آنها در پیش بینی آینده، ابزار بسیار مهمی در علم هستند.
با هوش مصنوعی و کارایی محاسباتی بیشتر، زنجیره های مارکوف را می توان در بسیاری از زمینه های دیگر نیز به کار برد و بسیاری از مشکلات را حل کرد.
ارسال نظر