خوشه بندی تغییر میانگین یک الگوریتم خوشه بندی غیر پارامتری مبتنی بر چگالی است که می تواند برای شناسایی خوشه ها در یک مجموعه داده استفاده شود. این به ویژه برای مجموعه داده ها مفید است که خوشه ها دارای اشکال دلخواه هستند و به خوبی توسط مرزهای خطی جدا نمی شوند.
میانگین شیفت یک الگوریتم خوشه بندی غیر پارامتری است که از براورد تراکم هسته (KDE) برای کشف قله های داده ها و شناسایی مراکز خوشه ای استفاده می کند. این بردارهای تغییر متوسط را برای هر نقطه داده محاسبه می کند و انها را به سمت مناطق چگالی بالاتر هدایت می کند.
در هسته ان، Mean Shift یک تکنیک خوشه بندی مبتنی بر مرکز است. این بدان معنی است که مراکز خوشه ای را با تغییر نقاط داده به سمت متراکم ترین مناطق در یک منطقه شناسایی می کند.
ایده اصلی خوشه بندی تغییر میانگین، تغییر هر نقطه داده به سمت حالت (یعنی بالاترین چگالی) توزیع نقاط در یک شعاع خاص است. الگوریتم به طور تکراری این تغییرات را انجام می دهد تا زمانی که نقاط به حداکثر محلی تابع چگالی همگرا شوند. این ماکسیمای محلی نشان دهنده خوشه ها در داده ها است.
📌 مراحل پیاده سازی الگوریتم mean shift :
پیاده سازی الگوریتم خوشه بندی Mean Shift شامل چندین مرحله است :
Initialize centroids: مرکزهای خوشه اولیه را انتخاب کنید. این را می توان با انتخاب تصادفی نقاط داده یا استفاده از روش دیگری مانند k-means انجام داد.
تعریف تابع هسته: تابع هسته تأثیر نقاط داده را بر یکدیگر تعیین می کند. انتخاب های رایج شامل هسته های گاوسی است.
Shift centroids: با جابجایی آنها به سمت ناحیه ای با تراکم نقطه داده بالاتر، مرکزها را به روز کنید. این شامل محاسبه بردار تغییر میانگین برای هر مرکز است.
بررسی همگرایی: مرحله 3 را تا رسیدن به همگرایی تکرار کنید. همگرایی را می توان با بررسی اینکه آیا بردارهای تغییر میانگین زیر یک آستانه معین هستند یا اینکه مرکزها به طور قابل توجهی از حرکت باز می ایستند، تعیین می شود.
اختصاص خوشه ها: پس از همگرایی، هر نقطه داده را به خوشه مرتبط با نزدیکترین مرکز اختصاص دهید.
تکرار یا نهایی کردن: بسته به نیازتان، میتوانید فرآیند را تکرار کنید (اگر میخواهید خوشهها را اصلاح کنید) یا خوشهبندی را نهایی کنید.
به یاد داشته باشید که الگوریتم تغییر میانگین به انتخاب پارامتر پهنای باند در تابع هسته حساس است، بنابراین تنظیم این پارامتر اغلب برای نتایج بهینه ضروری است.
python Example
from sklearn.cluster import MeanShift
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np
#Next, we'll create a sample dataset for clustering with make_blob function and visualize it in a plot.
# Create synthetic datanp.random.seed(1)
x, _ = make_blobs(n_samples=300, centers=5, cluster_std=.8) # Visualize the data plt.scatter(x[:,0], x[:,1])
plt.show()
Scikit-learn کلاس MeanShift را برای پیاده سازی الگوریتم فراهم می کند. در این اموزش، ما از این کلاس برای تعریف مدل استفاده خواهیم کرد.
ما مدل MeanShift را با تنظیم پارامتر پهنای باند به 2 تعریف می کنیم، اندازه منطقه پنجره را مشخص می کنیم و ان را با داده های “x” متناسب می کنیم.
mshclust=MeanShift(bandwidth=2).fit(x)
print(mshclust)MeanShift(bandwidth=2, bin_seeding=False, cluster_all=True, min_bin_freq=1,
n_jobs=1, seeds=None)
#Now, we can get labels (cluster ids) and center points of each cluster area.
# get cluster id
labels = mshclust.labels_ # get cluster centers
centers = mshclust.cluster_centers_
با استفاده از داده های “برچسب ها” و “مراکز“، ما نقاط خوشه ای را با تمایز انها با رنگ های مختلف تجسم می کنیم و نقاط مرکزی هر خوشه را رسم می کنیم.
# Visualize original data and cluster centers plt.scatter(x[:,0], x[:,1], c=labels)
plt.scatter(centers[:,0],centers[:,1], marker='*', color="r",s=80 )
plt.show()
python Example 2
import numpy as np
import pandas as pd
from sklearn.cluster import MeanShift, estimate_bandwidth
from sklearn.datasets.samples_generator import make_blobs
import matplotlib.pyplot as plt
from itertools import cycle
data = pd.read_csv('../input/Skyserver_SQL2_27_2018 6_51_39 PM.csv', skiprows=1)
df = pd.DataFrame(data)
df.head()
centers = [[2, 2], [-3, -2], [2, -4]]
X = df['ra'].values
Y = df['class'].values
print(X)
X = X.reshape(-1, 1)
# The following bandwidth can be automatically detected using
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=1000)
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
labels_unique = np.unique(labels)
n_clusters_ = len(labels_unique)
print("number of estimated clusters : %d" % n_clusters_)
import matplotlib.pyplot as plt
from itertools import cycle
plt.figure(1)
plt.clf()
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
my_members = labels == k
cluster_center = cluster_centers[k]
plt.plot(X[my_members, 0], X[my_members, 0], col + '.')
plt.plot(cluster_center[0], cluster_center[0], 'x', markerfacecolor=col,
markeredgecolor='k', markersize=14)
plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()