۱. مقدمه
الگوریتم امید ریاضی–بیشینهسازی (Expectation–Maximization یا EM) چارچوبی تکرارشونده برای برآورد پارامترهای مدلهای احتمالی دارای متغیر پنهان است. در مدل آمیخته گوسی، شناسه مؤلفهای که هر نمونه از آن تولید شده مشاهده نمیشود؛ بنابراین EM در گام E احتمال تعلق هر نمونه به مؤلفهها را محاسبه میکند و در گام M وزن، میانگین و کوواریانس مؤلفهها را بهروزرسانی میکند.
هدف این فایل، ارائه یک پیادهسازی واقعی و قابل اجرا در Python، نمایش خروجیهای عددی و نموداری، و بررسی الگوریتم روی دو مجموعهداده معتبر است. ساختار فصل شامل معرفی ابزارها، آمادهسازی داده، اجرای گامبهگام، تحلیل خروجی و دو مطالعه موردی است.
- آمادهسازی و استانداردسازی دادهها
- انتخاب تعداد مؤلفهها با AIC و BIC
- اجرای GaussianMixture مبتنی بر EM
- استخراج مسئولیتها و برچسبهای نرم
- ارزیابی خوشهبندی و تحلیل علمی خروجیها
.
۲. ابزارها و کتابخانههای مورد استفاده
| کتابخانه | کاربرد |
| NumPy | محاسبات عددی و آرایهها |
| Pandas | خواندن و پردازش دادههای جدولی |
| Scikit-learn | استانداردسازی، PCA، GaussianMixture و معیارهای ارزیابی |
| Matplotlib | تولید نمودارهای واقعی خروجی |
| SciPy | تطبیق بهینه برچسب خوشهها با کلاسهای واقعی |
.
۳. آمادهسازی دادهها پیش از اجرای EM
مدلهای آمیخته گوسی به مقیاس ویژگیها حساساند. در این فایل، ویژگیها با StandardScaler به میانگین صفر و واریانس واحد منتقل میشوند. برای نمایش دوبعدی، PCA فقط پس از آموزش مدل و صرفاً برای ترسیم استفاده میشود؛ خوشهبندی روی فضای استانداردشده کامل انجام میگیرد.
- بررسی مقدارهای مفقود و نوع ستونها
- جداسازی متغیر هدف از ویژگیها
- استانداردسازی ویژگیهای عددی
- تنظیم random_state برای بازتولیدپذیری
- استفاده از reg_covar برای جلوگیری از تکینگی کوواریانس
.
۴. پیادهسازی الگوریتم EM در Python

۴.۱ منطق اجرای الگوریتم
در Gaussian Mixture، گام E مسئولیت γik را محاسبه میکند؛ یعنی احتمال پسین تعلق نمونه i به مؤلفه k. در گام M، پارامترها بر اساس همین وزنها بهروزرسانی میشوند. تکرار تا زمانی ادامه مییابد که تغییر کران پایین لگاریتم درستنمایی از آستانه تعیینشده کمتر شود.
۴.۲ کد آموزشی قابل اجرا
import numpy as np
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
X_scaled = StandardScaler().fit_transform(X)
model = GaussianMixture(
n_components=2,
covariance_type="full",
n_init=10,
max_iter=500,
reg_covar=1e-6,
random_state=42
)
model.fit(X_scaled)
labels = model.predict(X_scaled)
responsibilities = model.predict_proba(X_scaled)
print("Converged:", model.converged_)
print("Iterations:", model.n_iter_)
print("Weights:", model.weights_)
print("Lower bound:", model.lower_bound_)
۴.۳ خروجی واقعی روند همگرایی
برای مشاهده رفتار تکراری EM، یک داده دوبعدی مصنوعی با دو مؤلفه تولید و مدل با warm_start در چند مرحله اجرا شد. نمودار زیر افزایش کران پایین را در اجرای واقعی نشان میدهد.

.
۵. مطالعه موردی اول: خوشهبندی تصاویر ارقام دستنویس با الگوریتم EM
۵.۱ معرفی مسئله
تشخیص و تحلیل تصاویر دستنویس یکی از مسائل کلاسیک یادگیری ماشین و بینایی ماشین است. در این نوع مسائل، هر تصویر از مجموعهای از پیکسلها تشکیل شده و الگوی توزیع شدت پیکسلها میتواند ساختار پنهانی مربوط به شکل رقم را نشان دهد.
در این مطالعه موردی، هدف استفاده از الگوریتم EM و مدل آمیخته گوسی برای کشف گروههای پنهان تصاویر ارقام دستنویس است. برخلاف طبقهبندی نظارتشده، برچسب واقعی ارقام هنگام آموزش مدل در اختیار الگوریتم قرار نمیگیرد. مدل تنها بر اساس شباهت آماری تصاویر تلاش میکند نمونهها را در چند مؤلفه گوسی قرار دهد.
پس از اجرای مدل، برچسبهای واقعی فقط برای ارزیابی میزان تطابق خوشهها با ارقام صفر تا نه استفاده میشوند.

