FA-TOOLS — Header Component

آموزش k-means clustering با پایتون

سلام رفیق برنامه‌نویس! خوشه‌بندی K-Means رو با پایتون یاد بگیر

آموزش k-means clustering با پایتون — تصویر 1

این روزا اگه توی دنیای داده با K-Means کار نکنی، انگار یه چیزی کمه! خوشه‌بندی K-Means یکی از اون الگوریتم‌هاییه که همه‌جا کاربرد داره، از بخش‌بندی مشتری‌ها گرفته تا تشخیص الگو توی داده‌های پیچیده. توی این راهنمای جامع، قدم به قدم یاد می‌گیریم چطور این الگوریتم رو با پایتون پیاده‌سازی کنیم. اگر دنبال ابزارای کاربردی و اسنیپت‌های خفن پایتون هستی که کارت رو راه بندازه، حتماً یه سر به فروشگاه ابزارهای برنامه‌نویسی بزن، کلی چیزای باحال اونجا پیدا می‌کنی که می‌تونه سرعتت رو چند برابر کنه!

با این آموزش، فقط کد نمی‌زنی، بلکه درک عمیقی از K-Means پیدا می‌کنی که کمک می‌کنه توی پروژه‌هات بهترین تصمیم‌ها رو بگیری. پس آماده‌ای؟ بزن بریم!

نیاز به کمک فوری داری؟ باهامون در تماس باش:

📞 تماس بگیرید: ۰۹۲۰۲۲۳۲۷۸۹

💡 نقشه راه یادگیری K-Means با پایتون در یک نگاه

آموزش k-means clustering با پایتون — تصویر 2

✨ 1. مفهوم K-Means

آشنایی با چیستی، کاربردها و نحوه کار الگوریتم.

🛠️ 2. آماده‌سازی پایتون

نصب کتابخانه‌های NumPy, Pandas, Matplotlib, Scikit-learn.

💻 3. پیاده‌سازی کد

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

🔍 4. انتخاب بهترین K

آشنایی با روش آرنج (Elbow Method) و امتیاز Silhouette.

⚠️ 5. نکات و ترفندها

بهینه‌سازی، مقیاس‌بندی داده‌ها و مواجهه با مشکلات رایج.

✅ 6. عیب‌یابی (Troubleshooting)

پاسخ به سوالات متداول و راه حل‌های عملی.

K-Means Clustering چیست؟

آموزش k-means clustering با پایتون — تصویر 3

K-Means یه الگوریتم یادگیری ماشین بدون نظارت (Unsupervised Learning) هستش. یعنی چی؟ یعنی بر خلاف الگوریتم‌های با نظارت که برای آموزش به داده‌های لیبل‌دار نیاز دارن، K-Means با داده‌های بدون لیبل کار می‌کنه و وظیفه‌اش اینه که نقاط داده مشابه رو پیدا کنه و اون‌ها رو توی گروه‌هایی به اسم “خوشه” (Cluster) قرار بده.

فکر کن یه عالمه عکس داری و می‌خوای عکس‌هایی که شبیه همن رو بذاری کنار هم، بدون اینکه از قبل بدونی هر عکس مال چه دسته‌ایه. K-Means دقیقاً همین کارو برات می‌کنه! این الگوریتم سعی می‌کنه هر نقطه داده رو به نزدیک‌ترین مرکز خوشه (Centroid) اختصاص بده و بعدش مراکز خوشه‌ها رو جابجا کنه تا بهترین گروه‌بندی ممکن رو پیدا کنه.

K-Means چطور کار می‌کنه؟ یه توضیح ساده

