ابزارهای ریاضی مختلفی وجود دارد که می توان از آنها برای پیش بینی آینده نزدیک استفاده کرد روی یک وضعیت فعلی یکی از پرکاربردترین آنها زنجیر مارکوف است.

زنجیره های مارکوف به شما امکان می دهد تا عدم قطعیت رویدادهای آینده را تحت شرایط خاصی پیش بینی کنید. به همین دلیل، به طور گسترده در علوم، مهندسی، اقتصاد و بسیاری از زمینه های دیگر استفاده می شود.

با این حال، انواع مختلفی از زنجیره مارکوف وجود دارد و هر کدام کاربردهای خاص خود را دارند.

این راهنما به معرفی زنجیره‌های مارکوف، انواع مختلف زنجیره‌های مارکوف، از جمله زمان گسسته، زمان پیوسته، برگشت‌پذیر و نمونه کد مدل‌های مارکوف پنهان (HMM) می‌پردازد.

خواهیم دید:

  • مقایسه
  • زنجیره مارکوف به زبان انگلیسی ساده توضیح داده شده است
  • کاربردهای زنجیره مارکوف
  • انواع زنجیر مارکوف
  • نمونه کد پنهان زنجیر مارکوف

مقایسه

aa
انتخاب بین آفتابی یا بارانی

تصویربرداری که می خواهید هوای فردا را پیش بینی کنید و آن را فقط بستگی دارد روی هوای امروز هوا می تواند آفتابی یا بارانی باشد.

در اینجا احتمالات وجود دارد:

  • اگر امروز آفتابی باشد، به احتمال 80 درصد فردا دوباره آفتابی خواهد بود و 20 درصد احتمال دارد که باران باشد.
  • اگر امروز باران باشد، احتمال اینکه فردا آفتابی باشد 50 درصد و احتمال بارندگی 50 درصد وجود دارد.

در این سناریو می‌توان وضعیت‌های آینده آب و هوا را پیش‌بینی کرد روی حالات فعلی با استفاده از احتمالات

این ایده برای پیش‌بینی آینده صرفاً بر اساس احتمالات حال، زنجیره مارکوف نامیده می‌شود.

در اینجا، ایالت ها یا آفتابی یا بارانی هستند و احتمالات بر اساس احتمال تغییر آب و هوا را توصیف می کنند. روی وضعیت فعلی

زنجیره مارکوف به انگلیسی ساده توضیح داده شده است

bb
چگونه ایالت ها با هم مرتبط هستند

یک زنجیره مارکوف فرآیندهای تصادفی را توصیف می کند که در آن سیستم ها بین حالت ها حرکت می کنند و یک حالت جدید فقط به آن بستگی دارد روی وضعیت فعلی، نه روی چگونه به آنجا رسید

از نظر ریاضی، زنجیره‌های مارکوف مدل‌های تصادفی نامیده می‌شوند، زیرا آنها رویدادهای زندگی واقعی را مدل‌سازی (شبیه‌سازی) می‌کنند که طبیعتاً تصادفی هستند (تصادفی).

پیاده‌سازی زنجیره‌های مارکوف بسیار آسان است و در مدل‌سازی سیستم‌های پیچیده کارآمد هستند.

مزیت کلیدی دیگر ویژگی “بی حافظه” آنها است. این باعث می شود که آن را سریعتر اجرا کنید روی کامپیوترها و قدرتمند برای مطالعه فرآیندهای تصادفی و پیش بینی مبتنی بر روی شرایط فعلی

کاربردهای زنجیره مارکوف

سی سی
کاربردهای زنجیره مارکوف

در برخی سطوح، تقریباً تمام رویدادهای زندگی واقعی تصادفی هستند. به عبارت دیگر، آنها شامل تصادفی و عدم قطعیت هستند.

دقیقاً به همین دلیل است که آنها بسیار مورد استفاده قرار می گیرند. آنها می توانند رفتار سیستم های مبتنی بر را پیش بینی کنند روی شرایط فعلی

در امور مالی، از آنها برای تشخیص تغییرات در رتبه بندی اعتباری برای پیش بینی رژیم های بازار استفاده می شود.

در ژنتیک، آنها به درک چگونگی تغییر پروتئین ها در طول زمان کمک می کنند. که هنگام مطالعه تغییرات ژنتیکی مهم است.

در رباتیک، آنها با پیش‌بینی حرکت بعدی ربات، به تصمیم‌گیری کمک می‌کنند روی مشاهده فعلی

