مدل مخلوط گاوسی یا GMM فرض میکند داده از ترکیبی از چند توزیع گاوسی به دست آمده است. برای هر مشاهده میتوان سهم نسبی مؤلفهها را محاسبه کرد؛ بنابراین لازم نیست از ابتدا فقط یک برچسب سخت به آن بدهیم. این سهم، با دانستن مدل و پارامترهایش معنا دارد و کشف هویت یا گروه واقعی افراد نیست.
وزن مؤلفه با سهم یک نمونه فرق دارد
وزن مخلوط میگوید در مدل چه سهمی به هر مؤلفه اختصاص داده شده است. اما مسئولیت یا responsibility یک مؤلفه برای نقطه مشخص، با چگالی همان نقطه در آن مؤلفه هم تغییر میکند. ممکن است دو مؤلفه وزن برابر داشته باشند ولی یک نقطه به یکی بسیار نزدیکتر باشد.
دو گاوسی با پارامترهای معلوم
برای تمرین، میانگینهای ۰ و۴، انحراف معیار هر دو برابر۱ و وزن هرکدام۰٫۵ است. این پارامترها را خودمان انتخاب کردهایم؛ هیچ برازش EM انجام ندادهایم. چگالی یک مؤلفه با میانگین μ و انحراف معیار σ برابر exp(−۰٫۵((x−μ)/σ)²) تقسیم بر σ√(۲π) است.
برای نقطه x=۱، مربع فاصلهها تا میانگینها ۱ و۹ است. چون σ و وزنها یکساناند، نسبت چگالی مؤلفه اول به دوم exp(۴) میشود. پس سهم مؤلفه اول حدود۰٫۹۸۲۰۱۴ و مؤلفه دوم حدود۰٫۰۱۷۹۸۶ خواهد بود. این یک نسبت تحت مدل فرضی است؛ عدد دقت طبقهبندی نیست.
| نقطه x | سهم مؤلفه میانگین۰ | سهم مؤلفه میانگین۴ |
|---|---|---|
| 1 | ۰٫۹۸۲۰۱۴ | ۰٫۰۱۷۹۸۶ |
| 2 | ۰٫۵ | ۰٫۵ |
| 3 | ۰٫۰۱۷۹۸۶ | ۰٫۹۸۲۰۱۴ |
برای x=۲، چگالیها برابرند. اگر وزن مخلوط را به۰٫۸ و۰٫۲ تغییر دهیم، سهمها در همین نقطه۰٫۸ و۰٫۲ میشوند. پس صرف نگاهکردن به نزدیکترین میانگین، همه بخش محاسبه GMM نیست.
کد سهمها بدون نصب کتابخانه
import math
means=[0.0,4.0]
sigmas=[1.0,1.0]
def responsibilities(x,weights=(0.5,0.5)):
logs=[math.log(weight)-math.log(sigma*math.sqrt(2*math.pi))
-0.5*((x-mu)/sigma)**2
for weight,mu,sigma in zip(weights,means,sigmas)]
top=max(logs)
values=[math.exp(z-top) for z in logs]
total=sum(values)
return [v/total for v in values]
for x in [1.0,2.0,3.0]:
print(x,[round(v,6) for v in responsibilities(x)])
print('changed prior at x=2',responsibilities(2.0,(0.8,0.2)))
assert abs(responsibilities(1)[0]-0.9820137900379085)<1e-12
assert responsibilities(2)==[0.5,0.5]
assert abs(responsibilities(2,(0.8,0.2))[0]-0.8)<1e-12
assert all(abs(sum(responsibilities(x))-1)<1e-12 for x in [1,2,3])کد لگاریتم وزن و چگالی را جمع و برای نرمالسازی بیشترین مقدار را کم میکند. تابع برای وزنها و انحراف معیارهای مثبت ثابت مثال نوشته شده است؛ اعتبارسنج عمومی پارامتر ورودی یا حلکننده برازش نیست. مجموع سهمها۱ میشود، ولی جمعشدن به۱، درستبودن فرضهای مدل را ثابت نمیکند.
برازش مدل کدام کار را اضافه میکند؟
وقتی میانگین، وزن و پراکندگی معلوم نیست، روشی مانند EM آنها را از داده برآورد میکند. تعداد مؤلفه، شروع و قاعده محدودکردن پراکندگی مهماند. این مرحله در فایل مثال اجرا نشده است؛ خروجی جدول را نتیجه آموزش مدل ننامید. داده کم در برابر پارامتر زیاد هم میتواند برآورد را ناپایدار کند.
در مثال K-means هر نقطه در هر تخصیص به یک مرکز میرفت. اینجا سهم نرم محاسبه کردیم. در Naive Bayes متن برچسبهای هدف آموزش وجود دارند؛ این مدل مخلوط، آن قرارداد نظارتشده را ندارد.
از سهم به تصمیم عجولانه نرسیم
در تمرین، x را از۱ به۲ حرکت دهید و تغییر سهمها را ببینید. اگر بعداً برچسب سخت لازم دارید، قاعده انتخاب و حالت تساوی را جدا مشخص کنید. نامگذاری مؤلفهها نیاز به بررسی نمونهها و هدف تحلیل دارد؛ «مؤلفه۱» بهتنهایی نام یک نیاز مشتری نیست.
برای پروژه پاسخگویی، ابتدا ورودی، خروجی و مرز ارجاع انسانی را در مسیر راهکارهای اپرا روشن کنید. این مثال نه گروهبندی واقعی مشتریان است و نه استفاده از GMM در محصول اپرا را تأیید میکند.
فایل تمرین و منابع
دریافت کد کامل این تمرین؛ این فایل فقط از کتابخانه استاندارد پایتون استفاده میکند. ورودیهای آن ساختگی و برای بازتولید محاسبهاند؛ اجرای آموزشی آن نتیجه یک محصول یا مشتری را نشان نمیدهد.
تاریخ بررسی منابع: ۳ نوامبر ۲۰۲۶. منابع، مرجع روشاند؛ دادهها، اعداد و کد مثال برای همین راهنما طراحی شدهاند.