خوشه‌بندی K-Means

پیاده‌سازی خوشه‌بندی K-Means در پایتون

خوشه‌بندی K-Means – مقدمه

خوشه‌بندی K-Means یک الگوریتم یادگیری ماشین بدون نظارت (Unsupervised Machine Learning) است که مجموعه داده‌های بدون برچسب را به خوشه‌های مختلف گروه‌بندی می‌کند. از این الگوریتم برای سازماندهی داده‌ها به گروه‌هایی بر اساس شباهتشان استفاده می‌شود.

درک خوشه‌بندی K-Means:

برای مثال، یک فروشگاه آنلاین از K-Means برای گروه‌بندی مشتریان بر اساس فرکانس خرید و میزان خرج کردن استفاده می‌کند و بخش‌هایی مانند خریداران با بودجه کم، خریداران مکرر و خریداران بزرگ را برای بازاریابی شخصی‌سازی شده ایجاد می‌کند.

این الگوریتم ابتدا چند نقطه مرکزی به نام “سنتروید” (Centroids) را به صورت تصادفی انتخاب می‌کند. سپس هر نقطه داده به نزدیک‌ترین سنتروید اختصاص داده می‌شود و یک خوشه را تشکیل می‌دهد. پس از اینکه تمام نقاط به یک خوشه اختصاص داده شدند، سنترویدها با یافتن میانگین موقعیت نقاط در هر خوشه به‌روزرسانی می‌شوند. این فرآیند تا زمانی که سنترویدها از تغییر بازایستند و خوشه‌ها شکل بگیرند، تکرار می‌شود.

هدف خوشه‌بندی، تقسیم نقاط داده به خوشه‌هایی است که نقاط داده مشابه به یک گروه تعلق داشته باشند.

←برای خرید کرک لایسنس تبلو Tableau با تمام ویژگی ها کلیک کنید

خوشه‌بندی K-Means چگونه کار می‌کند؟

ما یک مجموعه داده از آیتم‌ها را با ویژگی‌های خاص و مقادیر برای این ویژگی‌ها (مانند یک بردار) در اختیار داریم.

وظیفه این است که این آیتم‌ها را به گروه‌هایی دسته‌بندی کنیم. برای دستیابی به این هدف، از الگوریتم K-Means استفاده خواهیم کرد. ‘K’ در نام الگوریتم نشان‌دهنده تعداد گروه‌ها/خوشه‌هایی است که می‌خواهیم آیتم‌هایمان را در آن‌ها طبقه‌بندی کنیم.

این الگوریتم آیتم‌ها را به k گروه یا خوشه مشابه دسته‌بندی می‌کند. برای محاسبه این شباهت، از فاصله اقلیدسی به عنوان معیار اندازه‌گیری استفاده خواهیم کرد.

خوشه‌بندی K-Means

الگوریتم به شرح زیر کار می‌کند:

  1. ابتدا k نقطه را که “میانگین” (means) یا “سنترویدهای خوشه” (cluster centroids) نامیده می‌شوند، به صورت تصادفی مقداردهی اولیه می‌کنیم.
  2. هر آیتم را به نزدیک‌ترین میانگین آن دسته‌بندی می‌کنیم.
  3. مختصات میانگین‌ها را به‌روزرسانی می‌کنیم، که میانگین مقادیر آیتم‌های دسته‌بندی شده در آن خوشه تا به حال است.
  4. این فرآیند را برای تعداد مشخصی از تکرارها (iterations) تکرار می‌کنیم و در پایان، خوشه‌های خود را خواهیم داشت.

“نقاط” ذکر شده در بالا به این دلیل “میانگین” نامیده می‌شوند که مقادیر میانگین آیتم‌های دسته‌بندی شده در آن‌ها هستند.

برای مقداردهی اولیه این میانگین‌ها، گزینه‌های زیادی وجود دارد. یک روش بصری این است که میانگین‌ها را در آیتم‌های تصادفی در مجموعه داده مقداردهی اولیه کنیم. روش دیگر این است که میانگین‌ها را در مقادیر تصادفی بین مرزهای مجموعه داده مقداردهی اولیه کنیم. برای مثال، برای یک ویژگی x که آیتم‌ها دارای مقادیر در [Min, Max] هستند، میانگین‌ها را با مقادیر x در [Min, Max] مقداردهی اولیه خواهیم کرد.

انتخاب تعداد صحیح خوشه‌ها برای تقسیم‌بندی معنی‌دار مهم است؛ برای انجام این کار، از روش آرنج (Elbow Method) برای یافتن مقدار بهینه k در K-Means استفاده می‌کنیم که یک ابزار گرافیکی برای تعیین تعداد بهینه خوشه‌ها (k) در K-Means است.

پیاده‌سازی خوشه‌بندی K-Means در پایتون

ما از مجموعه داده make_blobs استفاده خواهیم کرد و نحوه ایجاد خوشه‌ها را نشان خواهیم داد.

مرحله 1: وارد کردن کتابخانه‌های لازم ما Numpy، Matplotlib و scikit-learn را وارد می‌کنیم.

Python

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

مرحله 2: ایجاد مجموعه داده سفارشی با make_blobs و رسم آن

