الگوریتم MeanShift

نویسنده

دکتر محمدرضا عاطفی

 عضو هیات علمی دانشگاه، رئیس هیات مدیره گروه ناب، مشاور شرکت‌ها و سازمان‌ها

و مریم کامکاردل

ویرایش محتوا
ویرایش محتوا
ویرایش محتوا
ویرایش محتوا
ویرایش محتوا

📌 مقدمه

خوشه بندی تغییر میانگین یک الگوریتم خوشه بندی غیر پارامتری مبتنی بر چگالی است که می تواند برای شناسایی خوشه ها در یک مجموعه داده استفاده شود. این به ویژه برای مجموعه داده ها مفید است که خوشه ها دارای اشکال دلخواه هستند و به خوبی توسط مرزهای خطی جدا نمی شوند. 

میانگین شیفت یک الگوریتم خوشه بندی غیر پارامتری است که از براورد تراکم هسته (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() 
				
			

بینش های مرتبط

بینش‌های‌ ناب