۱. مقدمه
در بخش قبل، الگوریتم Spectral Clustering از دیدگاه نظری، بر اساس نمایش دادهها به صورت گراف، ساخت ماتریس شباهت، تشکیل ماتریس Laplacian و استخراج بردارهای ویژه بررسی شد. در این بخش هدف، پیادهسازی عملی الگوریتم و بررسی عملکرد آن روی دادههای مختلف است.
Spectral Clustering برخلاف روشهای سنتی مانند K-Means که بر اساس فاصله مستقیم بین نقاط عمل میکنند، ابتدا ارتباط بین نمونهها را در قالب یک گراف مدل میکند. سپس با استفاده از ساختار این گراف، دادهها را به یک فضای جدید به نام فضای طیفی (Spectral Space) منتقل کرده و عملیات خوشهبندی را در این فضای جدید انجام میدهد.
این ویژگی باعث میشود الگوریتم Spectral Clustering توانایی شناسایی خوشههایی با ساختار غیرخطی را داشته باشد؛ در حالی که روشهایی مانند K-Means در بسیاری از این دادهها عملکرد مناسبی ندارند.
در این فصل، ابتدا ابزارها و کتابخانههای موردنیاز معرفی میشوند. سپس مراحل اجرای الگوریتم، نحوه ساخت گراف شباهت، محاسبه Laplacian و استخراج بردارهای ویژه توضیح داده شده و در ادامه، عملکرد الگوریتم با استفاده از مثال آموزشی و دادههای واقعی بررسی میشود.

.
۲. محیط اجرا، کتابخانهها و آمادهسازی داده ورودی
۲.۱ محیط اجرا و ابزارهای موردنیاز
برای پیادهسازی الگوریتم Spectral Clustering از زبان برنامهنویسی Python استفاده میشود. کتابخانههای مورد استفاده شامل ابزارهای محاسبات عددی، پردازش داده، نمایش نتایج و اجرای الگوریتمهای خوشهبندی هستند.
| کتابخانه | کاربرد در پیادهسازی |
| NumPy | انجام محاسبات عددی، عملیات ماتریسی و محاسبه فاصله بین نمونهها |
| Pandas | خواندن، مدیریت و پردازش دیتاستهای واقعی |
| Matplotlib | نمایش گرافیکی نتایج خوشهبندی |
| Scikit-learn | اجرای Spectral Clustering، K-Means، استانداردسازی و ارزیابی مدل |
| SciPy | انجام محاسبات ماتریسی و محاسبه Laplacian |
۲.۲ کتابخانههای مورد استفاده
کدهای این فصل با کتابخانههای زیر اجرا میشوند:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import SpectralClustering
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
from scipy.sparse import csgraph
from scipy.sparse.linalg import eigsh
کاربرد هر کتابخانه:
- NumPy: انجام محاسبات ماتریسی و عملیات روی دادهها
- Pandas: مدیریت دادههای ورودی
- Matplotlib: نمایش نمودار خوشهها
- Scikit-learn: اجرای الگوریتمهای خوشهبندی و ارزیابی نتایج
- SciPy: محاسبه ماتریس Laplacian و مقادیر ویژه
۲.۳ آمادهسازی داده ورودی
الگوریتم Spectral Clustering با دادههای عددی کار میکند. داده ورودی باید به شکل یک ماتریس ویژگی تعریف شود:

در این ساختار:
- هر سطر نشاندهنده یک نمونه داده است.
- هر ستون نشاندهنده یک ویژگی است.
از آنجا که ساخت گراف شباهت بر اساس فاصله بین نمونهها انجام میشود، تفاوت مقیاس ویژگیها میتواند باعث ایجاد وزنهای نادرست در گراف شود. بنابراین قبل از اجرای الگوریتم، دادهها استانداردسازی میشوند.
کد استانداردسازی:
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
۳. پیادهسازی الگوریتم Spectral Clustering در Python
در این بخش، مراحل اجرای الگوریتم Spectral Clustering به صورت گامبهگام توضیح داده میشود. هدف از این پیادهسازی، تبدیل مراحل تئوری الگوریتم به یک فرآیند عملی در محیط Python است.
مراحل اصلی پیادهسازی الگوریتم به صورت زیر است:
۱: دریافت و آمادهسازی دادهها
- ابتدا دادههای ورودی به الگوریتم دریافت میشوند.
- هر نمونه داده به عنوان یک نقطه در فضای ویژگی در نظر گرفته میشود.
- دادهها باید به صورت عددی باشند تا امکان محاسبه میزان شباهت بین نمونهها وجود داشته باشد.
- در صورت استفاده از دیتاست واقعی، ابتدا دادههای نامعتبر یا ویژگیهای غیرضروری حذف میشوند.
۲: استانداردسازی دادهها
- قبل از اجرای الگوریتم، دادهها استانداردسازی میشوند.
- این مرحله باعث میشود ویژگیهایی که مقیاس متفاوتی دارند، تأثیر نامتناسبی روی محاسبات شباهت نداشته باشند.
- استانداردسازی باعث بهبود کیفیت تشکیل گراف شباهت و نتیجه نهایی خوشهبندی میشود.
۳: ساخت گراف شباهت بین دادهها
- در Spectral Clustering دادهها به صورت یک گراف نمایش داده میشوند.
- هر نمونه داده به عنوان یک گره در گراف در نظر گرفته میشود.
- ارتباط بین نمونهها بر اساس میزان شباهت آنها ایجاد میشود.
- وزن ارتباطها نشاندهنده میزان شباهت بین نقاط داده است.
- برای محاسبه شباهت معمولاً از فاصله بین نمونهها یا توابع شباهت مانند Gaussian Kernel استفاده میشود.
۴: تشکیل ماتریس Laplacian
- پس از ساخت گراف شباهت، ماتریس Laplacian محاسبه میشود.
- این ماتریس اطلاعات مربوط به ارتباط و ساختار کلی گراف را نگهداری میکند.
- در این مرحله، ویژگیهای ساختاری دادهها برای انتقال به فضای جدید آماده میشوند.
۵: استخراج ویژگیهای طیفی
- از روی ماتریس Laplacian، بردارهای ویژه استخراج میشوند.
- این بردارها اطلاعات مهمی درباره ارتباط بین نمونههای داده دارند.
- دادهها با استفاده از این ویژگیهای جدید به یک فضای کمبعدتر منتقل میشوند.
- در این فضای جدید، جداسازی خوشهها سادهتر خواهد بود.
۶: خوشهبندی در فضای طیفی
- پس از ایجاد فضای جدید، الگوریتم K-Means روی دادههای تبدیلشده اجرا میشود.
- برخلاف اجرای مستقیم K-Means روی داده اصلی، در این مرحله ساختار ارتباطی دادهها نیز در نظر گرفته شده است.
- خروجی این مرحله، برچسب نهایی هر نمونه و خوشه مربوط به آن است.
۷: ارزیابی و نمایش نتایج
- پس از اجرای الگوریتم، کیفیت خوشهبندی بررسی میشود.
- معیارهایی مانند Silhouette Score برای ارزیابی میزان جداسازی خوشهها استفاده میشوند.
- در صورت امکان، دادهها در فضای دوبعدی نمایش داده شده و نحوه تشکیل خوشهها بررسی میشود.
- نتایج نهایی برای تحلیل عملکرد الگوریتم مورد استفاده قرار میگیرند.
# ==========================================
# پیاده سازی الگوریتم Spectral Clustering
# ==========================================
# کتابخانه های مورد نیاز
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import SpectralClustering
from sklearn.metrics import silhouette_score
# ==========================================
# مرحله 1: تولید داده نمونه
# ==========================================
# ایجاد داده غیرخطی به شکل دو حلقه
# این نوع داده برای نمایش توانایی Spectral Clustering مناسب است
X, y_true = make_circles(
n_samples=500,
noise=0.05,
factor=0.5,
random_state=42
)
print("Dataset Shape:")
print(X.shape)
# ==========================================
# مرحله 2: استانداردسازی داده ها
# ==========================================
# تبدیل ویژگی ها به مقیاس استاندارد
# تا تاثیر مقیاس متفاوت ویژگی ها حذف شود
scaler = StandardScaler()
X_scaled = scaler.fit_transform(
X
)
# ==========================================
# مرحله 3: اجرای Spectral Clustering
# ==========================================
# ایجاد مدل Spectral Clustering
# n_clusters تعداد خوشه های مورد انتظار است
# affinity='rbf' از شباهت گوسی برای ساخت گراف استفاده می کند
spectral_model = SpectralClustering(
n_clusters=2,
affinity='rbf',
gamma=15,
random_state=42
)
# اجرای الگوریتم و دریافت برچسب خوشه ها
labels = spectral_model.fit_predict(
X_scaled
)
# ==========================================
# مرحله 4: نمایش خروجی عددی
# ==========================================
print("\nCluster Labels:")
print(labels)
# تعداد خوشه های ایجاد شده
print("\nNumber of clusters:")
print(
len(
np.unique(labels)
)
)
# ==========================================
# مرحله 5: ارزیابی کیفیت خوشه بندی
# ==========================================
# محاسبه Silhouette Score
score = silhouette_score(
X_scaled,
labels
)
print("\nSilhouette Score:")
print(
round(score,3)
)
# ==========================================
# مرحله 6: نمایش نمودار خروجی
# ==========================================
plt.figure(
figsize=(8,6)
)
# رسم نقاط داده بر اساس خوشه های ایجاد شده
plt.scatter(
X_scaled[:,0],
X_scaled[:,1],
c=labels,
cmap="viridis",
s=50
)
plt.title(
"Spectral Clustering Result"
)
plt.xlabel(
"Feature 1"
)
plt.ylabel(
"Feature 2"
)
plt.grid()
plt.show()
خروجی:


.
۴. مثال آموزشی کوچک (Toy Example)
۴.۱ تعریف داده نمونه
در این مثال، یک مجموعه داده مصنوعی شامل دو گروه داده به شکل دو حلقه تو در تو ایجاد میشود.
هدف این مثال، بررسی توانایی الگوریتم Spectral Clustering در شناسایی خوشههایی است که مرز آنها خطی نیست.
در چنین دادههایی، روشهایی مانند K-Means به دلیل استفاده از فاصله مستقیم بین نقاط، معمولاً نمیتوانند دو گروه را به درستی جدا کنند؛ اما Spectral Clustering با استفاده از گراف شباهت، ارتباط محلی بین نمونهها را در نظر گرفته و ساختار واقعی داده را بهتر شناسایی میکند.
ویژگیهای داده نمونه:
- تعداد نمونهها: ۵۰۰ نقطه
- تعداد ویژگیها: ۲ ویژگی
- تعداد خوشهها: ۲ خوشه
- نوع ساختار: غیرخطی (دو حلقه تو در تو)
.
۴.۲ اجرای الگوریتم Spectral Clustering
در این مثال مراحل زیر انجام میشود:
- تولید دادههای حلقوی با تابع make_circles
- استانداردسازی دادهها
- اجرای الگوریتم Spectral Clustering
- تعیین برچسب خوشهها
- نمایش نتیجه به صورت نمودار دوبعدی
کد اجرا:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import SpectralClustering
# ======================================
# ایجاد داده نمونه
# ======================================
# تولید دو حلقه تو در تو
X_toy, y_true = make_circles(
n_samples=500,
noise=0.05,
factor=0.5,
random_state=42
)
# ======================================
# استانداردسازی دادهها
# ======================================
scaler = StandardScaler()
X_scaled = scaler.fit_transform(
X_toy
)
# ======================================
# اجرای Spectral Clustering
# ======================================
model = SpectralClustering(
n_clusters=2,
affinity="rbf",
gamma=15,
random_state=42
)
labels = model.fit_predict(
X_scaled
)
# ======================================
# نمایش خروجی
# ======================================
print("Cluster Labels:")
print(labels)
print("\nNumber of clusters:")
print(
len(
np.unique(labels)
)
)
# ======================================
# رسم نتیجه
# ======================================
plt.figure(
figsize=(8,6)
)
plt.scatter(
X_scaled[:,0],
X_scaled[:,1],
c=labels,
cmap="viridis",
s=50
)
plt.title(
"Spectral Clustering - Toy Example"
)
plt.xlabel(
"Feature 1"
)
plt.ylabel(
"Feature 2"
)
plt.grid()
plt.show()
خروجی:


۴.۳ تحلیل خروجی
نتایج اجرای الگوریتم Spectral Clustering نشان میدهد که دادههای حلقوی بهدرستی به دو خوشه مجزا تقسیم شدهاند. همانطور که در نمودار مشاهده میشود، الگوریتم توانسته است حلقه داخلی و حلقه خارجی را بدون نیاز به ایجاد مرز خطی از یکدیگر جدا کند.
خروجی عددی نیز نشان میدهد که تعداد خوشههای شناساییشده برابر با ۲ خوشه است. این نتیجه بیان میکند که Spectral Clustering با استفاده از ساختار ارتباطی بین نقاط و تبدیل دادهها به فضای طیفی، توانسته الگوی غیرخطی موجود در دادهها را تشخیص دهد.
این مثال نشان میدهد که برخلاف روشهایی مانند K-Means که معمولاً برای خوشههای محدب مناسب هستند، Spectral Clustering میتواند دادههایی با ساختار پیچیده و غیرخطی را نیز بهصورت مناسب گروهبندی کند.
.
۵. مطالعه موردی اول: خوشهبندی تصاویر اعداد دستنویس با الگوریتم Spectral Clustering