مراحل اصلی کار K-Means خیلی ساده‌ست:

  1. انتخاب K: اول از همه، باید مشخص کنیم که می‌خوایم داده‌هامون به چند تا خوشه (K) تقسیم بشن. این K رو خودمون باید انتخاب کنیم.
  2. انتخاب تصادفی Centroidها: به تعداد K، یه سری نقطه تصادفی رو به عنوان “مرکز خوشه‌ها” یا Centroid توی فضای داده انتخاب می‌کنیم.
  3. تخصیص نقاط: هر نقطه داده به نزدیک‌ترین Centroid خودش اختصاص پیدا می‌کنه. یعنی اگه یه نقطه به Centroid شماره ۱ نزدیک‌تر باشه، جزو خوشه ۱ می‌شه.
  4. به‌روزرسانی Centroidها: بعد از اینکه همه نقاط به خوشه‌ها اختصاص پیدا کردن، Centroid هر خوشه به میانگین (مرکز ثقل) تمام نقاطی که توی اون خوشه هستن، جابجا می‌شه.
  5. تکرار: مراحل ۳ و ۴ اینقدر تکرار می‌شن تا Centroidها دیگه جابجا نشن یا تغییراتشون خیلی ناچیز بشه. این یعنی الگوریتم به همگرایی (Convergence) رسیده.

نکته: هدف K-Means اینه که مجموع فاصله مربعات نقاط از Centroid خودشون رو به حداقل برسونه. به این معیار “Within-Cluster Sum of Squares” (WCSS) یا اینرسی (Inertia) می‌گن.

آماده‌سازی محیط پایتون برای K-Means

برای شروع کار با K-Means توی پایتون، به چند تا کتابخونه اصلی نیاز داریم. اگه اینا رو نصب نداری، با دستور `pip` می‌تونی راحت نصبشون کنی:

  • NumPy: برای کار با آرایه‌های عددی.
  • Pandas: برای مدیریت و تحلیل داده‌ها (اگه از فایل CSV یا دیتافریم استفاده کنی).
  • Matplotlib و Seaborn: برای بصری‌سازی و نمودار کشیدن.
  • Scikit-learn: کتابخونه اصلی برای الگوریتم K-Means و ابزارهای مرتبط با یادگیری ماشین.

pip install numpy pandas matplotlib seaborn scikit-learn

حالا که ابزارای لازم رو داریم، بریم سراغ بخش جذاب ماجرا: کدنویسی!

پیاده‌سازی K-Means Clustering با پایتون (قدم به قدم)

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

قدم ۱: وارد کردن کتابخانه‌ها

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


import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs # برای تولید داده‌های نمونه
from sklearn.cluster import KMeans
import warnings

# برای نادیده گرفتن هشدارهای مربوط به نسخه sklearn
warnings.filterwarnings("ignore")

قدم ۲: تولید داده‌های نمونه

ما برای آموزش از تابع `make_blobs` اسکیت‌لرن استفاده می‌کنیم که داده‌ها رو توی چند تا “حباب” یا خوشه مشخص برامون تولید می‌کنه. اینطوری راحت‌تر می‌تونیم ببینیم الگوریتم چقدر خوب کار کرده.


# تولید داده‌های ساختگی با 3 خوشه مشخص
X, y_true = make_blobs(n_samples=300, centers=3,
                       cluster_std=0.60, random_state=0)

# نمایش داده‌های تولید شده
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], s=50, alpha=0.8, color='#3498DB')
plt.title('داده‌های تولید شده برای خوشه‌بندی')
plt.xlabel('ویژگی 1')
plt.ylabel('ویژگی 2')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()

بعد از اجرای این کد، یه نمودار با سه گروه داده‌ای از هم جدا می‌بینید. حالا می‌خوایم K-Means این گروه‌ها رو پیدا کنه.

قدم ۳: آموزش مدل K-Means

حالا نوبت به استفاده از کلاس `KMeans` از کتابخونه `sklearn.cluster` می‌رسه. پارامتر `n_clusters` همون K ماست که اینجا 3 انتخاب کردیم (چون می‌دونیم 3 تا خوشه داریم). `init=’k-means++’` یه روش هوشمندانه‌تر برای انتخاب اولیه Centroidهاست که معمولاً بهتر از انتخاب کاملاً تصادفی عمل می‌کنه. `random_state` هم برای اینه که هر بار که کد رو اجرا می‌کنیم، نتایج یکسان باشن.