.
۵.۲ معرفی دیتاست Digits
دیتاست مورد استفاده، مجموعهداده Digits است که در کتابخانه Scikit-learn ارائه شده و نسخهای پردازششده از مجموعه ارقام دستنویس پایگاه UCI محسوب میشود.
مشخصات دیتاست:
| ویژگی | مقدار |
| تعداد نمونهها | 1797 تصویر |
| تعداد کلاس واقعی | 10 رقم از صفر تا نه |
| ابعاد هر تصویر | 8×8 پیکسل |
| تعداد ویژگیها | 64 ویژگی عددی |
| بازه شدت پیکسل | صفر تا 16 |
| نوع مسئله | خوشهبندی بدون نظارت |
هر سطر از داده شامل 64 مقدار عددی است که شدت پیکسلهای یک تصویر 8×8 را نمایش میدهد.
.
۵.۳ آمادهسازی دادهها
در این مطالعه، مراحل آمادهسازی به صورت زیر انجام میشوند:
- بارگذاری تصاویر و برچسبهای واقعی؛
- استانداردسازی 64 ویژگی پیکسلی؛
- کاهش ابعاد با PCA؛
- حفظ 30 مؤلفه اصلی برای آموزش مدل؛
- تعریف 10 مؤلفه گوسی، متناسب با وجود 10 رقم؛
- اجرای چندباره EM با مقداردهی اولیه متفاوت؛
- استخراج احتمال تعلق هر تصویر به مؤلفهها؛
- تطبیق شناسه خوشهها با ارقام واقعی فقط برای ارزیابی.
PCA در این مطالعه علاوه بر کاهش هزینه محاسباتی، همبستگی میان پیکسلها و نویز موجود در ابعاد کماهمیت را کاهش میدهد.
.
۵.۴ اجرای الگوریتم EM روی دیتاست Digits
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.mixture import GaussianMixture
from sklearn.metrics import confusion_matrix, accuracy_score, adjusted_rand_score, silhouette_score
from scipy.optimize import linear_sum_assignment
digits = load_digits()
X = digits.data
y_true = digits.target
print("Dataset Shape:", X.shape)
print("Number of Classes:", len(np.unique(y_true)))
X_scaled = StandardScaler().fit_transform(X)
X_pca = PCA(n_components=30, random_state=42).fit_transform(X_scaled)
gmm = GaussianMixture(
n_components=10,
covariance_type="diag",
n_init=30,
max_iter=500,
reg_covar=1e-6,
random_state=42
)
gmm.fit(X_pca)
labels = gmm.predict(X_pca)
responsibilities = gmm.predict_proba(X_pca)
cm = confusion_matrix(y_true, labels)
row_ind, col_ind = linear_sum_assignment(cm.max() - cm)
cluster_to_digit = {cluster: digit for digit, cluster in zip(row_ind, col_ind)}
mapped_labels = np.array([cluster_to_digit[label] for label in labels])
print("Converged:", gmm.converged_)
print("Number of Iterations:", gmm.n_iter_)
print("Final Lower Bound:", gmm.lower_bound_)
print("Mixture Weights:", gmm.weights_)
print("Mapped Accuracy:", accuracy_score(y_true, mapped_labels))
print("Adjusted Rand Index:", adjusted_rand_score(y_true, labels))
print("Silhouette Score:", silhouette_score(X_pca, labels))
۵.۵ خروجی واقعی اجرای کد
Dataset Shape:
(1797, 64)
Number of Classes:
10
Explained Variance:
0.8932
Converged:
True
Number of Iterations:
28
Final Lower Bound:
-38.9212
Mixture Weights:
[0.0934 0.0456 0.2122 0.0853 0.0903 0.0697 0.0985 0.0741 0.2030 0.0278]
Mapped Accuracy:
0.6277
Adjusted Rand Index:
0.4477
Silhouette Score:
0.1271
تعداد نمونه های هر خوشه:
[168, 82, 378, 153, 165, 126, 176, 131, 368, 50]
۵.۶ نمایش دوبعدی نتیجه خوشهبندی
برای نمایش نتیجه، دادههای 30بعدی به دو مؤلفه اصلی کاهش داده میشوند. این کاهش ابعاد فقط برای رسم نمودار است و مدل اصلی بر روی 30 مؤلفه آموزش دیده است.
pca_2d = PCA(n_components=2, random_state=42)
X_2d = pca_2d.fit_transform(X_scaled)
plt.figure(figsize=(10, 7))
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=labels, cmap="tab10", s=20, alpha=0.75)
plt.title("EM-GMM Clustering on Handwritten Digits")
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.grid()
plt.show()
۵.۷ نمایش نمونههای شاخص هر خوشه
با استفاده از مسئولیتها میتوان نمونهای را که بیشترین احتمال تعلق به هر خوشه دارد، بهعنوان نماینده آن خوشه نمایش داد.
fig, axes = plt.subplots(2, 5, figsize=(12, 5))
axes = axes.ravel()
for cluster_id in range(10):
index = np.argmax(responsibilities[:, cluster_id])
axes[cluster_id].imshow(digits.images[index], cmap="gray")
axes[cluster_id].set_title(f"Cluster {cluster_id}")
axes[cluster_id].axis("off")
plt.tight_layout()
plt.show()
۵.۸ تحلیل نتایج مطالعه اول
- مدل پس از 28 تکرار به همگرایی رسیده است. مجموع واریانس توضیحدادهشده توسط 30 مؤلفه PCA حدود 89 درصد است؛ بنابراین بخش بزرگی از اطلاعات اصلی تصاویر حفظ شده است.
- دقت تطبیقیافته تقریباً 0.628 نشان میدهد خوشههای آماری بهطور کامل با ده رقم واقعی منطبق نیستند. علت اصلی این موضوع آن است که ارقام دستنویس میتوانند شکلهای بسیار متفاوتی داشته باشند. برای مثال، رقم 1 یا 9 ممکن است در چند سبک نوشتاری متفاوت ظاهر شود و یک مؤلفه گوسی واحد نتواند تمام شکلهای آن را پوشش دهد.
- در مقابل، برخی خوشهها ممکن است نمونههایی از چند رقم ظاهراً مشابه را در خود جای دهند. شباهت میان ارقام 3 و 9 یا میان 1 و 7 نمونهای از این حالت است.
این مطالعه نشان میدهد که:
- مدل GMM قادر به شناسایی ساختارهای بصری پنهان است؛
- هر کلاس واقعی الزاماً با یک توزیع گوسی منفرد قابل نمایش نیست؛
- استفاده از بیش از یک مؤلفه برای هر رقم میتواند مدل دقیقتری ایجاد کند؛
- مسئولیتها اطلاعاتی درباره اطمینان مدل نسبت به هر تصویر فراهم میکنند.
.
۶. مطالعه موردی دوم: شناسایی رژیمهای اقتصادی با الگوریتم EM
۶.۱ معرفی مسئله
- اقتصاد کشورها در دورههای مختلف رفتار یکسانی ندارد. برخی دورهها با رشد تولید، سرمایهگذاری و مصرف همراهاند، در حالی که در برخی دورهها کاهش رشد، افزایش بیکاری یا تورم شدید مشاهده میشود.
- میتوان فرض کرد دادههای اقتصاد کلان از چند رژیم پنهان تولید شدهاند. برای مثال، یک رژیم میتواند نشاندهنده شرایط رشد نسبتاً مناسب و رژیم دیگر نشاندهنده رکود یا فشار تورمی باشد.
- در این مطالعه، الگوریتم EM و مدل آمیخته گوسی برای شناسایی این رژیمهای پنهان در دادههای فصلی اقتصاد آمریکا استفاده میشوند. برچسب رژیمها از قبل مشخص نیست و مدل تنها با استفاده از ویژگیهای اقتصادی آنها را استخراج میکند.