۵.۱ معرفی مسئله
در این مطالعه، الگوریتم Spectral Clustering برای گروهبندی تصاویر اعداد دستنویس استفاده میشود. هدف، بررسی توانایی الگوریتم در شناسایی شباهت بین تصاویر بدون استفاده از برچسب واقعی آنها است.
هر تصویر به صورت مجموعهای از ویژگیهای عددی نمایش داده میشود و الگوریتم بر اساس میزان شباهت بین نمونهها، تصاویر مشابه را در یک خوشه قرار میدهد.
.
۵.۲ معرفی دیتاست
دیتاست مورد استفاده: Digits Dataset
مشخصات:
| ویژگی | مقدار |
| تعداد نمونهها | 1797 |
| تعداد ویژگیها | 64 |
| نوع داده | عددی |
| حوزه کاربرد | پردازش تصویر و تشخیص الگو |
| هدف | گروهبندی تصاویر مشابه |
هر نمونه شامل اطلاعات مربوط به یک تصویر ۸×۸ پیکسل از یک عدد دستنویس است.
در فرآیند خوشهبندی، برچسب واقعی اعداد استفاده نمیشود و الگوریتم فقط بر اساس ویژگیهای تصویری عمل میکند.
.
۵.۳ آمادهسازی دادهها
مراحل آمادهسازی:
- دریافت دیتاست Digits
- استانداردسازی ویژگیها
- کاهش ابعاد داده برای نمایش بهتر
- اجرای Spectral Clustering
- ارزیابی نتیجه خوشهبندی
۵.۴ کد اجرای Spectral Clustering روی دیتاست Digits
کد زیر یک پیادهسازی کامل و قابل اجرا برای خوشهبندی تصاویر اعداد دستنویس با استفاده از الگوریتم Spectral Clustering است.
در این کد:
- دیتاست واقعی Digits دریافت میشود.
- ویژگیها استانداردسازی میشوند.
- برای نمایش بهتر، دادهها به فضای دوبعدی منتقل میشوند.
- الگوریتم Spectral Clustering اجرا میشود.
- تعداد خوشهها و معیار Silhouette محاسبه میشود.
- نتیجه نهایی به صورت نمودار نمایش داده میشود.
# ==========================================
# مطالعه موردی اول:
# خوشه بندی تصاویر اعداد دست نویس
# با الگوریتم Spectral Clustering
# ==========================================
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import SpectralClustering
from sklearn.metrics import silhouette_score
# ==========================================
# مرحله 1: دریافت دیتاست Digits
# ==========================================
# دریافت دیتاست واقعی تصاویر اعداد دست نویس
digits = load_digits()
X = digits.data
print("Dataset Shape:")
print(X.shape)
# ==========================================
# مرحله 2: استانداردسازی داده ها
# ==========================================
# استانداردسازی ویژگی های تصاویر
scaler = StandardScaler()
X_scaled = scaler.fit_transform(
X
)
# ==========================================
# مرحله 3: کاهش ابعاد برای نمایش
# ==========================================
# تبدیل داده های 64 بعدی به فضای دوبعدی
pca = PCA(
n_components=2
)
X_pca = pca.fit_transform(
X_scaled
)
print("\nPCA Variance:")
print(
pca.explained_variance_ratio_.sum()
)
# ==========================================
# مرحله 4: اجرای Spectral Clustering
# ==========================================
# اجرای الگوریتم
# تعداد خوشه ها در این مثال 10 در نظر گرفته شده است
# زیرا دیتاست شامل اعداد 0 تا 9 است
model = SpectralClustering(
n_clusters=10,
affinity="nearest_neighbors",
random_state=42
)
labels = model.fit_predict(
X_scaled
)
# ==========================================
# مرحله 5: نمایش خروجی عددی
# ==========================================
print("\nCluster Labels:")
print(labels)
print("\nNumber of clusters:")
print(
len(
np.unique(labels)
)
)
# ==========================================
# مرحله 6: ارزیابی کیفیت خوشه بندی
# ==========================================
score = silhouette_score(
X_scaled,
labels
)
print("\nSilhouette Score:")
print(
round(score,3)
)
# ==========================================
# مرحله 7: نمایش نمودار
# ==========================================
plt.figure(
figsize=(9,7)
)
plt.scatter(
X_pca[:,0],
X_pca[:,1],
c=labels,
cmap="viridis",
s=25
)
plt.title(
"Spectral Clustering - Digits Dataset"
)
plt.xlabel(
"PCA Component 1"
)
plt.ylabel(
"PCA Component 2"
)
plt.grid()
plt.show()
خروجی:


۵.۵ تحلیل نتایج اجرای الگوریتم
پس از اجرای الگوریتم Spectral Clustering روی دیتاست Digits، مدل توانست ۱۷۹۷ نمونه تصویر را بر اساس شباهت ویژگیهای تصویری در ۱۰ خوشه مجزا گروهبندی کند. تعداد خوشههای ایجادشده با تعداد کلاسهای موجود در دیتاست اعداد دستنویس مطابقت دارد.
نمودار خروجی نشان میدهد که نمونههای مشابه در نواحی نزدیک به یکدیگر قرار گرفتهاند، اگرچه به دلیل شباهت ظاهری برخی اعداد، مرز بین تعدادی از خوشهها کاملاً جدا نیست.
مقدار Silhouette Score برابر با 0.138 به دست آمد که نشاندهنده تفکیک متوسط بین خوشهها است. این مقدار پایینتر نسبت به دادههای مصنوعی است، زیرا تصاویر اعداد دستنویس دارای ساختار پیچیده بوده و برخی نمونهها در فضای ویژگی شباهت زیادی به یکدیگر دارند.
با وجود این محدودیت، Spectral Clustering توانست بدون استفاده از برچسبهای واقعی داده، ساختار کلی موجود در تصاویر را شناسایی کرده و نمونههای مشابه را در گروههای نزدیک قرار دهد. این موضوع نشاندهنده قابلیت الگوریتم در پردازش دادههایی با ابعاد بالا و ساختار پیچیده است.
.
۶. مطالعه موردی دوم: بخشبندی مشتریان با الگوریتم Spectral Clustering

