K-means یک روش خوشهبندی است: تعداد k مرکز را تعیین میکنیم، هر نقطه به نزدیکترین مرکز میرود و مرکز هر گروه با میانگین اعضای آن بهروز میشود. این دو مرحله تکرار میشوند. برچسب معنایی آمادهای به گروهها داده نمیشود؛ عدد گروه، موضوع یا ارزش مشتری را مشخص نمیکند.
خوشهبندی با طبقهبندی فرق دارد
در طبقهبندی، پاسخ هدف برای آموزش تعریف میشود؛ در این تمرین هیچ برچسب درست از پیش نداریم. اگر این مرز مبهم است، راهنمای یادگیری نظارتشده و بدون نظارت را بخوانید. اینجا هدف، محاسبه خود الگوریتم است و نه سنجش پایداری چند اجرای آن.
شش نقطه، دو مرکز آغازین
نقطههای یکبعدی ۰، ۱، ۲، ۸، ۹ و ۱۰ را در نظر بگیرید. k=۲ و مرکزهای آغازین ۰ و ۲ هستند. برای نقطه ۱ فاصله تا هر دو مرکز برابر است؛ در کد این راهنما، مرکز با شماره کوچکتر انتخاب میشود. با این قرارداد، گروه اول {۰،۱} و گروه دوم {۲،۸،۹،۱۰} میشود.
میانگین گروه اول ۰٫۵ و میانگین گروه دوم ۷٫۲۵ است. این مرکزها لزوماً یکی از نقطههای داده نیستند. اگر مرحله تخصیص را دوباره انجام دهیم، نقطه ۲ حالا به ۰٫۵ نزدیکتر است و گروهها {۰،۱،۲} و {۸،۹،۱۰} میشوند؛ میانگینها به ۱ و ۹ تغییر میکنند.
| دور | مرکزهای پس از بهروزرسانی | تعداد اعضا | مجموع مربع فاصله با مرکز گروه |
|---|---|---|---|
| 1 | ۰٫۵ و ۷٫۲۵ | ۲ و ۴ | ۳۹٫۲۵ |
| 2 | ۱ و ۹ | ۳ و ۳ | 4 |
| 3 | ۱ و ۹ | ۳ و ۳ | 4 |
در دور سوم، مرکزها ثابت میمانند. عدد ستون آخر، برای همین گروههای همان دور و مرکزهای تازه حساب شده است. مقدار نهایی ۴ از دو فاصله یکواحدی در هر گروه به دست میآید. این عدد نه درصد خطاست و نه آستانهای عمومی برای همه دادهها.
کد یکبعدی و قرارداد تساوی
points = [0.0, 1.0, 2.0, 8.0, 9.0, 10.0]
centers = [0.0, 2.0]
history = []
for step in range(10):
groups = [[] for _ in centers]
for x in points:
j = min(range(len(centers)), key=lambda j: (abs(x-centers[j]), j))
groups[j].append(x)
new = [sum(g)/len(g) if g else centers[j]
for j, g in enumerate(groups)]
inertia = sum((x-new[j])**2 for j, g in enumerate(groups) for x in g)
history.append((new[:], inertia, [len(g) for g in groups]))
print(step+1, new, inertia, [len(g) for g in groups])
if new == centers:
break
centers = new
assert history[0] == ([0.5, 7.25], 39.25, [2, 4])
assert centers == [1.0, 9.0] and history[-1][1] == 4.0کد در صورت خالیشدن یک گروه، مرکز قبلی آن را نگه میدارد؛ این قرارداد آموزشی ماست و نباید رفتار تمام کتابخانهها فرض شود. در داده این مثال گروه خالی نداریم. توقف با برابری دقیق مرکزها برای این اعداد کوچک کافی است؛ در کار عمومی باید تحمل عددی، سقف دور و سیاست گروه خالی مشخص باشند.
مرکزهای آغازین و مقیاس چه اثری دارند؟
یک تمرین این است که مرکزها را ۰ و ۱۰ بگذارید. در این داده، سریعتر به گروههای نهایی نمونه میرسید؛ اما این تجربه محدود نشان نمیدهد یک مقدار آغازین در همه دادهها بهتر است. روشهای آغاز متفاوت میتوانند جوابهای محلی متفاوت بدهند. اگر چند ویژگی با واحدهای متفاوت دارید، تعریف فاصله و مقیاس را هم ثبت کنید.
شماره گروه را بین دو اجرا مستقیم مقایسه نکنید: گروه ۰ میتواند همان اعضای گروه ۱ اجرای دیگر را داشته باشد. راهنمای مقایسه پایداری خوشهها با ARI مرحله بعد است؛ آن مقاله خوشههای آماده را مقایسه میکند، این متن خود مرکزها و تخصیص را میسازد.
از خوشه به اقدام چگونه برسیم؟
پیش از نامگذاری گروهها، نمونههایشان را انسانی بخوانید و سود آن تقسیم برای کار واقعی را بسنجید. کمشدن مجموع فاصله با زیادکردن k، بهتنهایی دلیل انتخاب گروههای بیشتر نیست. برای کشف دستههای درخواست مشتری، نمونههای مجاز و هدف استفاده را در بررسی نیاز با اپرا مطرح کنید؛ این تمرین، گروهبندی واقعی مشتریان یا نتیجه یک محصول نیست.
فایل تمرین و منابع
دریافت کد کامل این تمرین؛ این فایل فقط از کتابخانه استاندارد پایتون استفاده میکند. ورودیهای آن ساختگی و برای بازتولید محاسبهاند؛ اجرای آموزشی آن نتیجه یک محصول یا مشتری را نشان نمیدهد.
تاریخ بررسی منابع: ۳ نوامبر ۲۰۲۶. منابع، مرجع روشاند؛ دادهها، اعداد و کد مثال برای همین راهنما طراحی شدهاند.
ادامه مسیر یادگیری
PCA و فرافکنی روی محور — اگر پیش از خوشهبندی ابعاد را کم میکنید، ابتدا ببینید PCA چه اطلاعاتی را در نمایش تازه نگه میدارد.