.
۶.۲ معرفی دیتاست Macrodata
دیتاست Macrodata یکی از مجموعهدادههای واقعی موجود در کتابخانه Statsmodels است. این مجموعه شامل اطلاعات فصلی اقتصاد آمریکا از سال 1959 تا 2009 است.
مشخصات دیتاست:
| ویژگی | مقدار |
| تعداد رکورد اولیه | 203 فصل |
| بازه زمانی | 1959 تا 2009 |
| تناوب داده | فصلی |
| تعداد متغیرهای اصلی | 14 متغیر |
| حوزه کاربرد | اقتصاد کلان |
| منبع نرمافزاری | Statsmodels |
متغیرهای مورد استفاده در مدل عبارتاند از:
- نرخ رشد سالانهشده تولید ناخالص داخلی واقعی؛
- نرخ رشد مصرف واقعی؛
- نرخ رشد سرمایهگذاری واقعی؛
- نرخ تورم؛
- نرخ بیکاری؛
- نرخ بهره واقعی.
.
۶.۳ آمادهسازی دادههای اقتصادی
مقادیر تولید، مصرف و سرمایهگذاری به صورت سطح زمانی ثبت شدهاند. برای تحلیل رژیمها، نرخ رشد فصلی سالانهشده آنها محاسبه میشود:

ضرب در 400 باعث میشود نرخ رشد فصلی به تقریب سالانه تبدیل شود.
مراحل آمادهسازی:
- بارگذاری دادههای اقتصاد کلان؛
- محاسبه نرخ رشد تولید، مصرف و سرمایهگذاری؛
- حذف اولین رکورد دارای مقدار تهی؛
- انتخاب شش شاخص اقتصادی؛
- استانداردسازی متغیرها؛
- مقایسه مدلهای دارای دو تا پنج رژیم؛
- انتخاب مدل با کمترین BIC.
۶.۴ اجرای الگوریتم EM روی Macrodata
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from sklearn.preprocessing import StandardScaler
from sklearn.mixture import GaussianMixture
from sklearn.metrics import silhouette_score
macro = sm.datasets.macrodata.load_pandas().data.copy()
print("Dataset Shape:", macro.shape)
macro["gdp_growth"] = macro["realgdp"].pct_change() * 400
macro["cons_growth"] = macro["realcons"].pct_change() * 400
macro["inv_growth"] = macro["realinv"].pct_change() * 400
features = ["gdp_growth", "cons_growth", "inv_growth", "infl", "unemp", "realint"]
data = macro.dropna().reset_index(drop=True)
X_scaled = StandardScaler().fit_transform(data[features])
bic_values, models = [], []
for k in range(2, 6):
model = GaussianMixture(
n_components=k, covariance_type="full", n_init=30,
max_iter=1000, reg_covar=1e-5, random_state=42
).fit(X_scaled)
models.append(model)
bic_values.append(model.bic(X_scaled))
best_model = models[np.argmin(bic_values)]
labels = best_model.predict(X_scaled)
probabilities = best_model.predict_proba(X_scaled)
data["regime"] = labels
for k, bic in zip(range(2, 6), bic_values):
print(k, round(bic, 2))
print("Selected Regimes:", best_model.n_components)
print("Converged:", best_model.converged_)
print("Iterations:", best_model.n_iter_)
print("Lower Bound:", best_model.lower_bound_)
print("Weights:", best_model.weights_)
print("Silhouette Score:", silhouette_score(X_scaled, labels))
۶.۵ خروجی واقعی انتخاب مدل
Dataset Shape:
(203, 14)
BIC Values:
2 2965.00
3 3031.50
4 3081.30
5 3163.60
Selected Regimes:
2
Converged:
True
Iterations:
23
Lower Bound:
-6.6168
Weights:
[0.3320 0.6680]
Silhouette Score:
0.2671
کمترین مقدار BIC مربوط به مدل دو مؤلفهای است. بنابراین در محدوده بررسیشده، دادههای اقتصادی با دو رژیم اصلی بهتر توضیح داده شدهاند.
۶.۶ پروفایل واقعی رژیمهای اقتصادی
regime_profile = data.groupby("regime")[features].mean().round(3)
print(regime_profile)
خروجی:
| رژیم | رشد GDP | رشد مصرف | رشد سرمایهگذاری | تورم | بیکاری | بهره واقعی |
| 0 | 1.942 | 2.500 | -1.527 | 6.370 | 7.187 | 1.062 |
| 1 | 3.645 | 3.747 | 5.970 | 2.947 | 5.322 | 1.465 |
تعداد فصلهای هر رژیم:
Regime 0: 61 فصل
Regime 1: 141 فصل
.
۶.۷ تفسیر رژیمها
رژیم صفر دارای ویژگیهای زیر است:
- رشد کمتر تولید ناخالص داخلی؛
- کاهش میانگین سرمایهگذاری؛
- تورم بالاتر؛
- نرخ بیکاری بیشتر؛
- مصرف با رشد محدودتر.
این رژیم را میتوان بهعنوان رژیم فشار اقتصادی، رکود یا تورم بالا تفسیر کرد.
رژیم یک دارای ویژگیهای زیر است:
- رشد بیشتر تولید؛
- رشد مثبت و بالاتر سرمایهگذاری؛
- بیکاری کمتر؛
- تورم پایینتر؛
- رشد مصرف بالاتر.
این رژیم را میتوان رژیم رشد و ثبات نسبی نامگذاری کرد.
نامگذاری رژیمها پس از اجرای الگوریتم انجام میشود و خود مدل تنها شناسههای صفر و یک تولید میکند.
.
۶.۸ بررسی فصلهای دارای کمترین رشد اقتصادی
data["period"] = data["year"].astype(int).astype(str) + "Q" + data["quarter"].astype(int).astype(str)
lowest_growth = data.nsmallest(10, "gdp_growth")[["period", "gdp_growth", "infl", "unemp", "regime"]]
print(lowest_growth)
بخشی از خروجی واقعی:
| دوره | رشد GDP | تورم | بیکاری | رژیم |
| 1980Q2 | -8.198 | 8.32 | 7.3 | 0 |
| 2009Q1 | -6.590 | 0.94 | 8.1 | 0 |
| 1982Q1 | -6.564 | 2.53 | 8.8 | 0 |
| 2008Q4 | -5.484 | -8.79 | 6.9 | 0 |
| 1960Q4 | -5.129 | 1.21 | 6.3 | 0 |
| 1981Q4 | -4.983 | 4.26 | 8.2 | 0 |
| 1975Q1 | -4.865 | 5.32 | 8.2 | 0 |
بیشتر فصلهای دارای شدیدترین افت تولید در رژیم صفر قرار گرفتهاند. این نتیجه نشان میدهد مدل بدون دریافت برچسب رکود، توانسته بخش زیادی از فصلهای نامطلوب اقتصادی را در یک مؤلفه مشترک قرار دهد.
۶.۹ نمایش رژیمها در طول زمان
plt.figure(figsize=(14, 6))
plt.scatter(np.arange(len(data)), data["gdp_growth"], c=data["regime"], cmap="coolwarm", s=35)
plt.axhline(0, linestyle="--")
plt.title("Economic Regimes Detected by EM-GMM")
plt.xlabel("Quarter Index")
plt.ylabel("Annualized GDP Growth")
plt.grid()
plt.show()
۶.۱۰ تحلیل نتایج مطالعه دوم
مدل دو مؤلفهای با 23 تکرار همگرا شده است. وزن مؤلفهها نشان میدهد تقریباً یکسوم فصلها در رژیم فشار اقتصادی و دوسوم آنها در رژیم رشد نسبی قرار گرفتهاند.
مزیت استفاده از EM در این کاربرد، محاسبه احتمال تعلق هر فصل به هر رژیم است. فصلهایی که احتمال نزدیک به 0.5 دارند، دورههای انتقالی یا نامطمئن محسوب میشوند.
این مطالعه نشان میدهد مدل آمیخته گوسی میتواند:
- دورههای اقتصادی با ویژگیهای متفاوت را شناسایی کند؛
- بدون برچسبگذاری قبلی، فصلهای کمرشد را جدا سازد؛
- احتمال انتقال میان رژیمها را به شکل نرم نمایش دهد؛
- برای تحلیل اکتشافی چرخههای اقتصادی مفید باشد.
با این حال، GMM وابستگی زمانی فصلها را مستقیماً مدل نمیکند. برای مدلسازی توالی و احتمال انتقال میان رژیمها، مدل مارکوف پنهان مناسبتر است.
.
۷. مطالعه موردی سوم: بخشبندی رفتار انتخاب وسیله سفر با الگوریتم EM
۷.۱ معرفی مسئله
- انتخاب وسیله حملونقل تحت تأثیر عواملی مانند زمان سفر، هزینه، درآمد خانوار و تعداد اعضای خانواده قرار دارد. همه مسافران رفتار یکسانی ندارند؛ برخی نسبت به زمان حساسترند، برخی هزینه کمتر را ترجیح میدهند و گروهی ممکن است به دلیل سطح درآمد، گزینه هوایی را انتخاب کنند.
- در این مطالعه، هدف استفاده از الگوریتم EM برای شناسایی گروههای پنهان مسافران بر اساس ویژگیهای اقتصادی و زمانی گزینههای سفر است.
- الگوریتم بدون استفاده از وسیله انتخابشده، افراد را بخشبندی میکند. سپس توزیع انتخاب واقعی وسیله در هر خوشه بررسی میشود تا معنی رفتاری گروهها مشخص شود.
.
۷.۲ معرفی دیتاست ModeChoice
- دیتاست ModeChoice در کتابخانه Statsmodels ارائه شده و شامل اطلاعات مربوط به انتخاب وسیله سفر میان چهار گزینه است.
هر فرد چهار سطر دارد که مشخصات گزینههای زیر را نشان میدهند:
- هواپیما؛
- قطار؛
- اتوبوس؛
- خودرو.
مشخصات اولیه:
| ویژگی | مقدار |
| تعداد سطرها | 840 |
| تعداد افراد | 210 |
| تعداد گزینه برای هر فرد | 4 |
| تعداد ستونهای اولیه | 9 |
| حوزه کاربرد | انتخاب وسیله حملونقل |
| نوع داده | هزینه، زمان و ویژگی خانوار |
متغیرهای اصلی:
- ttme: زمان دسترسی یا انتظار؛
- invc: هزینه سفر؛
- invt: زمان داخل وسیله؛
- gc: هزینه تعمیمیافته سفر؛
- hinc: درآمد خانوار؛
- psize: تعداد اعضای گروه سفر؛
- choice: انتخاب واقعی گزینه.
.
۷.۳ تبدیل داده از حالت طولی به حالت فردمحور
در ساختار اولیه، هر فرد چهار ردیف دارد. برای خوشهبندی افراد، دادهها به فرم عریض تبدیل میشوند؛ یعنی ویژگیهای هر چهار وسیله در یک ردیف قرار میگیرند.
نمونه ستونهای جدید:
- gc_m1: هزینه تعمیمیافته هواپیما؛
- gc_m2: هزینه تعمیمیافته قطار؛
- gc_m3: هزینه تعمیمیافته اتوبوس؛
- gc_m4: هزینه تعمیمیافته خودرو؛
- invt_m1 تا invt_m4: زمان داخل هر وسیله؛
- hinc: درآمد خانوار؛
- psize: اندازه گروه سفر.
وسیله انتخابشده در آموزش مدل استفاده نمیشود و فقط برای تحلیل خوشهها نگه داشته میشود.
.
۷.۴ اجرای الگوریتم EM روی داده انتخاب سفر
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from sklearn.preprocessing import StandardScaler
from sklearn.mixture import GaussianMixture
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score
mode_data = sm.datasets.modechoice.load_pandas().data.copy()
print("Original Shape:", mode_data.shape)
mode_attributes = ["ttme", "invc", "invt", "gc"]
wide = mode_data.pivot(index="individual", columns="mode", values=mode_attributes)
wide.columns = [f"{attribute}_m{int(mode)}" for attribute, mode in wide.columns]
personal = mode_data.groupby("individual")[["hinc", "psize"]].first()
actual_choice = mode_data[mode_data["choice"] == 1][["individual", "mode"]].set_index("individual")["mode"].astype(int)
dataset = wide.join(personal).join(actual_choice.rename("chosen_mode")).dropna()
print("Individual Dataset Shape:", dataset.shape)
feature_columns = [c for c in dataset.columns if c != "chosen_mode"]
X_scaled = StandardScaler().fit_transform(dataset[feature_columns])
bic_values, models = [], []
for k in range(2, 7):
model = GaussianMixture(
n_components=k, covariance_type="diag", n_init=30,
max_iter=1000, reg_covar=1e-5, random_state=42
).fit(X_scaled)
models.append(model)
bic_values.append(model.bic(X_scaled))
best_model = models[np.argmin(bic_values)]
labels = best_model.predict(X_scaled)
responsibilities = best_model.predict_proba(X_scaled)
dataset["cluster"] = labels
for k, bic in zip(range(2, 7), bic_values):
print(k, round(bic, 2))
print("Selected Clusters:", best_model.n_components)
print("Converged:", best_model.converged_)
print("Iterations:", best_model.n_iter_)
print("Lower Bound:", best_model.lower_bound_)
print("Weights:", best_model.weights_)
print("Silhouette Score:", silhouette_score(X_scaled, labels))
۷.۵ خروجی واقعی اجرای مدل
Original Shape:
(840, 9)
Individual Dataset Shape:
(210, 20)
BIC Values:
2 5237.70
3 4279.40
4 3299.60
5 2518.70
6 1962.60
Selected Clusters:
6
Converged:
True
Iterations:
11
Lower Bound:
-1.8593
Weights:
[0.1711 0.1238 0.1289 0.1905 0.2762 0.1095]
Silhouette Score:
0.1684
تعداد افراد هر خوشه:
| خوشه | تعداد افراد |
| 0 | 36 |
| 1 | 26 |
| 2 | 27 |
| 3 | 40 |
| 4 | 58 |
| 5 | 23 |
.
۷.۶ پروفایل خوشههای مسافران
profile_columns = ["hinc", "psize", "gc_m1", "gc_m2", "gc_m3", "gc_m4", "invt_m1", "invt_m2", "invt_m3", "invt_m4"]
cluster_profile = dataset.groupby("cluster")[profile_columns].mean().round(2)
print(cluster_profile)
خلاصه بخشی از خروجی واقعی:
| خوشه | درآمد | اندازه گروه | هزینه هواپیما | هزینه قطار | زمان هواپیما | زمان قطار |
| 0 | 37.19 | 2.47 | 129.56 | 203.53 | 168.50 | 876.44 |
| 1 | 33.38 | 2.50 | 71.62 | 80.46 | 105.35 | 335.54 |
| 2 | 40.59 | 2.63 | 100.81 | 159.93 | 143.70 | 664.81 |
| 3 | 27.58 | 1.00 | 71.15 | 64.55 | 102.20 | 347.42 |
| 4 | 33.14 | 1.00 | 128.09 | 160.05 | 159.79 | 815.74 |
| 5 | 40.30 | 1.87 | 88.39 | 75.65 | 88.61 | 361.04 |
۷.۷ بررسی انتخاب واقعی وسیله در هر خوشه
choice_distribution = pd.crosstab(dataset["cluster"], dataset["chosen_mode"], normalize="index").round(3)
print(choice_distribution)
خروجی واقعی:
| خوشه | هواپیما | قطار | اتوبوس | خودرو |
| 0 | 0.139 | 0.389 | 0.000 | 0.472 |
| 1 | 0.000 | 0.615 | 0.000 | 0.385 |
| 2 | 0.333 | 0.037 | 0.259 | 0.370 |
| 3 | 0.000 | 0.450 | 0.250 | 0.300 |
| 4 | 0.379 | 0.241 | 0.224 | 0.155 |
| 5 | 0.957 | 0.000 | 0.000 | 0.043 |
.
۷.۸ تفسیر رفتاری خوشهها
- خوشه صفر: مسافران گروهی با گرایش به خودرو و قطار.در این خوشه، اندازه متوسط گروه سفر بیشتر از دو نفر است. انتخابهای اصلی خودرو و قطار هستند. هزینه و زمان سفر برخی گزینههای عمومی برای این افراد نسبتاً زیاد است؛ در نتیجه استفاده از خودرو میتواند برای سفر گروهی مقرونبهصرفهتر باشد.
- خوشه یک: مسافران متمایل به قطار.بیش از 61 درصد افراد این خوشه قطار را انتخاب کردهاند. هزینههای سفر در این گروه نسبتاً پایینتر است و قطار سهم غالب دارد.
- خوشه دو: گروه دارای انتخاب متنوع.در این خوشه هیچ وسیلهای بهتنهایی غالب نیست. خودرو، هواپیما و اتوبوس سهم قابل توجهی دارند. این گروه از نظر درآمد و اندازه گروه سفر در سطح بالاتری قرار دارد.
- خوشه سه: مسافران انفرادی و حساس به هزینه.اندازه متوسط گروه سفر برابر یک است و درآمد نیز نسبت به برخی خوشهها کمتر است. قطار، خودرو و اتوبوس انتخابهای اصلی این گروهاند.
- خوشه چهار: بازار ترکیبی با سهم بیشتر هواپیما.افراد این خوشه عمدتاً بهتنهایی سفر میکنند. هواپیما بیشترین سهم را دارد، اما قطار و اتوبوس نیز بخش معناداری از انتخابها را تشکیل میدهند.
- خوشه پنج: مسافران هوایی.تقریباً 96 درصد افراد این خوشه هواپیما را انتخاب کردهاند. درآمد متوسط این گروه بالا است و زمان سفر هوایی نیز نسبت به بسیاری از خوشهها کمتر است. این خوشه را میتوان گروه «حساس به زمان و متمایل به پرواز» نامید.