# مقدار K را مشخص می‌کنیم
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=42)

# مدل را روی داده‌ها آموزش می‌دهیم
kmeans.fit(X)

# لیبل‌های خوشه‌ها را پیش‌بینی می‌کنیم
y_kmeans = kmeans.predict(X)

# مراکز خوشه‌ها را استخراج می‌کنیم
centers = kmeans.cluster_centers_

print("مراکز خوشه‌ها:")
print(centers)
print("nتعداد تکرارها برای همگرایی:", kmeans.n_iter_)

نکته مهم: پارامتر `n_init` در نسخه‌های جدید Scikit-learn جایگزین `n_init` شده و به K-Means می‌گه که چند بار الگوریتم رو با Centroidهای اولیه متفاوت اجرا کنه و بهترین نتیجه (کمترین WCSS) رو انتخاب کنه. این کار باعث می‌شه الگوریتم بهینه تر عمل کنه و از گیر کردن تو بهینه‌های محلی جلوگیری می‌کنه.

بعد از اجرای این بخش، `y_kmeans` حاوی لیبل خوشه‌های هر نقطه داده‌ست و `centers` هم مختصات Centroidهای نهایی رو بهت می‌ده.

قدم ۴: بصری‌سازی نتایج

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


plt.figure(figsize=(10, 7))
colors = ['#E74C3C', '#2ECC71', '#9B59B6', '#F1C40F', '#3498DB'] # رنگ‌های مختلف برای خوشه‌ها

for i in range(3): # n_clusters ما 3 بود
    plt.scatter(X[y_kmeans == i, 0], X[y_kmeans == i, 1], s=80,
                c=colors[i], label=f'خوشه {i+1}', alpha=0.7)

plt.scatter(centers[:, 0], centers[:, 1], s=300, c='black', marker='X',
            label='مراکز خوشه‌ها (Centroids)', edgecolor='white', linewidth=1.5)

plt.title('نتایج خوشه‌بندی K-Means')
plt.xlabel('ویژگی 1')
plt.ylabel('ویژگی 2')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()

همونطور که می‌بینی، K-Means تونسته داده‌ها رو به خوبی به سه گروه تقسیم کنه و مراکز هر گروه رو هم پیدا کنه. قشنگ نیست؟

چطور بهترین مقدار K را پیدا کنیم؟

یکی از چالش‌های اصلی K-Means، انتخاب تعداد بهینه خوشه‌ها (K) هست. اگه K رو خیلی کم یا خیلی زیاد انتخاب کنی، نتایج خوبی نمی‌گیری. دو تا روش خیلی پرکاربرد برای این کار داریم:

۱. روش آرنج (Elbow Method)

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

چرا؟ چون با افزایش K، WCSS همیشه کمتر می‌شه (چون نقاط به Centroidهای بیشتری نزدیک می‌شن). اما یه جایی، کاهش WCSS دیگه خیلی محسوس نیست. اون نقطه خمیدگی همون جاییه که اضافه‌کردن خوشه‌های بیشتر، سود زیادی برای کاهش WCSS نداره و ممکنه فقط باعث Overfitting بشه.


wcss = []
for i in range(1, 11): # K را از 1 تا 10 امتحان می‌کنیم
    kmeans_elbow = KMeans(n_clusters=i, init='k-means++', n_init=10, random_state=42)
    kmeans_elbow.fit(X)
    wcss.append(kmeans_elbow.inertia_) # inertia همون WCSS است