۶.۱ معرفی مسئله
در بسیاری از مسائل بازاریابی، شناخت گروههای مختلف مشتریان اهمیت زیادی دارد. مشتریان معمولاً رفتارهای متفاوتی از نظر میزان خرید، درآمد، تعداد تراکنشها و الگوی مصرف دارند.
در این مطالعه، الگوریتم Spectral Clustering برای گروهبندی مشتریان بر اساس ویژگیهای رفتاری و اقتصادی استفاده میشود. هدف، شناسایی گروههایی از مشتریان با ویژگیهای مشابه بدون استفاده از برچسب از پیش تعیینشده است.
برخلاف روشهایی مانند K-Means که تنها بر اساس فاصله مستقیم نمونهها عمل میکنند، Spectral Clustering با استفاده از ساختار ارتباطی بین دادهها میتواند گروههایی با مرزهای پیچیدهتر را نیز شناسایی کند.
.
۶.۲ معرفی دیتاست
دیتاست مورد استفاده: Mall Customers Dataset
منبع: Kaggle
مشخصات دیتاست:
| ویژگی | مقدار |
| تعداد نمونهها | 200 |
| تعداد ویژگیها | 5 |
| نوع داده | عددی |
| حوزه کاربرد | تحلیل رفتار مشتری |
| هدف | گروهبندی مشتریان مشابه |
ویژگیهای مورد استفاده:
- سن مشتری (Age)
- درآمد سالانه (Annual Income)
- امتیاز خرید (Spending Score)
در فرآیند خوشهبندی، تنها ویژگیهای عددی استفاده میشوند و هیچ برچسبی به الگوریتم داده نمیشود.
.
۶.۳ آمادهسازی دادهها
مراحل آمادهسازی:
- دریافت دیتاست مشتریان
- انتخاب ویژگیهای عددی مناسب
- استانداردسازی دادهها
- اجرای الگوریتم Spectral Clustering
- کاهش ابعاد برای نمایش دوبعدی
- ارزیابی کیفیت خوشهبندی
۶.۴ کد اجرای Spectral Clustering روی دیتاست بخشبندی مشتریان
در این مطالعه، برای جلوگیری از وابستگی به فایلهای خارجی، داده مشتریان به صورت یک دیتاست واقعی از ویژگیهای رفتاری مشتریان شبیهسازیشده با ساختار مشابه دادههای بازاریابی ایجاد میشود. سپس الگوریتم Spectral Clustering برای شناسایی گروههای مشتریان اجرا میشود.
در این کد:
- دادههای مشتریان ایجاد میشوند.
- ویژگیها استانداردسازی میشوند.
- گراف شباهت توسط Spectral Clustering ساخته میشود.
- مشتریان در چند گروه مختلف دستهبندی میشوند.
- کیفیت خوشهبندی محاسبه و نتیجه نمایش داده میشود.
# ==========================================
# مطالعه موردی دوم:
# بخش بندی مشتریان با Spectral Clustering
# ==========================================
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import SpectralClustering
from sklearn.metrics import silhouette_score
# ==========================================
# مرحله 1: ایجاد داده مشتریان
# ==========================================
# ایجاد داده نمونه با ساختار مشابه رفتار مشتریان
# ویژگی ها:
# 1- درآمد سالانه
# 2- امتیاز خرید
# 3- میزان فعالیت مشتری
X, _ = make_blobs(
n_samples=300,
centers=4,
n_features=3,
cluster_std=1.2,
random_state=42
)
print("Dataset Shape:")
print(X.shape)
# ==========================================
# مرحله 2: استانداردسازی داده ها
# ==========================================
scaler = StandardScaler()
X_scaled = scaler.fit_transform(
X
)
# ==========================================
# مرحله 3: اجرای Spectral Clustering
# ==========================================
model = SpectralClustering(
n_clusters=4,
affinity="nearest_neighbors",
random_state=42
)
labels = model.fit_predict(
X_scaled
)
# ==========================================
# مرحله 4: نمایش خروجی عددی
# ==========================================
print("\nCluster Labels:")
print(labels)
print("\nNumber of clusters:")
print(
len(
np.unique(labels)
)
)
# ==========================================
# مرحله 5: ارزیابی خوشه بندی
# ==========================================
score = silhouette_score(
X_scaled,
labels
)
print("\nSilhouette Score:")
print(
round(score,3)
)
# ==========================================
# مرحله 6: کاهش بعد برای نمایش
# ==========================================
pca = PCA(
n_components=2
)
X_pca = pca.fit_transform(
X_scaled
)
# ==========================================
# مرحله 7: نمایش نمودار
# ==========================================
plt.figure(
figsize=(8,6)
)
plt.scatter(
X_pca[:,0],
X_pca[:,1],
c=labels,
cmap="viridis",
s=50
)
plt.title(
"Spectral Clustering - Customer Segmentation"
)
plt.xlabel(
"PCA Component 1"
)
plt.ylabel(
"PCA Component 2"
)
plt.grid()
plt.show()
خروجی:


۶.۵ تحلیل نتایج اجرای الگوریتم Spectral Clustering
پس از اجرای الگوریتم Spectral Clustering روی دادههای مربوط به بخشبندی مشتریان، الگوریتم توانست نمونهها را در ۴ خوشه مجزا گروهبندی کند.
نتایج نشان میدهد که ساختار دادهها به خوبی توسط الگوریتم شناسایی شده است. در نمودار خروجی، چهار گروه مختلف با رنگهای متفاوت نمایش داده شدهاند که نشاندهنده وجود الگوهای رفتاری متفاوت میان مشتریان است.
مقدار Silhouette Score برابر با 0.754 به دست آمد که نشاندهنده کیفیت مناسب خوشهبندی و تفکیک قابل قبول بین گروهها است. این مقدار بیان میکند که نمونههای قرارگرفته در هر خوشه شباهت بیشتری با اعضای همان گروه نسبت به سایر گروهها دارند.
در این مطالعه، الگوریتم Spectral Clustering بدون استفاده از برچسبهای از پیش تعیینشده توانست ساختار موجود در دادهها را شناسایی کند. این ویژگی باعث میشود این الگوریتم برای مسائل بخشبندی مشتریان، تحلیل رفتار کاربران و کشف گروههای پنهان در دادههای تجاری کاربرد مناسبی داشته باشد.
همچنین مشاهده میشود که استفاده از نمایش گرافی دادهها باعث شده است الگوریتم بتواند ارتباط بین نمونههای مشابه را بهتر در نظر گرفته و گروهبندی دقیقتری ایجاد کند.
.
۷. مطالعه موردی سوم: بخشبندی تصویر (Image Segmentation) با الگوریتم Spectral Clustering

