نمونهگیری و تخمین چگالی با Gaussian Mixture
از آنجا که Gaussian Mixture یک مدل مولد است، پس از آموزش میتوان از آن نمونههای جدید تولید کرد. متد sample() هم ویژگی نمونههای تولیدشده و هم شمارهٔ خوشهٔ مولد آنها را برمیگرداند؛ در خروجی زیر نمونهها بر اساس شمارهٔ خوشه مرتب شدهاند:
>>> X_new, y_new = gm.sample(6)
>>> X_new
array([[-0.86944074, -0.32767626],
[ 0.29836051, 0.28297011],
[-2.80149270, -0.09047309],
[ 3.98203732, 1.49951491],
[ 3.81677148, 0.53095244],
[ 2.84104923, -0.73858639]])
>>> y_new
array([0, 0, 1, 2, 2, 2])
همچنین میتوان چگالی مدل را در هر نقطه تخمین زد. متد score_samples() برای هر نمونه لگاریتم تابع چگالی احتمال یا PDF در آن نقطه را برمیگرداند. هرچه Score بزرگتر باشد، چگالی بیشتر است:
>>> gm.score_samples(X).round(2)
array([-2.61, -3.57, -3.33, ..., -3.51, -4.4, -3.81])
اگر از این Scoreها نمایی بگیریم، مقدار PDF در محل نمونهها به دست میآید. این مقادیر احتمال نیستند، بلکه چگالی احتمال هستند و میتوانند هر مقدار مثبت داشته باشند، نه فقط عددی بین صفر و یک. برای بهدست آوردن احتمال افتادن نمونه در یک ناحیه باید PDF روی همان ناحیه انتگرالگیری شود؛ انتگرال روی کل فضای ممکن برابر ۱ است.
شکل ۹-۱۶ میانگین خوشهها، مرزهای تصمیم خطچین و کانتورهای چگالی مدل آموزشدیده را نشان میدهد.
شکل 9-16. میانگین خوشهها، مرز تصمیم و کانتورهای چگالی Gaussian Mixture
محدود کردن شکل کوواریانس در GMM
در مثال مصنوعی، EM جواب بسیار خوبی پیدا کرد، چون داده واقعاً از چند توزیع گاوسی دوبعدی تولید شده بود و تعداد صحیح خوشهها نیز به مدل داده شد. در دادهٔ واقعی، وقتی ابعاد زیاد، خوشهها فراوان یا تعداد نمونهها کم باشد، EM ممکن است برای رسیدن به جواب بهینه مشکل داشته باشد. یکی از راههای سادهتر کردن مسئله، کاهش تعداد پارامترهایی است که مدل باید یاد بگیرد؛ مثلاً محدود کردن شکل و جهت ماتریسهای کوواریانس با فراپارامتر covariance_type.
"spherical"
- همهٔ خوشهها باید کروی باشند، اما میتوانند قطر یا واریانس متفاوتی داشته باشند.
"diag"
- خوشهها میتوانند بیضوی و با اندازههای متفاوت باشند، اما محورهای بیضی باید با محورهای مختصات موازی باشند؛ یعنی ماتریسهای کوواریانس قطریاند.
"tied"
- همهٔ خوشهها شکل، اندازه و جهت یکسان دارند و یک ماتریس کوواریانس مشترک استفاده میکنند.
"full"
- مقدار پیشفرض است؛ هر خوشه ماتریس کوواریانس نامحدود خودش را دارد و میتواند شکل، اندازه و جهت مستقلی داشته باشد.
شکل ۹-۱۷ جواب EM را برای حالتهای tied و spherical مقایسه میکند.
شکل 9-17. Gaussian Mixture با کوواریانس tied و spherical
پیچیدگی آموزش GaussianMixture به تعداد نمونهها m، تعداد ابعاد n، تعداد خوشهها k و نوع محدودیت کوواریانس بستگی دارد. برای spherical یا diag، با فرض ساختار خوشهای داده، تقریباً O(kmn) است. برای tied یا full پیچیدگی حدود O(kmn² + kn³) است و در تعداد ویژگیهای بسیار زیاد مقیاسپذیر نیست.
تشخیص ناهنجاری با Gaussian Mixture
برای تشخیص ناهنجاری با GMM کافی است نمونههای نواحی با چگالی پایین را غیرعادی در نظر بگیریم. باید آستانهٔ چگالی انتخاب شود. برای نمونه در یک کارخانه، نسبت معمول محصول معیوب ممکن است تقریباً معلوم باشد. اگر انتظار داریم ۲٪ محصولات معیوب باشند، میتوان آستانه را طوری انتخاب کرد که ۲٪ نمونهها در نواحی با چگالی کمتر از آن قرار بگیرند.
اگر False Positive زیاد است ــ محصول سالم به اشتباه معیوب اعلام میشود ــ آستانه را پایینتر میآوریم. اگر False Negative زیاد باشد ــ محصول معیوب تشخیص داده نشود ــ آستانه را افزایش میدهیم. این همان موازنهٔ Precision/Recall است.
متن منبع این مثال را با «صدک چهارم پایینترین چگالی» و تقریباً ۴٪ ناهنجاری توضیح میدهد، در حالی که کد چاپشده از np.percentile(densities, 2) استفاده میکند. هر دو مقدار در این ترجمه همانگونه که در منبع آمدهاند حفظ شدهاند:
densities = gm.score_samples(X)
density_threshold = np.percentile(densities, 2)
anomalies = X[densities < density_threshold]
شکل ۹-۱۸ این نمونههای غیرعادی را با ستاره نمایش میدهد.
شکل 9-18. تشخیص ناهنجاری با Gaussian Mixture
تفاوت Anomaly Detection و Novelty Detection
Novelty Detection به تشخیص ناهنجاری نزدیک است، اما فرض مهمی دارد: مدل باید روی مجموعهای «پاک» و بدون Outlier آموزش ببیند. در Anomaly Detection چنین فرضی وجود ندارد و حتی یکی از کاربردهای آن پاکسازی مجموعهٔ داده از Outlierها است.
Gaussian Mixture تلاش میکند همهٔ داده، از جمله Outlierها، را Fit کند. اگر Outlier زیاد باشد، تصویر مدل از «حالت عادی» منحرف میشود و بعضی نمونههای واقعاً غیرعادی ممکن است عادی تلقی شوند. یک راه این است که مدل را یک بار Fit کنید، شدیدترین Outlierها را پیدا و حذف کنید و سپس روی دادهٔ پاکشده دوباره Fit کنید. راه دیگر استفاده از روشهای Robust Covariance Estimation مانند EllipticEnvelope است.
انتخاب تعداد خوشهها در Gaussian Mixture
مانند k-means، در GaussianMixture نیز باید تعداد خوشهها از پیش مشخص شود. اما Inertia و Silhouette Score برای GMM معیار مناسبی نیستند، زیرا خوشهها ممکن است کروی نباشند یا اندازههای متفاوت داشته باشند. در عوض میتوان مدلی را انتخاب کرد که یک معیار نظری اطلاعاتی مانند BIC یا AIC را کمینه کند.
معادله ۹-۱ — معیارهای BIC و AIC
BIC = log(m) · p − 2 log ℒ
AIC = 2p − 2 log ℒ
در این روابط:
- m تعداد نمونههاست.
- p تعداد پارامترهایی است که مدل یاد گرفته است.
- ℒ بیشینهٔ مقدار تابع Likelihood مدل است.
هر دو معیار مدلهای پرپارامتر، مثلاً با خوشههای بیشتر، را جریمه میکنند و در عین حال Fit بهتر داده را پاداش میدهند. اغلب هر دو یک مدل را انتخاب میکنند. اگر اختلاف داشته باشند، BIC معمولاً مدل سادهتری با پارامتر کمتر برمیگزیند، هرچند ممکن است Fit آن کمی ضعیفتر از مدل انتخابی AIC باشد، بهویژه در مجموعههای بزرگ.
Likelihood در برابر Probability
در زبان روزمره «Probability» و «Likelihood» گاهی بهجای هم استفاده میشوند، اما در آمار معنای متفاوت دارند. اگر مدل آماری پارامترهای θ داشته باشد، Probability میگوید با دانستن θ یک نتیجهٔ آیندهٔ x چقدر محتمل است. در مقابل، Likelihood بعد از مشاهدهٔ x میپرسد یک مقدار مشخص θ تا چه حد با مشاهدهٔ انجامشده سازگار و محتمل است.
مدل آزمایشی شکل ۹-۱۹ ترکیبی یکبعدی از دو توزیع گاوسی با مرکزهای −۴ و +۱ است. برای سادهسازی فقط یک پارامتر θ وجود دارد که انحراف معیار هر دو توزیع را کنترل میکند. نمودار کانتور بالا-چپ کل تابع پارامتری f(x;θ) را برحسب x و θ نشان میدهد.
اگر θ را مثلاً ۱٫۳ ثابت کنیم، تابع چگالی احتمال f(x;θ=1.3) در نمودار پایین-چپ به دست میآید. برای محاسبهٔ احتمال اینکه x بین −۲ و +۲ باشد باید PDF روی این بازه انتگرالگیری شود. اما اگر θ را ندانیم و در عوض یک مشاهدهٔ x=2.5 داشته باشیم، تابع Likelihood برابر ℒ(θ|x=2.5)=f(x=2.5;θ) خواهد بود که در نمودار بالا-راست دیده میشود.
شکل 9-19. تابع پارامتری مدل، PDF، Likelihood و Log-Likelihood
بهطور خلاصه، PDF تابعی از x با θ ثابت است؛ Likelihood تابعی از θ با x ثابت. تابع Likelihood توزیع احتمال نیست: انتگرال یک توزیع احتمال روی همهٔ مقادیر x همیشه ۱ است، اما انتگرال Likelihood روی همهٔ θ میتواند هر مقدار مثبت باشد.
MLE و MAP
برای یک مجموعهٔ دادهٔ X معمولاً میخواهیم محتملترین پارامترهای مدل را تخمین بزنیم؛ یعنی مقادیری که Likelihood را بیشینه میکنند. در مثال با مشاهدهٔ x=2.5، برآورد بیشینهٔ درستنمایی یا Maximum Likelihood Estimate (MLE) برای θ برابر ۱٫۵ است.
اگر از قبل توزیع احتمال g(θ) برای پارامتر داشته باشیم، میتوان بهجای بیشینهکردن فقط ℒ(θ|x)، حاصلضرب ℒ(θ|x)g(θ) را بیشینه کرد. این روش Maximum A-Posteriori یا MAP نام دارد. از آنجا که Prior روی مقادیر پارامتر قید وارد میکند، MAP را میتوان نوعی نسخهٔ Regularized از MLE دانست.
بیشینهکردن Likelihood معادل بیشینهکردن لگاریتم آن است، زیرا لگاریتم تابعی اکیداً صعودی است. در عمل Log-Likelihood معمولاً سادهتر است. اگر چند مشاهدهٔ مستقل x(1)...x(m) داشته باشیم، Likelihood کل حاصلضرب Likelihoodهای منفرد است، اما با لگاریتم این حاصلضرب به جمع تبدیل میشود:
log(ab) = log(a) + log(b)
پس از یافتن θ بهینه، مقدار ℒ(θ,X) برای محاسبهٔ AIC و BIC استفاده میشود و میتوان آن را معیاری از میزان برازش مدل به داده دانست.
>>> gm.bic(X)
8189.747000497186
>>> gm.aic(X)
8102.521720382148
در شکل ۹-۲۰ BIC و AIC برای تعدادهای مختلف خوشه رسم شدهاند. هر دو در k=3 کمینه میشوند، بنابراین سه خوشه محتملترین انتخاب مناسب است.
شکل 9-20. AIC و BIC برای تعدادهای مختلف خوشه
Bayesian Gaussian Mixture
بهجای جستوجوی دستی تعداد بهینهٔ خوشهها میتوان از BayesianGaussianMixture استفاده کرد. این مدل میتواند به خوشههای غیرضروری وزن صفر یا بسیار نزدیک صفر بدهد. کافی است n_components را روی عددی قرار دهید که با اطمینان معقول از تعداد واقعی خوشهها بیشتر است؛ الگوریتم خوشههای اضافه را خودکار حذف میکند.
>>> from sklearn.mixture import BayesianGaussianMixture
>>> bgm = BayesianGaussianMixture(
... n_components=10,
... n_init=10,
... random_state=42
... )
>>> bgm.fit(X)
>>> bgm.weights_.round(2)
array([0.4, 0.21, 0.4, 0., 0., 0., 0., 0., 0., 0.])
الگوریتم در این مثال خودکار تشخیص داده است که فقط سه خوشه لازم است و خوشههای حاصل تقریباً همان خوشههای شکل ۹-۱۶ هستند.
بااینحال GMM برای خوشههای بیضوی مناسب است و روی خوشههایی با شکل بسیار متفاوت عملکرد خوبی ندارد. وقتی Bayesian Gaussian Mixture روی دادهٔ Moons اجرا میشود، بهجای دو ماه، بهدنبال بیضیها میگردد و در مثال کتاب هشت خوشه پیدا میکند. تخمین چگالی هنوز بد نیست و شاید برای Anomaly Detection قابل استفاده باشد، اما ساختار واقعی دو ماه را شناسایی نمیکند.
شکل 9-21. برازش Gaussian Mixture به خوشههای غیربیضوی
روشهای دیگر Anomaly و Novelty Detection
- Fast-MCD؛ Minimum Covariance Determinant
- در Scikit-Learn توسط
EllipticEnvelope پیادهسازی شده و برای Outlier Detection، بهویژه پاکسازی داده، مفید است. فرض میکند Inlierها از یک توزیع گاوسی واحد، نه یک Mixture، تولید شدهاند و داده با Outlierهایی آلوده است که از آن توزیع نیامدهاند. هنگام برآورد شکل پوش بیضوی، نمونههایی که احتمال Outlier بودنشان بیشتر است نادیده گرفته میشوند تا کوواریانس مقاومتر و تشخیص Outlier بهتر شود.
- Isolation Forest
- برای Outlier Detection، بهخصوص در دادهٔ پُربعد، کارآمد است. جنگلی از درختهای تصادفی میسازد؛ در هر Node یک ویژگی و سپس یک آستانهٔ تصادفی بین کمینه و بیشینه انتخاب میشود و داده مرتب به دو بخش شکسته میشود تا نمونهها از یکدیگر جدا شوند. ناهنجاریها معمولاً از نمونههای عادی دورند، بنابراین بهطور متوسط با تعداد تقسیمهای کمتری ایزوله میشوند.
- Local Outlier Factor (LOF)
- چگالی پیرامون هر نمونه را با چگالی اطراف همسایههای آن مقایسه میکند. ناهنجاری معمولاً از k نزدیکترین همسایهٔ خود منزویتر و در ناحیهای با چگالی کمتر قرار دارد.
- One-Class SVM
- برای Novelty Detection مناسبتر است. SVM هستهای معمولی دو کلاس را با نگاشت ضمنی به فضای پُربعد و جداسازی خطی در آن فضا جدا میکند. One-Class SVM چون فقط یک کلاس عادی دارد، نمونهها را در فضای پُربعد از مبدأ جدا میکند. در فضای اصلی این فرایند به یافتن ناحیهای کوچک منجر میشود که نمونههای عادی را در بر میگیرد. نمونهٔ جدیدی که بیرون این ناحیه قرار گیرد ناهنجار است. علاوه بر فراپارامترهای عادی SVM هستهای، یک پارامتر Margin نیز احتمال اشتباه گرفتن نمونهٔ عادی با نمونهٔ جدید/غیرعادی را کنترل میکند. روی دادههای پُربعد خوب عمل میکند، اما مانند دیگر SVMها برای دادهٔ بسیار بزرگ مقیاسپذیری محدودی دارد.
- PCA و روشهای دارای
inverse_transform()
- خطای بازسازی یک نمونهٔ عادی معمولاً بسیار کمتر از خطای بازسازی ناهنجاری است. بنابراین مقایسهٔ Reconstruction Error راهی ساده و اغلب مؤثر برای تشخیص ناهنجاری است.
تمرینهای فصل ۹
- خوشهبندی را چگونه تعریف میکنید؟ چند الگوریتم خوشهبندی نام ببرید.
- چند کاربرد اصلی الگوریتمهای خوشهبندی چیست؟
- دو روش برای انتخاب تعداد مناسب خوشهها در k-means توضیح دهید.
- Label Propagation چیست؟ چرا و چگونه آن را پیادهسازی میکنید؟
- دو الگوریتم خوشهبندی که برای دادههای بزرگ مقیاسپذیرند و دو الگوریتمی که نواحی با چگالی بالا را جستوجو میکنند نام ببرید.
- یک کاربرد مفید برای Active Learning پیشنهاد کنید و توضیح دهید چگونه آن را پیادهسازی میکنید.
- تفاوت Anomaly Detection و Novelty Detection چیست؟
- Gaussian Mixture چیست و برای چه وظایفی میتوان از آن استفاده کرد؟
- دو روش برای پیدا کردن تعداد مناسب خوشهها در Gaussian Mixture نام ببرید.
- مجموعهٔ کلاسیک Olivetti Faces شامل ۴۰۰ تصویر خاکستری ۶۴×۶۴ پیکسل از چهره است. هر تصویر به بردار ۴۰۹۶بعدی تبدیل شده و از ۴۰ نفر، از هر نفر ۱۰ تصویر وجود دارد. داده را با
fetch_olivetti_faces() بارگذاری و به آموزش، Validation و آزمون تقسیم کنید. داده از قبل بین صفر و یک Scaling شده است. چون مجموعه کوچک است، برای داشتن تعداد برابر تصویر از هر فرد در هر بخش بهتر است Stratified Sampling انجام شود. سپس تصاویر را با k-means خوشهبندی کنید، تعداد مناسب خوشهها را با یکی از روشهای فصل پیدا و خوشهها را بصریسازی کنید. آیا در هر خوشه چهرههای مشابه میبینید؟
- در ادامهٔ تمرین Olivetti، طبقهبندی برای تشخیص فرد موجود در تصویر آموزش دهید و روی Validation ارزیابی کنید. سپس از k-means بهعنوان ابزار کاهش ابعاد استفاده و طبقهبند دیگری روی نمایش کاهشیافته آموزش دهید. تعداد خوشهها را برای بهترین عملکرد جستوجو کنید. بررسی کنید اگر ویژگیهای کاهشیافته را به ویژگیهای اصلی اضافه کنید، نتیجه چگونه تغییر میکند.
- روی Olivetti یک Gaussian Mixture آموزش دهید. برای سریعتر شدن، ابتدا میتوانید با PCA و حفظ ۹۹٪ واریانس ابعاد را کم کنید. با
sample() چهرههای جدید تولید و آنها را نمایش دهید؛ اگر PCA استفاده کردهاید برای برگشت به فضای تصویر از inverse_transform() بهره ببرید. سپس تعدادی تصویر را تغییر دهید، مثلاً بچرخانید، Flip کنید یا تیره کنید، و بررسی کنید آیا مدل با مقایسهٔ score_samples() تصاویر عادی و تغییریافته ناهنجاریها را تشخیص میدهد.
- از کاهش ابعاد برای Anomaly Detection استفاده کنید. Olivetti را با PCA و حفظ ۹۹٪ واریانس کاهش دهید و Reconstruction Error هر تصویر را محاسبه کنید. سپس خطای بازسازی تصاویر دستکاریشدهٔ تمرین قبل را بررسی کنید؛ باید بهطور محسوسی بیشتر باشد. تصویر بازسازیشده را نیز رسم کنید تا ببینید الگوریتم تلاش میکند نمونهٔ غیرعادی را شبیه یک چهرهٔ عادی بازسازی کند.
راهحل تمرینهای فصل در Notebook انتهای فصل منبع ارائه شده است: https://homl.info/colab3.