در آنجا، مثال‌های واقعی نشان می‌دهند که چگونه می‌توان از زنجیره‌های مارکوف برای حل مشکلات زندگی واقعی در زمینه‌های مختلف استفاده کرد.

انواع زنجیر مارکوف

DD
سیستم به هم پیوسته

زنجیر مارکوف انواع مختلفی دارد. در این بخش، ما تنها به مهم ترین انواع زنجیره های مارکوف می پردازیم.

زنجیره های مارکوف زمان گسسته (DTMC)

در DTMC ها، سیستم در مراحل زمانی خاص تغییر حالت می دهد. آنها گسسته نامیده می شوند زیرا انتقال حالت در بازه های زمانی مجزا و مجزا اتفاق می افتد.

آنها در تئوری صف (مطالعه رفتار خطوط انتظار)، ژنتیک و اقتصاد استفاده می شوند زیرا تجزیه و تحلیل آنها ساده است.

زنجیره های مارکوف زمان پیوسته (CTMC)

تفاوت CTMCها با DTMCها در این است که انتقال حالت می تواند در هر نقطه زمانی پیوسته رخ دهد، نه در فواصل زمانی ثابت.

پیشنهاد می‌کنیم بخوانید:  اعداد صحیح را به لیست در پایتون اضافه کنید

این باعث می شود آنها مدل های تصادفی باشند که در آن تغییرات حالت به طور مداوم اتفاق می افتد. این در واکنش های شیمیایی و مهندسی قابلیت اطمینان مهم است.

زنجیر مارکوف برگشت پذیر

زنجیر مارکوف برگشت پذیر خاص است. این process تغییر حالت یکسان است، چه جهت به جلو یا عقب باشد، مانند چرخاندن یک ویدیو به عقب و پخش مجدد آن.

این ویژگی تشخیص پایداری یک سیستم و مطالعه روش رفتار یک سیستم در طول زمان را آسان تر می کند. آنها به طور گسترده ای در فیزیک آماری و اقتصاد استفاده می شوند

زنجیرهای مارکوف تصادفی مضاعف

زنجیره های مارکوف تصادفی مضاعف توسط یک ماتریس احتمال انتقال تعریف می شوند. در ماتریس، مجموع احتمالات در هر سطر و هر ستون برابر با 1 است.

این بدان معنی است که هر سطر و هر ستون یک توزیع احتمال معتبر را نشان می دهد. به عبارت دیگر، هر سطر و ستون فهرستی از شانس ها را برای نتایج متفاوت نشان می دهد.

این ویژگی در محاسبات کوانتومی و مکانیک آماری بسیار مهم است.

به لطف زنجیره‌های مارکوف تصادفی دوگانه، سیستم‌ها به گونه‌ای تغییر می‌کنند که احتمالات و تقارن را حفظ می‌کند و مدل‌سازی و تحلیل سیستم‌های محاسباتی کوانتومی را بسیار دقیق‌تر می‌کند.

نمونه کد پنهان زنجیر مارکوف

قبل از اینکه به مثال‌های کد بپردازیم، ابتدا اجازه می‌دهیم تا بفهمیم زنجیره‌های مارکوف پنهان چیست.

زنجیره های مارکوف پنهان: مدل سازی حالت های نادیده

ee
کره های نور به هم پیوسته

ایده اصلی پشت زنجیره‌های مارکوف پنهان، مدل‌سازی سیستم‌هایی است که حالت‌های پنهانی دارند (حالتی که ارزش آنها را نمی‌دانیم) که فقط از طریق رویدادهای قابل مشاهده قابل کشف هستند.

به عبارت دیگر، زنجیره‌های مارکوف پنهان به ما اجازه می‌دهند تا رفتار یک سیستم را از طریق:

  • در نظر گرفتن احتمال انتقال از یک حالت به حالت دیگر.
  • دانستن احتمال مشاهده یک رویداد خاص از هر حالت

ما می توانیم این را با مشاهده چگونگی تغییر دولت ها از دیدگاه غیرمستقیم درک کنیم.

ما بسیاری از ارزش های اصلی ایالات را نمی دانیم.

اما با دانستن روش تغییر آنها، می‌توانیم پیش‌بینی کنیم که ارزش‌های آنها در آینده چه خواهد بود.

به این ترتیب، زنجیره‌های مارکوف پنهان در مدل‌سازی دنباله‌ها انعطاف‌پذیر هستند و هم انتقال بین حالت‌های پنهان و هم نتایج قابل مشاهده را ثبت می‌کنند.

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