.
۷.۹ نمایش دوبعدی خوشهها
pca = PCA(n_components=2, random_state=42)
X_2d = pca.fit_transform(X_scaled)
plt.figure(figsize=(10, 7))
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=labels, cmap="tab10", s=45)
plt.title("Passenger Segmentation with EM-GMM")
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.grid()
plt.show()
۷.۱۰ تحلیل نتایج مطالعه سوم
در دامنه بررسیشده، مقدار BIC با افزایش تعداد مؤلفهها تا شش کاهش یافته است. بنابراین مدل شش مؤلفهای برای تحلیل انتخاب شد. مدل پس از 11 تکرار همگرا شده است.
امتیاز Silhouette نسبتاً پایین است؛ زیرا رفتار مسافران مرزهای کاملاً جدا و قطعی ندارد. افراد ممکن است از نظر درآمد، زمان و هزینه شبیه باشند اما وسیله متفاوتی انتخاب کنند. چنین همپوشانیای برای دادههای رفتاری طبیعی است.
مزیت EM در این مسئله آن است که هر فرد صرفاً یک برچسب قطعی دریافت نمیکند، بلکه احتمال تعلق او به تمام بخشهای رفتاری محاسبه میشود. برای نمونه، یک فرد میتواند با احتمال 0.55 در گروه مسافران هوایی و با احتمال 0.40 در گروه انتخاب ترکیبی قرار گیرد.
این اطلاعات برای کاربردهایی مانند موارد زیر مفید است:
- طراحی بستههای قیمتگذاری حملونقل؛
- بخشبندی مشتریان شرکتهای مسافرتی؛
- تحلیل حساسیت نسبت به زمان و هزینه؛
- طراحی تبلیغات هدفمند؛
- پیشبینی تغییر وسیله سفر در اثر تغییر قیمت.
.
۸. مقایسه سه مطالعه موردی
| معیار | ارقام دستنویس | رژیمهای اقتصادی | انتخاب وسیله سفر |
| حوزه | بینایی ماشین | اقتصاد کلان | حملونقل |
| تعداد نمونه | 1797 | 202 فصل قابل استفاده | 210 فرد |
| تعداد ویژگی آموزشی | 30 مؤلفه PCA | 6 شاخص | 18 ویژگی |
| تعداد مؤلفه نهایی | 10 | 2 | 6 |
| نوع کوواریانس | قطری | کامل | قطری |
| هدف اصلی | کشف الگوهای تصویری | کشف رژیمهای پنهان | بخشبندی رفتاری |
| نقش برچسب واقعی | ارزیابی | وجود ندارد | تفسیر خوشهها |
| خروجی مهم | مسئولیت رقمها | احتمال هر رژیم | احتمال عضویت رفتاری |
سه مطالعه نشان میدهند EM تنها یک الگوریتم خوشهبندی عمومی نیست، بلکه چارچوبی برای مدلسازی متغیرهای پنهان در انواع مختلف داده است.