plt.figure(figsize=(9, 6))
plt.plot(range(1, 11), wcss, marker='o', linestyle='--', color='#2980B9')
plt.title('روش آرنج برای تعیین K بهینه')
plt.xlabel('تعداد خوشه‌ها (K)')
plt.ylabel('WCSS / Inertia')
plt.grid(True, linestyle='--', alpha=0.6)
plt.xticks(range(1, 11))
plt.show()

توی نمودار بالا، باید دنبال نقطه‌ای باشی که خمیدگی واضحی داره. مثلاً اگه نمودار توی K=3 یه شیب زیاد داشته باشه و بعدش صاف‌تر بشه، یعنی K=3 مناسبه.

۲. امتیاز Silhouette (Silhouette Score)

امتیاز Silhouette یه معیار دیگه برای ارزیابی کیفیت خوشه‌بندیه. این امتیاز هم کیفیت چسبندگی نقاط داخل یه خوشه رو اندازه می‌گیره (یعنی چقدر به هم نزدیکن) و هم میزان جدایی خوشه‌ها از هم رو. امتیاز Silhouette بین -1 و +1 متغیر هستش:

  • +1: یعنی نقاط داخل خوشه‌شون خیلی خوب گروه‌بندی شدن و از خوشه‌های دیگه هم خیلی فاصله دارن. (ایده‌آل)
  • 0: یعنی نقاط روی مرز خوشه‌ها قرار دارن و ممکنه بین دو خوشه باشن.
  • -1: یعنی نقاط به خوشه اشتباهی اختصاص داده شدن. (خیلی بد)

با این روش، برای هر K، امتیاز Silhouette رو محاسبه می‌کنیم و K‌ای که بالاترین امتیاز رو داره انتخاب می‌کنیم.


from sklearn.metrics import silhouette_score

silhouette_scores = []
for i in range(2, 11): # K را از 2 تا 10 امتحان می‌کنیم (برای Silhouette K=1 معنی ندارد)
    kmeans_silhouette = KMeans(n_clusters=i, init='k-means++', n_init=10, random_state=42)
    kmeans_silhouette.fit(X)
    score = silhouette_score(X, kmeans_silhouette.labels_)
    silhouette_scores.append(score)

plt.figure(figsize=(9, 6))
plt.plot(range(2, 11), silhouette_scores, marker='o', linestyle='--', color='#2ECC71')
plt.title('امتیاز Silhouette برای تعیین K بهینه')
plt.xlabel('تعداد خوشه‌ها (K)')
plt.ylabel('امتیاز Silhouette')
plt.grid(True, linestyle='--', alpha=0.6)
plt.xticks(range(2, 11))
plt.show()

# پیدا کردن K با بالاترین امتیاز Silhouette
best_k_silhouette = range(2, 11)[np.argmax(silhouette_scores)]
print(f"بهترین K بر اساس امتیاز Silhouette: {best_k_silhouette}")

بالاترین نقطه در این نمودار، بهترین K رو بهت نشون می‌ده.

کاربردهای واقعی K-Means Clustering

K-Means فقط برای خوشه‌بندی داده‌های ساختگی نیست! این الگوریتم توی دنیای واقعی کاربردهای زیادی داره:

  • بخش‌بندی مشتریان (Customer Segmentation): شرکت‌ها از K-Means استفاده می‌کنن تا مشتریانشون رو بر اساس رفتار خرید، دموگرافیک یا علایق به گروه‌های مختلف تقسیم کنن. اینطوری می‌تونن کمپین‌های بازاریابی هدفمندتری داشته باشن.
  • تشخیص ناهنجاری (Anomaly Detection): پیدا کردن داده‌های پرت یا غیرعادی که با بقیه نقاط توی یه خوشه جور نیستن. مثلاً توی تشخیص تقلب در تراکنش‌های بانکی.
  • فشرده‌سازی تصویر (Image Compression): کاهش تعداد رنگ‌های یه تصویر با خوشه‌بندی پیکسل‌ها و جایگزینی رنگ‌های هر خوشه با Centroid اون خوشه.
  • بخش‌بندی سند (Document Clustering): گروه‌بندی اسناد مشابه بر اساس محتواشون.
  • سیستم‌های توصیه‌گر (Recommendation Systems): پیدا کردن کاربران یا آیتم‌های مشابه برای پیشنهاد محصولات یا محتوا.