مثال کد

در این مثال کد، یک مثال ساده با داده های مصنوعی را خواهیم دید.

اینم کد کامل:

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)
1
کد کامل

بیایید بلوک به بلوک کد را ببینیم!

کتابخانه ها را وارد کنید و دانه های تصادفی را تنظیم کنید

import numpy as np
from hmmlearn import hmm

np.random.seed(42)
2
کتابخانه ها را وارد کنید و دانه های تصادفی را تنظیم کنید

در این بلوک کد، دو مورد را وارد کردیم python کتابخانه ها:

  • 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")
3
پارامترهای HMM را تعریف کنید و یک HMM گاوسی ایجاد کنید

در این بلوک کد، یک 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]])
4
ماتریس انتقال، میانگین ها و کوواریانس ها را برای هر حالت تعریف کنید

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_)
5
داده ها، نمونه HMM جدید ایجاد کنید و مدل را با داده ها مطابقت دهید

در این کد یک مدل با 100 نمونه ایجاد کردیم، آن را 100 بار تکرار کردیم و ماتریس انتقال حالت جدید، میانگین ها و کوواریانس ها را چاپ کردیم.

به عبارت دیگر، ما 100 نمونه از مدل اصلی تولید کردیم، یک مدل جدید مارکوف مخفی (HMM) را در این نمونه ها قرار دادیم و سپس پارامترهای آموخته شده این مدل جدید را چاپ کردیم.

  • ایکس به معنی نمونه داده های مشاهده شده تولید شده توسط مدل اصلی است.
  • ز به معنی توالی حالت پنهان مربوط به نمونه های داده مشاهده شده تولید شده توسط مدل اصلی است.

ماتریس انتقال چاپ می شود:

[[0.8100804  0.1899196 ]
 [0.49398918 0.50601082]]

این بدان معناست که مدل تمایل دارد در حالت 0 بماند و در حالت 1 تقریباً شانس تغییر یا ماندن را دارد.

ابزار print بیرون:

[[0.01577373]
 [3.06245496]]

به این معنی که میانگین مقدار مشاهده شده تقریباً 0.016 در حالت 0 و 3.062 در حالت 1 است.

کوواریانس ها print بیرون:

[[[0.41987084]]
 [[0.53146802]]]

یعنی مقادیر مشاهده شده در حالت 0 حدود 0.420 و در حالت 1 0.531 تغییر می کند.

به این ترتیب، ما هرگز نمی‌توانیم دقیقاً ارزش‌های حالت‌ها را بدانیم، اما می‌دانیم:

  • چگونه آنها تمایل به تغییر با یکدیگر دارند
  • میانگین مقدار مشاهده شده آنها
  • چگونه آنها متفاوت هستند

پیش بینی حالت های پنهان برای داده های مشاهده شده

hidden_states = new_model.predict(X)

print("Hidden states:")
print(hidden_states)
6
پیش بینی حالت های پنهان برای داده های مشاهده شده

در این کد، بر اساس روی X نمونه های داده را مشاهده کرد، ما حالت های جدید مدل مارکوف را پیش بینی کردیم.

حالات پنهان print بیرون:

[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 جابجا می شوند و نشان می دهند که چگونه سیستم در طول زمان حالت ها را تغییر می دهد.

نتیجه گیری: آینده زنجیره مارکوف

ff
دنیای علم

زنجیره های مارکوف به دلیل توانایی آنها در پیش بینی آینده به طور گسترده در زمینه های STEM استفاده می شود روی حال حاضر

زنجیره های مارکوف بیشتر با هوش مصنوعی، بهبود اتوماسیون و تجزیه و تحلیل پیشگویانه سیستم ها ادغام شده اند.

علاوه بر این، توسعه زنجیره‌های مارکوف از نظر محاسباتی کارآمدتر یک اولویت بزرگ است و آنها را برای پردازش بلادرنگ و شبیه‌سازی‌های مقیاس بزرگ در دسترس‌تر می‌سازد.

به طور خلاصه، زنجیره های مارکوف به دلیل توانایی آنها در پیش بینی آینده، ابزار بسیار مهمی در علم هستند.

با هوش مصنوعی و کارایی محاسباتی بیشتر، زنجیره های مارکوف را می توان در بسیاری از زمینه های دیگر نیز به کار برد و بسیاری از مشکلات را حل کرد.