Python

X, y = make_blobs(n_samples = 500, n_features = 2, centers = 3, random_state = 23)
fig = plt.figure(0)
plt.grid(True)
plt.scatter(X[:,0], X[:,1])
plt.show()

خروجی:

خوشه‌بندی K-Means

مرحله 3: مقداردهی اولیه سنترویدهای تصادفی این کد سه خوشه را برای خوشه‌بندی K-means مقداردهی اولیه می‌کند. یک seed تصادفی را تنظیم کرده و مراکز خوشه تصادفی را در یک محدوده مشخص تولید می‌کند و یک لیست خالی از نقاط برای هر خوشه ایجاد می‌کند.

Python

k = 3
clusters = {}
np.random.seed(23)
for idx in range(k):
    # center = 2*(2*np.random.random((X.shape,))-1) # Original code had an error here for center shape
    # The center should be 1D array, representing coordinates of one centroid
    center = X[np.random.randint(X.shape[0]), :] # A common way: pick random points from X as initial centers
    points = []
    cluster = {
        'center' : center,
        'points' : []
    }
    clusters[idx] = cluster
# print(clusters) # Uncomment to see the initial clusters structure

خروجی:

خوشه‌بندی K-Means

مرحله 4: رسم مرکز مقداردهی اولیه تصادفی با نقاط داده

Python

plt.scatter(X[:,0], X[:,1])
plt.grid(True)
for i in clusters:
    center = clusters[i]['center']
    plt.scatter(center[0], center[1], marker = '*', c = 'red', s=200) # s=200 for larger marker size
plt.show()

خروجی:

خوشه‌بندی K-Means

نمودار، یک نمودار پراکندگی از نقاط داده (X[:,0], X[:,1]) با خطوط شبکه‌ای را نمایش می‌دهد. همچنین مراکز خوشه اولیه (ستاره‌های قرمز) که برای خوشه‌بندی K-means تولید شده‌اند را علامت‌گذاری می‌کند.

مرحله 5: تعریف فاصله اقلیدسی

Python

def distance(p1,p2):
    return np.sqrt(np.sum((p1-p2)**2))

مرحله 6: ایجاد تابع Assign و Update مرکز خوشه این مرحله، نقاط داده را به نزدیک‌ترین مرکز خوشه اختصاص می‌دهد و مرحله M، مراکز خوشه را بر اساس میانگین نقاط اختصاص داده شده در خوشه‌بندی K-means به‌روزرسانی می‌کند.

Python

def assign_clusters(X, clusters):
    # Clear previous assignments
    for i in range(len(clusters)):
        clusters[i]['points'] = []

    for idx in range(X.shape[0]): # Iterate over data points
        dist = []
        curr_x = X[idx]
        for i in range(k):
            dis = distance(curr_x, clusters[i]['center'])
            dist.append(dis)
        curr_cluster = np.argmin(dist)
        clusters[curr_cluster]['points'].append(curr_x)
    return clusters

def update_clusters(clusters): # X is not needed here
    for i in range(k):
        points = np.array(clusters[i]['points'])
        if points.shape[0] > 0: # Check if points list is not empty
            new_center = points.mean(axis = 0)
            clusters[i]['center'] = new_center
        # clusters[i]['points'] = [] # Points are cleared in assign_clusters
    return clusters

مرحله 7: ایجاد تابع برای پیش‌بینی خوشه برای نقاط داده

Python

def pred_cluster(X, clusters):
    pred = []
    for i in range(X.shape[0]):
        dist = []
        for j in range(k):
            dist.append(distance(X[i],clusters[j]['center']))
        pred.append(np.argmin(dist))
    return pred

مرحله 8: اختصاص، به‌روزرسانی و پیش‌بینی مرکز خوشه

Python

# Run K-means algorithm for a few iterations
for _ in range(10): # Example: 10 iterations
    clusters = assign_clusters(X, clusters)
    clusters = update_clusters(clusters)

pred = pred_cluster(X, clusters)

مرحله 9: رسم نقاط داده با مرکز خوشه پیش‌بینی شده آن‌ها

Python

plt.scatter(X[:,0], X[:,1], c = pred)
for i in clusters:
    center = clusters[i]['center']
    plt.scatter(center[0], center[1], marker = '^', c = 'red', s=200) # s=200 for larger marker size
plt.show()

خروجی:

خوشه‌بندی K-Means

نمودار، نقاط داده را که با خوشه‌های پیش‌بینی شده‌شان رنگ‌آمیزی شده‌اند، نشان می‌دهد. نشانگرهای قرمز، مراکز خوشه به‌روزرسانی شده پس از مراحل E-M در الگوریتم خوشه‌بندی K-means را نشان می‌دهند.

مقاله های مرتبط:

1- نحوه محاسبه میانگین متحرک نمایی (EMA) در پایتون

2- مدل ARIMA برای پیش بینی سری های زمانی در پایتون

3- نحوه اجرای رگرسیون چند جمله ای در پایتون

4-داشبورد سازی در نرم افزار تبلو و تجسم داده ها

 

download tableau desktop

 

 

امتیاز دهید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

سبد خرید