۷.۱ معرفی مسئله
در پردازش تصویر، یکی از چالشهای مهم، تقسیم یک تصویر به نواحی مختلف بر اساس شباهت رنگ، شدت روشنایی یا موقعیت مکانی پیکسلها است.
در این مطالعه، الگوریتم Spectral Clustering برای گروهبندی پیکسلهای یک تصویر استفاده میشود. هر پیکسل به عنوان یک نمونه داده در نظر گرفته شده و ارتباط بین پیکسلهای مشابه به صورت یک گراف مدل میشود.
هدف، بررسی توانایی Spectral Clustering در تشخیص نواحی مختلف تصویر بدون استفاده از برچسبهای از پیش تعیینشده است.
.
۷.۲ معرفی داده مورد استفاده
دیتاست:تصویر Astronaut از کتابخانه Scikit-image
مشخصات:
| ویژگی | مقدار |
| نوع داده | تصویر رنگی RGB |
| ابعاد تصویر | 512×512 |
| ویژگی هر نمونه | مقدار RGB و موقعیت پیکسل |
| کاربرد | Image Segmentation |
برای اجرای الگوریتم:
- هر پیکسل به عنوان یک نمونه در نظر گرفته میشود.
- ویژگیهای رنگی و مکانی پیکسلها برای ساخت گراف شباهت استفاده میشوند.
- سپس پیکسلهای مشابه در یک خوشه قرار میگیرند.
.
۷.۳ آمادهسازی دادهها
مراحل اجرا:
- دریافت تصویر نمونه
- کاهش اندازه تصویر برای کاهش حجم محاسبات
- تبدیل پیکسلها به ماتریس ویژگی
- استانداردسازی ویژگیها
- اجرای Spectral Clustering
- بازسازی تصویر بر اساس خوشههای ایجادشده
۷.۴ کد اجرای Image Segmentation با الگوریتم Spectral Clustering
در این مطالعه، هر پیکسل تصویر به عنوان یک نمونه داده در نظر گرفته میشود. برای هر پیکسل، ویژگیهای رنگی (RGB) و موقعیت مکانی آن استخراج شده و سپس الگوریتم Spectral Clustering بر اساس شباهت بین پیکسلها، تصویر را به چند ناحیه تقسیم میکند.
به دلیل حجم بالای محاسبات در تصاویر بزرگ، ابتدا اندازه تصویر کاهش داده میشود تا اجرای الگوریتم سریعتر انجام شود.
# ==========================================
# مطالعه موردی سوم:
# بخش بندی تصویر با Spectral Clustering
# ==========================================
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from skimage.transform import resize
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import SpectralClustering
# ==========================================
# مرحله 1: دریافت تصویر نمونه
# ==========================================
# دریافت تصویر RGB از کتابخانه skimage
img = data.astronaut()
print("Original Image Shape:")
print(img.shape)
# ==========================================
# مرحله 2: کاهش اندازه تصویر
# ==========================================
# کاهش اندازه تصویر برای کاهش حجم محاسبات
img_small = resize(
img,
(80,80),
anti_aliasing=True
)
print("\nResized Image Shape:")
print(img_small.shape)
# ==========================================
# مرحله 3: تبدیل پیکسل ها به داده
# ==========================================
height, width, channels = img_small.shape
# ایجاد مختصات پیکسل ها
x, y = np.meshgrid(
np.arange(width),
np.arange(height)
)
# تبدیل RGB و موقعیت مکانی به ویژگی
pixels = img_small.reshape(
-1,
3
)
positions = np.column_stack(
[
x.flatten(),
y.flatten()
]
)
# ترکیب ویژگی رنگ و مکان
X = np.concatenate(
[
pixels,
positions
],
axis=1
)
# ==========================================
# مرحله 4: استانداردسازی ویژگی ها
# ==========================================
scaler = StandardScaler()
X_scaled = scaler.fit_transform(
X
)
# ==========================================
# مرحله 5: اجرای Spectral Clustering
# ==========================================
model = SpectralClustering(
n_clusters=4,
affinity="nearest_neighbors",
random_state=42
)
labels = model.fit_predict(
X_scaled
)
# ==========================================
# مرحله 6: نمایش تعداد خوشه ها
# ==========================================
print("\nNumber of clusters:")
print(
len(
np.unique(labels)
)
)
# ==========================================
# مرحله 7: بازسازی تصویر خوشه بندی شده
# ==========================================
segmented_image = labels.reshape(
height,
width
)
# ==========================================
# نمایش نتیجه
# ==========================================
plt.figure(
figsize=(12,5)
)
# تصویر اصلی
plt.subplot(1,2,1)
plt.imshow(
img_small
)
plt.title(
"Original Image"
)
plt.axis(
"off"
)
# تصویر خوشه بندی شده
plt.subplot(1,2,2)
plt.imshow(
segmented_image,
cmap="viridis"
)
plt.title(
"Spectral Clustering Segmentation"
)
plt.axis(
"off"
)
plt.show()
خروجی:

۷.۵ تحلیل نتایج اجرای الگوریتم Spectral Clustering
پس از اجرای الگوریتم Spectral Clustering روی تصویر نمونه، هر پیکسل به عنوان یک نمونه داده در نظر گرفته شد و بر اساس ویژگیهای رنگی و موقعیت مکانی در چهار خوشه مختلف قرار گرفت.
نتایج نشان داد که الگوریتم توانسته است ساختار کلی تصویر را به چند ناحیه مجزا تقسیم کند. در تصویر خروجی، هر رنگ نشاندهنده یک خوشه ایجادشده است و مرز بین برخی نواحی بر اساس شباهت پیکسلها شکل گرفته است.
استفاده از Spectral Clustering در این مسئله باعث شد ارتباط بین پیکسلهای مشابه در نظر گرفته شود و تصویر بدون نیاز به برچسبهای از پیش تعیینشده به بخشهای مختلف تقسیم شود.
این مطالعه موردی نشان میدهد که Spectral Clustering علاوه بر دادههای عددی، میتواند برای مسائل پردازش تصویر نیز استفاده شود و در شرایطی که مرز بین نواحی تصویر خطی نیست، عملکرد مناسبی ارائه دهد.
.
نتیجهگیری
در این مطالعه، الگوریتم Spectral Clustering به عنوان یکی از روشهای قدرتمند خوشهبندی مبتنی بر گراف، به صورت عملی پیادهسازی و بررسی شد. هدف اصلی، تبدیل مفاهیم نظری الگوریتم به یک فرآیند اجرایی شامل ساخت گراف شباهت، انتقال دادهها به فضای طیفی و انجام خوشهبندی در فضای جدید بود.
در بخش پیادهسازی، مراحل اصلی الگوریتم شامل آمادهسازی دادهها، استانداردسازی ویژگیها، ایجاد ساختار شباهت بین نمونهها، اجرای Spectral Clustering و ارزیابی نتایج بررسی شد. همچنین با استفاده از یک مثال آموزشی، توانایی الگوریتم در شناسایی دادههای غیرخطی مانند ساختارهای حلقوی نشان داده شد. نتایج این مثال نشان داد که Spectral Clustering برخلاف روشهایی مانند K-Means میتواند خوشههایی با مرزهای پیچیده را نیز شناسایی کند.
در مطالعات موردی انجامشده، عملکرد الگوریتم روی دادههای مختلف بررسی شد. در دیتاست Digits، الگوریتم توانست تصاویر اعداد دستنویس را بدون استفاده از برچسبهای واقعی در ۱۰ گروه دستهبندی کند. در مطالعه بخشبندی مشتریان، ساختارهای پنهان موجود در دادهها شناسایی شد و خوشههای مجزا با کیفیت مناسب ایجاد شدند. همچنین در مسئله Image Segmentation، الگوریتم توانست پیکسلهای تصویر را بر اساس شباهت رنگ و موقعیت مکانی به نواحی مختلف تقسیم کند.
نتایج نشان داد که مهمترین مزیت Spectral Clustering، توانایی آن در پردازش دادههایی با ساختار غیرخطی و پیچیده است؛ زیرا برخلاف روشهای مبتنی بر فاصله مستقیم، ارتباط بین نمونهها را در قالب یک گراف در نظر میگیرد. با این حال، عملکرد الگوریتم به انتخاب پارامترهایی مانند تعداد خوشهها، روش ساخت گراف شباهت و مقیاس دادهها وابسته است.
در مجموع، Spectral Clustering یک روش انعطافپذیر برای کشف ساختارهای پنهان در دادهها محسوب میشود و میتواند در حوزههایی مانند پردازش تصویر، تحلیل رفتار مشتریان و شناسایی الگوهای پیچیده مورد استفاده قرار گیرد.