شاید برات جالب باشه: کلی اسنیپت پایتون کاربرد‌ی برای کارهای مختلف آماده کردیم که می‌تونی توی پروژه‌هات استفاده کنی!

مزایا و معایب K-Means Clustering

مثل هر الگوریتم دیگه‌ای، K-Means هم نقاط قوت و ضعف خودش رو داره که باید بشناسیشون:

✅ مزایا ❌ معایب
پیاده‌سازی ساده و فهم آسان. نیاز به تعیین K از قبل (که اغلب چالش‌برانگیز است).
عملکرد سریع در مقیاس‌های بزرگ داده (کارایی بالا). حساسیت به انتخاب اولیه Centroidها (با `k-means++` بهتر می‌شود).
نتایج قابل تفسیر و توضیح‌پذیر. حساسیت بالا به نقاط پرت (Outliers).
مناسب برای خوشه‌های با شکل کروی و اندازه مشابه. عملکرد ضعیف روی خوشه‌های با اشکال پیچیده (مثلاً نواری).
در دسترس بودن در کتابخانه‌های محبوب مثل Scikit-learn. داده‌ها باید مقیاس‌بندی شده باشند تا فاصله Euclidean درست محاسبه شود.

عیب‌یابی سریع (Troubleshooting) در K-Means

شاید توی پیاده‌سازی K-Means با یه سری مشکلات رایج مواجه بشی. نگران نباش، اینا چند تا از اونا و راه‌حل‌هاشون هستن:

مشکل ۱: نتایج خوشه‌بندی هر بار متفاوت است.

دلیل: انتخاب اولیه Centroidها به صورت تصادفی انجام می‌شود. هر بار که الگوریتم اجرا شود، ممکن است Centroidهای اولیه متفاوتی انتخاب شوند و این باعث شود بهینه‌های محلی متفاوتی پیدا شوند.

راه‌حل:

  • از پارامتر `random_state` در `KMeans` استفاده کن. این کار باعث می‌شه انتخاب تصادفی اولیه Centroidها هر بار یکسان باشه و نتایج تکرارپذیر بشن.
  • پارامتر `n_init` رو به یه عدد بزرگتر (مثلاً 10 یا 20) تنظیم کن. این باعث می‌شه الگوریتم چند بار با Centroidهای اولیه متفاوت اجرا بشه و بهترین نتیجه رو انتخاب کنه.
  • از `init=’k-means++’` استفاده کن (که پیش‌فرض هستش). این روش هوشمندانه‌تر Centroidهای اولیه رو انتخاب می‌کنه و معمولاً نتایج بهتری می‌ده.

مشکل ۲: خوشه‌ها شکل‌های عجیبی دارند یا با هم قاطی شده‌اند.

دلیل: K-Means بهترین عملکرد رو روی خوشه‌های کروی شکل و با اندازه تقریباً یکسان داره. اگه خوشه‌های شما اشکال پیچیده‌ای دارن (مثلاً خطی، هلالی) یا اندازه‌هایشون خیلی متفاوته، K-Means خوب عمل نمی‌کنه.

راه‌حل:

  • بررسی و پیش‌پردازش داده‌ها: داده‌هات رو بصری‌سازی کن تا شکل احتمالی خوشه‌ها رو ببینی.
  • استفاده از الگوریتم‌های دیگر: اگه K-Means جواب نمی‌ده، الگوریتم‌های خوشه‌بندی دیگه‌ای مثل DBSCAN (برای خوشه‌های با چگالی متفاوت) یا Gaussian Mixture Models (برای خوشه‌های بیضوی) رو امتحان کن.
  • مهندسی ویژگی (Feature Engineering): گاهی اوقات ایجاد ویژگی‌های جدید می‌تونه به K-Means کمک کنه تا الگوهای پنهان رو بهتر پیدا کنه.

