بازگشت به دوره

آموزش رایگان صفر تا صد یادگیری ماشین (Machine Learning) به زبان ساده

0% تکمیل‌شده
0/0 مرحله

خوشه‌بندی سلسله‌مراتبی یکی از روش‌های محبوب در یادگیری ماشین بدون نظارت است که برای دسته‌بندی داده‌ها استفاده می‌شود.

خوشه‌بندی سلسله‌مراتبی

📌 فهرست مطالب

  1. خوشه‌بندی سلسله‌مراتبی چیست؟
  2. نحوه کار خوشه‌بندی سلسله‌مراتبی
  3. الگوریتم Agglomerative Clustering
  4. مثال عملی با Matplotlib و SciPy
  5. خوشه‌بندی سلسله‌مراتبی با Scikit-Learn
  6. نتیجه‌گیری

🧐 خوشه‌بندی سلسله‌مراتبی چیست؟

خوشه‌بندی سلسله‌مراتبی (Hierarchical Clustering) یک روش بدون نظارت (Unsupervised Learning) برای دسته‌بندی داده‌ها است. در این روش، الگوریتم بر اساس میزان تفاوت بین داده‌ها، خوشه‌هایی ایجاد می‌کند.

🔹 بدون نیاز به آموزش: نیازی به متغیر هدف (Target) نداریم و مدل به‌طور خودکار داده‌ها را گروه‌بندی می‌کند.
🔹 مناسب برای مصورسازی: می‌توان رابطه بین داده‌ها را به‌سادگی تحلیل و تفسیر کرد.

کاربردها:

  • گروه‌بندی مشتریان بر اساس رفتار خرید
  • تحلیل ساختار ژنتیکی داده‌ها
  • تقسیم‌بندی تصاویر در پردازش تصویر

⚙️ نحوه کار خوشه‌بندی سلسله‌مراتبی

در این مقاله، از الگوریتم Agglomerative Clustering استفاده می‌کنیم که یک روش پایین به بالا (Bottom-Up) است.

🔹 در ابتدا، هر نقطه یک خوشه مجزا است.
🔹 سپس، دو خوشه‌ای که کمترین فاصله را دارند، به هم متصل می‌شوند.
🔹 این روند ادامه پیدا می‌کند تا همه نقاط در یک خوشه بزرگ قرار بگیرند.

برای این کار، باید دو فاکتور مهم را مشخص کنیم:

  1. روش محاسبه فاصله: ما از فاصله اُقلیدسی (Euclidean Distance) استفاده می‌کنیم.
  2. روش اتصال خوشه‌ها: از روش Ward استفاده می‌کنیم که واریانس بین خوشه‌ها را کمینه می‌کند.

🔗 الگوریتم Agglomerative Clustering

در این الگوریتم:

  1. ابتدا هر داده یک خوشه جداگانه است.
  2. نزدیک‌ترین خوشه‌ها را ترکیب می‌کنیم.
  3. این کار را ادامه می‌دهیم تا همه داده‌ها در یک خوشه قرار بگیرند.

💡 در واقع، نتیجه این فرآیند را می‌توان به‌صورت یک “درخت سلسله‌مراتبی” یا “دندوگرام” (Dendrogram) نمایش داد که ساختار خوشه‌ها را نشان می‌دهد.

📊 مثال عملی: خوشه‌بندی سلسله‌مراتبی با Matplotlib و SciPy

🔹 گام 1: رسم داده‌ها

ابتدا تعدادی نقطه تصادفی را رسم می‌کنیم:

import numpy as np
import matplotlib.pyplot as plt

x = [4, 5, 10, 4, 3, 11, 14, 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]

plt.scatter(x, y)
plt.show()

🔹 نتیجه: نقاط داده روی یک نمودار پراکندگی نمایش داده می‌شوند.


🔹 گام 2: محاسبه دندوگرام با SciPy

اکنون از SciPy برای محاسبه و رسم دندوگرام استفاده می‌کنیم:

import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

data = list(zip(x, y))

linkage_data = linkage(data, method='ward', metric='euclidean')
dendrogram(linkage_data)

plt.show()

🔹 نتیجه: دندوگرام نشان می‌دهد که داده‌ها چگونه در مراحل مختلف به هم متصل شده‌اند.


🧑‍💻 مثال عملی: خوشه‌بندی سلسله‌مراتبی با Scikit-Learn

اکنون همان روش را با scikit-learn پیاده‌سازی می‌کنیم:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering

data = list(zip(x, y))

hierarchical_cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
labels = hierarchical_cluster.fit_predict(data)

plt.scatter(x, y, c=labels)
plt.show()

🔹 نتیجه: نقاط داده در دو گروه مختلف رنگ‌آمیزی می‌شوند که نشان‌دهنده‌ی دو خوشه مجزا هستند.


🎯 تحلیل کد و مفاهیم کلیدی

ماژول‌های موردنیاز

import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.cluster import AgglomerativeClustering

توضیحات:

🔹 NumPy: برای کار با آرایه‌ها
🔹 Matplotlib: برای مصورسازی
🔹 SciPy: برای رسم دندوگرام
🔹 Scikit-Learn: برای اجرای خوشه‌بندی

ایجاد داده‌های نمونه

x = [4, 5, 10, 4, 3, 11, 14, 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
data = list(zip(x, y))

🔹 نقاط داده را به‌صورت جفت‌های (x, y) تعریف کردیم.

اجرای الگوریتم با Ward Linkage

linkage_data = linkage(data, method='ward', metric='euclidean')

🔹 از Ward Linkage و فاصله اقلیدسی برای خوشه‌بندی استفاده شد.

مصورسازی خوشه‌ها

plt.scatter(x, y, c=labels)
plt.show()

🔹 نقاط براساس خوشه‌هایشان رنگ‌آمیزی می‌شوند.


📌 نتیجه‌گیری

خوشه‌بندی سلسله‌مراتبی یک روش قدرتمند برای گروه‌بندی داده‌ها است.
دندوگرام کمک می‌کند تا تعداد بهینه خوشه‌ها را انتخاب کنیم.
استفاده از Ward Linkage و Euclidean Distance باعث خوشه‌بندی دقیق‌تر می‌شود.
با Scikit-Learn می‌توان خوشه‌بندی را روی داده‌های بزرگ‌تر نیز اجرا کرد.

💡 سوال برای شما:
اگر بخواهید تعداد خوشه‌ها را ۳ انتخاب کنید، چه تغییری در کد باید ایجاد کنید؟ 🤔

پاسخ‌تان را در کامنت بنویسید! ⬇️