در مطالعه تصاویر، متغیر پنهان نشاندهنده الگوی تصویری غالب است. سپس در دادههای اقتصادی، متغیر پنهان رژیم اقتصاد را نشان میدهد. در دادههای سفر، متغیر پنهان بخش رفتاری مسافران است.
.
۹. نکات فنی مشترک مطالعات موردی
۹.۱ مقداردهی اولیه
الگوریتم EM ممکن است به بیشینههای محلی متفاوت همگرا شود. به همین دلیل در هر سه مطالعه از n_init با مقدار بالا استفاده شده است. مدل چند بار از نقاط شروع متفاوت اجرا شده و بهترین نتیجه نگه داشته میشود.
۹.۲ منظمسازی کوواریانس
پارامتر reg_covar مقدار کوچکی به قطر ماتریس کوواریانس اضافه میکند. این کار از تکینشدن ماتریس و ناپایداری محاسبات جلوگیری میکند.
۹.۳ انتخاب ساختار کوواریانس
در دادههای با ابعاد زیاد مانند تصاویر، کوواریانس قطری انتخاب مناسبتری است؛ زیرا تعداد پارامترها را کاهش میدهد. در مطالعه اقتصاد کلان، تعداد ویژگیها کم است و استفاده از کوواریانس کامل امکان مدلسازی ارتباط میان شاخصها را فراهم میکند.
۹.۴ انتخاب تعداد مؤلفهها
- تعداد مؤلفهها باید با ترکیبی از معیارهای آماری و منطق مسئله تعیین شود.
- در مطالعه ارقام، وجود ده نماد شناختهشده مبنای انتخاب ده مؤلفه بود. در مطالعه اقتصادی و حملونقل، BIC برای مقایسه مدلها استفاده شد.
۹.۵ تفسیر مسئولیتها
- خروجی predict_proba ماتریسی با ابعاد تعداد نمونهها در تعداد مؤلفهها تولید میکند. مجموع مقادیر هر سطر برابر یک است.
- این احتمالها امکان شناسایی نمونههای مرزی و نامطمئن را فراهم میکنند و یکی از مزایای مهم EM نسبت به خوشهبندی سخت هستند.
.
۱۰. محدودیتهای مطالعات
- مؤلفههای گوسی الزاماً معادل کلاسهای واقعی نیستند.
- فرض شکل گوسی ممکن است برای برخی دادهها مناسب نباشد.
- مدل GMM به دادههای پرت حساس است.
- مقدار BIC همواره تفسیر علمی صحیح را تضمین نمیکند.
- PCA میتواند بخشی از اطلاعات را حذف کند.
- همگرایی مدل به معنی رسیدن به بیشینه سراسری نیست.
- در دادههای زمانی، GMM ترتیب زمانی را مستقیماً در نظر نمیگیرد.
- در دادههای رفتاری، خوشهها ممکن است همپوشانی زیادی داشته باشند.
.
۱۱. جمعبندی و نتیجهگیری
در این بخش، الگوریتم EM و مدل آمیخته گوسی روی سه مجموعهداده واقعی و معتبر بررسی شدند.
- در مطالعه نخست، تصاویر ارقام دستنویس بدون استفاده از برچسبها خوشهبندی شدند. نتایج نشان دادند مدل قادر به کشف بخشی از ساختار تصویری ارقام است، هرچند یک مؤلفه گوسی برای نمایش تمام سبکهای نوشتاری هر رقم کافی نیست.
- در مطالعه دوم، دادههای اقتصاد کلان به دو رژیم اصلی تقسیم شدند. رژیم نخست با رشد کمتر، بیکاری و تورم بیشتر و سرمایهگذاری ضعیفتر همراه بود. رژیم دوم شرایط رشد و ثبات نسبی را نمایش داد.
- در مطالعه سوم، مسافران بر اساس زمان، هزینه، درآمد و ویژگیهای گزینههای حملونقل به شش گروه رفتاری تقسیم شدند. بررسی انتخاب واقعی وسیله نشان داد برخی خوشهها گرایش روشن به هواپیما، قطار یا خودرو دارند.
این نتایج نشان میدهند الگوریتم EM برای مسائل گوناگونی مانند تحلیل تصویر، اقتصاد، رفتار مشتری و حملونقل قابل استفاده است. مهمترین مزیت آن، مدلسازی احتمالی و ارائه درجه عدم قطعیت برای هر انتساب است. مهمترین محدودیت نیز حساسیت به تعداد مؤلفهها، مقداردهی اولیه و فرض توزیع گوسی است.