مشکل ۳: تاثیر زیاد ویژگی‌ها با مقیاس متفاوت.

دلیل: K-Means از فاصله اقلیدسی (Euclidean Distance) برای محاسبه شباهت استفاده می‌کنه. اگه ویژگی‌هات مقیاس‌های (range) خیلی متفاوتی داشته باشن (مثلاً یکی از 0 تا 1000 باشه و اون یکی از 0 تا 1)، ویژگی با مقیاس بزرگتر تاثیر نامتناسبی روی محاسبه فاصله و در نتیجه خوشه‌بندی خواهد داشت.

راه‌حل:

  • مقیاس‌بندی داده‌ها (Feature Scaling): قبل از اجرای K-Means، حتماً داده‌هات رو مقیاس‌بندی کن. `StandardScaler` (تبدیل به میانگین 0 و انحراف معیار 1) یا `MinMaxScaler` (تبدیل به بازه 0 تا 1) از `sklearn.preprocessing` گزینه‌های خوبی هستن.

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # X داده‌های اصلی شماست
# حالا kmeans را روی X_scaled آموزش دهید
    

مشکل ۴: انتخاب K بهینه دشوار است.

دلیل: روش آرنج همیشه یه خمیدگی واضح نشون نمی‌ده و امتیاز Silhouette هم ممکنه برای داده‌های خاصی خیلی خوب عمل نکنه.

راه‌حل:

  • ترکیب روش‌ها: هر دو روش آرنج و Silhouette Score رو با هم استفاده کن و ببین کجا همپوشانی دارن.
  • دانش دامنه (Domain Knowledge): اگه از قبل اطلاعاتی در مورد داده‌هات داری (مثلاً می‌دونی که مشتریان باید به ۳ یا ۴ گروه تقسیم بشن)، از اون اطلاعات برای راهنمایی در انتخاب K استفاده کن.
  • تفسیر پذیری: چند مقدار K رو امتحان کن و ببین نتایج کدوم یکی از لحاظ تجاری یا منطقی قابل تفسیرتر هستن.

حرف آخر و مسیرهای آینده

خسته نباشی رفیق! تا اینجا یاد گرفتیم که K-Means Clustering چیه، چطور با پایتون پیاده‌سازیش کنیم، و مهمتر از همه، چطور بهترین K رو انتخاب کنیم. این الگوریتم، با وجود سادگی، یه ابزار بسیار قدرتمند توی جعبه ابزار هر متخصص داده و برنامه‌نویس ماشین لرنینگه.

حالا که اصول رو بلدی، می‌تونی بری سراغ داده‌های واقعی، اونا رو پیش‌پردازش کنی (مثلاً حذف مقادیر گمشده یا مقیاس‌بندی ویژگی‌ها)، K-Means رو روشون اجرا کنی و نتایجش رو تحلیل کنی. یادت باشه، تمرین و کار با داده‌های مختلف، بهترین راه برای عمیق‌تر کردن یادگیریته.

برای اینکه همیشه کدات رو تمیز و بهینه نگه داری و از جدیدترین ابزارای برنامه‌نویسی باخبر باشی، یه سر به بخش اسنیپت‌های ما بزن. اونجا کلی اسنیپت CSS، اسنیپت JS و اسنیپت HTML آماده داریم که می‌تونه خیلی به کارت بیاد. حتی اگه با وردپرس کار می‌کنی، اسنیپت‌های وردپرس رو هم از دست نده!

اگه سوالی داشتی یا خواستی تجربه‌هات رو با ما به اشتراک بذاری، حتماً کامنت بذار یا باهامون در تماس باش. کدنویسی خوش بگذره!

Table of Contents

آخرین نوشته‌ها