📘 پروژه DPC-MK
عنوان پروژه: پیادهسازی و آزمایش الگوریتم DPC-MK
نام دانشجو: فرخنده خوشنود
ایمیل: F.khoshnoud24@gmail.com
مقطع: دانشجوی مجازی هوش مصنوعی، دانشگاه فردوسی مشهد
🧩 مقدمه
در دنیای امروز، تحلیل دادههای پیچیده و بدون برچسب یکی از چالشهای اصلی در علم داده و یادگیری ماشین است. بسیاری از دادهها ساختار غیرمرکزی دارند و روشهای ساده خوشهبندی قادر به جداسازی دقیق آنها نیستند.
الگوریتم DPC-MK (Density Peak Clustering with Modified Kernels) با استفاده از چگالی نقاط و فاصله تا نقاط با چگالی بالاتر، خوشهها را به شکلی دقیق شناسایی میکند. در این پروژه پیادهسازی این الگوریتم انجام شده و عملکرد آن بر روی دادههای نمونه بررسی و به صورت تصویری نمایش داده شده است.
📘 پیشزمینه: الگوریتم DPC
ایده اصلی DPC این است که مراکز خوشه، نقاطی با چگالی زیاد و فاصله زیاد از نقاط پرتراکمتر هستند.
برای هر نقطه دو کمیت محاسبه میشود:
- ρ: چگالی محلی
- δ: فاصله تا نزدیکترین نقطه با چگالی بیشتر
مراکز خوشه در نواحی با ρ و δ بالا قرار دارند.
✅ مزایا
- بدون نیاز به تعیین تعداد خوشهها
- تشخیص شکلهای پیچیده
- اجرای سریع و بدون تکرار زیاد
⚠️ معایب
- انتخاب دستی مراکز خوشه
- عملکرد ضعیف در دادههای با چگالی نامتوازن
منابع: Frontiers, AIMS Press
📈 خلاصه DPC-MK
DPC-MK نسخهی توسعهیافتهی DPC است و برای دادههای با چگالی متغیر طراحی شده است.
ویژگیهای کلیدی
- استفاده از KNN یا KNN متقابل برای چگالی دقیقتر
- انتخاب مراکز با ترکیب چگالی و همسایگی
- تخصیص چندمرحلهای و وزندار نقاط مرزی
نتایج
- تشخیص بهتر خوشههای غیرخطی
- کاهش خطا در دادههای مرزی
⚙️ کتابخانهها و نصب
| کتابخانه | توضیح | دستور نصب |
|---|---|---|
| numpy | عملیات عددی و آرایهها | pip install numpy |
| matplotlib | رسم نمودارها | pip install matplotlib |
| scipy | محاسبات علمی و فاصلهها | pip install scipy |
دستور نصب سریع همه با هم:
pip install numpy matplotlib scipy
🧠 کد اصلی پروژه (demo.py)
این کد از الگوریتم DPC-MK برای خوشهبندی دادهها استفاده کرده و نتایج را با matplotlib نمایش میدهد.
🧩 بخش ۱: وارد کردن کتابخانهها (Imports)
این بخش ماژولهای لازم برای اجرای الگوریتم، بصریسازی و تولید دادههای آزمایشی را وارد میکند.
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons, make_blobs
from dpc_mk import dpc_mk
| خط کد | توضیح |
|---|---|
import matplotlib.pyplot as plt |
کتابخانه matplotlib را برای رسم نمودارها وارد میکند و نام مستعار plt به آن میدهد. |
from sklearn.datasets import make_moons, make_blobs |
توابعی از scikit-learn برای تولید دادههای مصنوعی (دادههای هلالی و تودهای) جهت آزمایش استفاده میشوند. |
from dpc_mk import dpc_mk |
تابع اصلی خوشهبندی DPC-MK را از ماژول محلی dpc_mk وارد میکند. |
🎨 بخش ۲: تعریف تابع plot_clusters
این تابع مسئول نمایش نتایج خوشهبندی است.
def plot_clusters(X, labels, centers_idx=None, title="DPC-MK"):
plt.figure(figsize=(6,5))
plt.scatter(X[:,0], X[:,1], c=labels, s=25, cmap='tab10')
if centers_idx is not None and len(centers_idx) > 0:
plt.scatter(X[centers_idx,0], X[centers_idx,1],
s=150, facecolors='none', edgecolors='k', linewidths=2)
plt.title(title)
plt.tight_layout()
plt.show()
| خط کد | توضیح |
|---|---|
def plot_clusters(...) |
تعریف تابع با چهار پارامتر ورودی: دادهها، برچسبها، مراکز خوشه و عنوان نمودار. |
plt.figure(figsize=(6,5)) |
یک پنجرهی نمودار جدید با اندازهی ۶×۵ اینچ ایجاد میکند. |
plt.scatter(X[:,0], X[:,1], c=labels, ...) |
نقاط داده را رسم میکند؛ هر خوشه با رنگ متفاوت نمایش داده میشود. |
if centers_idx is not None and len(centers_idx) > 0: |
بررسی میکند که آیا مراکز خوشه مشخص شدهاند. |
plt.scatter(X[centers_idx,0], X[centers_idx,1], ...) |
مراکز خوشه را با دایرههای بزرگتر، توخالی و حاشیه مشکی نمایش میدهد. |
plt.title(title) |
عنوان نمودار را تنظیم میکند. |
plt.tight_layout() |
فاصله بین اجزای نمودار را بهصورت خودکار تنظیم میکند. |
plt.show() |
نمودار نهایی را نمایش میدهد. |
⚙️ بخش ۳: بدنهی اصلی اجرای کد (Main Execution Block)
این بخش دادههای آزمایشی را تولید کرده، الگوریتم DPC-MK را اجرا و نتایج را نمایش میدهد.
if __name__ == "__main__":
X1, _ = make_moons(n_samples=300, noise=0.08, random_state=0)
res1 = dpc_mk(X1, percent_dc=2.0, k_list=(5,10,15), mutual=True)
plot_clusters(X1, res1["labels"], res1["centers_idx"], title="moons - DPC-MK")
X2, _ = make_blobs(n_samples=400, centers=4, cluster_std=0.6, random_state=1)
res2 = dpc_mk(X2, percent_dc=2.0, k_list=(5,10,20), mutual=True)
plot_clusters(X2, res2["labels"], res2["centers_idx"], title="blobs - DPC-MK")
| خط کد | توضیح |
|---|---|
if __name__ == "__main__": |
اطمینان حاصل میکند که این کد تنها در صورت اجرای مستقیم فایل اجرا شود. |
X1, _ = make_moons(...) |
دادههای هلالی شکل (Moons) را برای آزمایش تولید میکند. |
res1 = dpc_mk(X1, ...) |
اجرای الگوریتم DPC-MK بر روی دادههای هلالی. |
plot_clusters(X1, ...) |
نمایش نتایج خوشهبندی دادههای هلالی. |
X2, _ = make_blobs(...) |
تولید دادههای تودهای (Blobs) با ۴ خوشهی مجزا. |
res2 = dpc_mk(X2, ...) |
اجرای الگوریتم DPC-MK بر روی دادههای تودهای. |
plot_clusters(X2, ...) |
نمایش نتایج خوشهبندی دادههای تودهای. |
🧩 ماژول اصلی (dpc_mk.py)
این فایل شامل توابع زیر است:
compute_rho→ محاسبه چگالی محلیcompute_delta→ محاسبه فاصله δbuild_mk_score→ ساخت ماتریس وزن Multi-Kassign_labels_with_mk→ تخصیص برچسبهاdpc_mk→ اجرای کامل الگوریتم
📷 خروجیهای نمونه
| تصویر | توضیح |
|---|---|
![]() |
|
![]() |
🧮 کاربردها
- زیستدادهها (Bioinformatics)
- بینایی ماشین (Computer Vision)
- تحلیل بازار و دادههای پیچیده (Marketing Data Analysis)
🏁 نتیجهگیری
الگوریتم DPC-MK قادر است خوشههای غیرمرکزی را با دقت بالا شناسایی کند.
افزودن مؤلفهی Multi-K باعث کاهش خطا و بهبود دقت در دادههای پیچیده میشود.
پیشنهاد: استفاده از DPC-MK در دادههای بزرگتر و مقایسه با سایر روشهای خوشهبندی.

