خوشه بندی چیست؟
خوشه بندی مجموعه ای از روش ها و تکنیک ها است که برای تقسیم داده ها به چند گروه یا خوشه استفاده می شود. خوشه ها به صورت گروهی از اشیاء داده تعریف می شوند که بیشترین شباهت به اشیاء موجود در خوشه خود را دارند. در عمل، خوشه بندی به شناسایی دو اصل در کیفیت داده کمک می کند:
- معنی دار بودن Meaningfulness
- مفید بودن Usefulness
در حالت معنادار بودن می توان گفت، خوشه بندی به گسترش حوزه یک دانش کمک می کند. به عنوان نمونه، در زمینه پزشکی، محققان، خوشه بندی را در آزمایش های ژنتیک برای خوشه بندی گروهی از بیماران را که به درمان های دارویی متفاوت پاسخ می دهند، بکار می گیرند.
در طرف مقابل، خوشه بندی در مفهوم مفید بودن قرار دارد که به عنوان یک مرحله میانی در pipeline داده عمل می کند. به عنوان نمونه، در تجزیه و تحلیل یک کسب و کار می توان از خوشه بندی برای تقسیم بندی مشتریان استفاده کرد. نتایج خوشه بندی، مشتریان را به گروه هایی با سابقه خرید مشابه تقسیم می کند، که صاحبان کسب و کار می توانند از آنها برای ایجاد کمپین های تبلیغاتی هدفمند استفاده کنند.
بسیاری از کاربردهای دیگر خوشه بندی مانند خوشه بندی اسناد و تجزیه و تحلیل شبکه های اجتماعی نیز وجود دارد و در کل می توان گفت برای متخصصانی که با داده ها در هر زمینه ای کار می کنند، خوشه بندی یک مهارت ارزشمند است.
نحوه انجام خوشه بندی K-Means در پایتون
در این بخش از آموزش پایتون پیشرفته، گام به گام، الگوریتم k-means را مرور می کنیم. درک جزئیات الگوریتم یک گام اساسی در روند نوشتن خوشه بندی k-means در پایتون است. آنچه در این بخش می آموزید به شما کمک می کند تصمیم بگیرید که آیا k-means انتخاب درستی برای حل مسئله خوشه بندی شما است؟
آشنایی با الگوریتم K-Means
درک الگوریتم K-Means فقط به چند مرحله نیاز دارد. اولین قدم این است که k centroids را به طور تصادفی انتخاب کنید، که در آن k برابر با تعداد خوشه هایی است که انتخاب می کنید و Centroids نقاط داده ای هستند که مرکز یک خوشه را نشان می دهند. خوشبختانه، سایت فرادرس در این لینک (+) مقاله ای را تحت عنوان خوشه بندی k میانگین (k-means Clustering) — به همراه کدهای R را منتشر کرده است که مطالعه آن به شما توصیه می شود.
عنصر اصلی الگوریتم با یک فرآیند دو مرحله ای به نام حداکثر انتظار expectation-maximization انجام می شود. مرحله انتظار یا expectation هر نقطه داده را به نزدیکترین مرکز خود اختصاص می دهد. سپس، مرحله حداکثر سازی میانگین تمام نقاط برای هر خوشه را محاسبه کرده و مرکز جدید یا همان centroid را تنظیم می کند. نسخه اصلی الگوریتم k-means به صورت زیر است:
کیفیت تخصیص های خوشه بندی با محاسبه مجموع خطای مربعات (SSE) پس از همگرایی centroids یا مطابقت با تکرار قبلی تعیین می شود. SSE به عنوان مجموع فاصله های اقلیدسی مربعات هر نقطه تا نزدیکترین مرکز آن تعریف می شود. از آنجا که این اندازه گیری خطا است، هدف k-means تلاش برای به حداقل رساندن این مقدار است.
شکل زیر centroids و SSE را که در پنج تکرارT از دو مرحله مختلف الگوریتم k-means در یک مجموعه داده یکسان را نشان می دهد:
هدف از این شکل در آموزش پایتون پیشرفته، نشان دادن این مفهوم است که مقداردهی اولیه centroids یک گام اساسی و مهم در الگوریتم k-means است. همچنین استفاده از SSE به عنوان معیاری برای عملکرد خوشه بندی مهم جلوه می دهد. پس انتخاب تعداد خوشه و centroids اولیه، مرحله حداکثر سازی انتظارات را تکرار می کند تا زمانی که موقعیت های مرکزی به همگرایی برسند و بدون تغییر باقی بماند.
مرحله راه اندازی تصادفی باعث می شود که الگوریتم k-means غیر تعیین کننده نباشد، بدین معنا که اگر یک الگوریتم یکسان را دو بار روی یک مجموعه داده یکسان اجرا کند، تخصیص خوشه ها متفاوت خواهد بود. در عمل محققان معمولاً چندین مقداردهی اولیه از کل الگوریتم k-means را اجرا می کنند و تخصیص خوشه را از مقداردهی اولیه با کمترین SSE انتخاب می کنند.
پیاده سازی کد خوشه بندی k-means در پایتون
خوشبختانه، پیاده سازی خوشه بندی k-means در پایتون در بسته محبوب یادگیری ماشین scikit-learn وجود دارد. در آموزش پایتون پیشرفته با نحوه نوشتن و پیاده سازی عملی الگوریتم k-means با استفاده از کتابخانه scikit-learn آشنا خواهید شد.
کدهای موجود در این آموزش به برخی از بسته های خارجی پایتون نیاز دارد و فرض می شود که شما پایتون با Anaconda را نصب کرده اید. برای کسب اطلاعات بیشتر در مورد تنظیم محیط پایتون برای یادگیری ماشین در ویندوز، راه اندازی پایتون برای یادگیری ماشین در Windows را مطالعه کنید.
در غیر این صورت، می توانید با نصب بسته های مورد نیاز شروع کنید:
(base) $ conda install matplotlib numpy pandas seaborn scikit-learn ipython (base) $ conda install -c conda-forge kneed
در این مرحله ماژول های مورد نیاز برای کد های این بخش import می شوند. در یادگیری پایتون پیشرفته به نحوه صحیح import کردن توابع یادگیری ماشین دقت کنید:
import matplotlib.pyplot as plt from kneed import KneeLocator from sklearn.datasets import make_blobs from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score from sklearn.preprocessing import StandardScaler
شما می توانید داده ها را از GIF فوق با استفاده از ()make_blobs تولید کنید، یک تابع راحت در scikit-learning که برای ایجاد خوشه های مصنوعی استفاده می شود. ()make_blobs از پارامترهای زیر استفاده می کند:
- n_samples: تعداد کل نمونه هایی است که باید تولید شود.
- centers: تعداد مراکزی است که باید ایجاد شود.
- cluster_std: انحراف استاندارد است.
- random_state: یک مقدار مقدار تصادفی است.
()make_blobs تابعی است که دو مقدار را برمی گرداند:
- یک آرایه NumPy دو بعدی با مقادیر x- و y برای هر یک از نمونه ها
- یک آرایه NumPy تک بعدی شامل برچسب های خوشه برای هر نمونه
ایجاد داده ها و برچسب های مصنوعی:
features, true_labels = make_blobs( n_samples=200, centers=3, cluster_std=2.75, random_state=42 )
بازتولید الگوریتم های غیرقطعی یادگیری ماشین مانند k-means دشوار است. پارامتر random_state روی یک عدد صحیح تنظیم شده است تا بتوانید داده های ارائه شده در آموزش را دنبال کنید. در عمل ، بهتر است random_state را به عنوان مقدار پیش فرض، None بگذارید.
در این بخش از آموزش پایتون پیشرفته نگاهی به پنج عنصر اول برای هر یک از متغیرهای return شده توسط تابع ()make_blobs می اندازیم:
In [3]: features[:5] Out[3]: array([[ 9.77075874, 3.27621022], [ -۹.۷۱۳۴۹۶۶۶, ۱۱.۲۷۴۵۱۸۰۲], [ -۶.۹۱۳۳۰۵۸۲, -۹.۳۴۷۵۵۹۱۱], [-۱۰.۸۶۱۸۵۹۱۳, -۱۰.۷۵۰۶۳۴۹۷], [ -۸.۵۰۰۳۸۰۲۷, -۴.۵۴۳۷۰۳۸۳]]) In [4]: true_labels[:5] Out[4]: array([1, 0, 2, 2, 2])
مجموعه داده ها معمولاً حاوی ویژگی های عددی هستند که در واحدهای مختلف اندازه گیری شده اند، مانند قد (اینچ) و وزن (پوند). یک الگوریتم یادگیری ماشین وزن را مهمتر از قد می داند زیرا مقادیر وزن بزرگتر هستند و تنوع بالاتری از فرد به فرد دیگر دارند.
الگوریتم های یادگیری ماشین باید همه ویژگی ها را در یک زمین بازی یکنواخت در نظر بگیرند. این بدان معناست که مقادیر همه ویژگی ها باید به مقیاس یکسان تبدیل شوند. برای دسترسی به آموزش الگوریتم های یادگیری ماشین، به لینک زیر از وبسایت فرادرس مراجعه نمایید.
فرآیند تبدیل ویژگی های عددی برای استفاده از مقیاس یکسان، مقیاس بندی ویژگی نامیده می شود. این عمل، یک مرحله پیش پردازش مهم داده برای اکثر الگوریتم های یادگیری ماشین است زیرا می تواند تأثیر قابل توجهی بر عملکرد الگوریتم شما داشته باشد.
روش های مختلفی برای پیاده سازی مقیاس ویژگی وجود دارد. در این مثال، از کلاس StandardScaler استفاده خواهید کرد. این کلاس نوعی مقیاس بندی ویژگی ها را به نام استانداردسازی پیاده سازی می کند. مقیاس های استاندارد یا تغییر مقادیر برای هر ویژگی عددی در مجموعه داده شما به طوری که ویژگی ها دارای میانگین ۰ و انحراف استاندارد ۱ هستند:
scaler = StandardScaler() scaled_features = scaler.fit_transform(features)
نگاهی به نحوه مقیاس بندی مقادیر در scaled_features بیندازید:
In [6]: scaled_features[:5] Out[6]: array([[ 2.13082109, 0.25604351], [-۱.۵۲۶۹۸۵۲۳, ۱.۴۱۰۳۶۷۴۴], [-۱.۰۰۱۳۰۱۵۲, -۱.۵۶۵۸۳۱۷۵], [-۱.۷۴۲۵۶۸۹۱, -۱.۷۶۸۳۲۵۰۹], [-۱.۲۹۹۲۴۵۲۱, -۰.۸۷۲۵۳۴۴۶]])
اکنون داده ها آماده خوشه بندی هستند. کلاس برآوردگر KMeans در scikit-learning جایی است که شما پارامترهای الگوریتم را قبل از برآوردگر به داده ها وصل می کنید. اجرای scikit-learn انعطاف پذیر است و چندین پارامتر قابل تنظیم را ارائه می دهد.
در اینجا پارامترهای مورد استفاده در این مثال آمده است:
- init تکنیک مقداردهی اولیه را کنترل می کند. نسخه استاندارد الگوریتم k-means با تنظیم init روی “تصادفی” پیاده سازی می شود. تنظیم این حالت بر روی “k-means ++” از یک ترفند پیشرفته برای تسریع همگرایی استفاده می کند که بعداً از آن استفاده خواهید کرد.
- n_clusters k برای مرحله خوشه بندی تنظیم می کند. این مهمترین پارامتر برای k-means است.
- n_init تعداد مقداردهی اولیه را برای انجام کار تعیین می کند. این مهم است زیرا دو اجرا می توانند در تخصیص خوشه های مختلف به هم نزدیک شوند. رفتار پیش فرض الگوریتم scikit-learning این است که ده بار k-mean اجرا کرده و نتایج حاصل از کمترین SSE را برگرداند.
- max_iter تعداد حداکثر تکرارها را برای هر مقداردهی اولیه الگوریتم k-means تعیین می کند.
کلاس KMeans را با آرگومان های زیر در نظر داشته باشید:
kmeans = KMeans( init="random", n_clusters=3, n_init=10, max_iter=300, random_state=42 )
نام پارامترها با زبانی که برای توصیف الگوریتم k-means در اوایل آموزش پایتون پیشرفته استفاده شد مطابقت دارد. اکنون که کلاس k-means آماده است، گام بعدی این است که آن را در داده های scaled_features متناسب کنید. با این کار ده بار الگوریتم k-means روی داده های شما با حداکثر ۳۰۰ تکرار در هر اجرا، اجرا می شود:
In [8]: kmeans.fit(scaled_features) Out[8]: KMeans(init='random', n_clusters=3, random_state=42)
آمار مربوط به مقداردهی اولیه با کمترین SSE به عنوان ویژگی kmeans پس از فراخوانی ()fit. در دسترس است:
# The lowest SSE value kmeans.inertia_ # Final locations of the centroid kmeans.cluster_centers_ # The number of iterations required to converge kmeans.n_iter_
در نهایت، تخصیص خوشه به عنوان یک آرایه NumPy تک بعدی در kmeans.labels_ ذخیره می شود. در اینجا نگاهی به پنج برچسب پیش بینی شده اول می اندازیم:
In [12]: kmeans.labels_[:5] Out[12]: array([0, 1, 2, 2, 2], dtype=int32)
توجه داشته باشید که ترتیب برچسب های خوشه برای دو شیء اول داده، flip شده است. این ترتیب در true_labels [1 ، ۰] در kmeans.labels_ [0 ، ۱] بود، اگرچه این اشیاء داده هنوز در خوشه های اصلی خود در kmeans.lables_ عضو هستند. این رفتار طبیعی است، زیرا ترتیب برچسب های خوشه بندی به مقداردهی اولیه بستگی دارد. خوشه ۰ از اولین اجرا می تواند در مرحله دوم خوشه ۱ و برعکس برچسب گذاری شود. این کار بر معیارهای ارزیابی خوشه بندی تأثیر نمی گذارد.
انتخاب تعداد مناسب خوشه ها
در این بخش از آموزش پایتون پیشرفته، شما دو روش را که معمولاً برای ارزیابی تعداد مناسب خوشه ها استفاده می شود، مشاهده می کنید:
- روش آرنج یا elbow
- ضریب silhouette
این روش ها اغلب به عنوان تکنیک های ارزیابی مکمل استفاده می شوند تا اینکه یکی بر دیگری ترجیح داده شود. برای انجام روش elbow، چندین k-means را اجرا کنید، با هر تکرار k را افزایش دهید و SSE را ثبت کنید:
kmeans_kwargs = { "init": "random", "n_init": 10, "max_iter": 300, "random_state": 42, } # A list holds the SSE values for each k sse = [] for k in range(1, 11): kmeans = KMeans(n_clusters=k, **kmeans_kwargs) kmeans.fit(scaled_features) sse.append(kmeans.inertia_)
وقتی SSE را به عنوان تابعی از تعداد خوشه ها ترسیم می کنید، توجه داشته باشید که با افزایش k ، SSE همچنان در حال کاهش است. با افزودن centroids بیشتر، فاصله هر نقطه تا نزدیکترین مرکز آن کاهش می یابد. یک نقطه همگرایی وجود دارد که در آن منحنی SSE شروع به خم شدن می کند و به آن نقطه آرنج یا elbow می گویند. تصور می شود که مقدار x این نقطه یک معامله منطقی بین خطا و تعداد خوشه ها است. در این مثال ، elbow در x = 3 قرار دارد:
plt.style.use("fivethirtyeight") plt.plot(range(1, 11), sse) plt.xticks(range(1, 11)) plt.xlabel("Number of Clusters") plt.ylabel("SSE") plt.show()
تعیین نقطه elbow در منحنی SSE همیشه ساده نیست. اگر در انتخاب نقطه elbow منحنی مشکل دارید، می توانید از بسته پایتون، kneed، برای تعیین نقطه elbow به صورت زیر استفاده کنید:
kl = KneeLocator( range(1, 11), sse, curve="convex", direction="decreasing" ) kl.elbow
ضریب silhouette انسجام و جداسازی خوشه است. بر اساس دو عامل، میزان مناسب بودن یک نقطه داده در خوشه اختصاص داده شده را تعیین می کند:
- نقطه داده چقدر به سایر نقاط خوشه نزدیک است.
- فاصله داده ها از نقاط موجود در خوشه های دیگر چقدر است.
مقادیر ضریب Silhouette بین -۱ تا ۱ متغیر است. اعداد بزرگتر نشان می دهد که نمونه ها به خوشه های خود نزدیکتر از سایر خوشه ها هستند. در اجرای یادگیری ضریب Silhouette، میانگین ضریب Silhouette همه نمونه ها در یک مقدار خلاصه می شود.
دوباره مقادیر k را حلقه کنید. این بار، به جای محاسبه SSE ، ضریب Silhouette را محاسبه کنید:
# A list holds the silhouette coefficients for each k silhouette_coefficients = [] # Notice you start at 2 clusters for silhouette coefficient for k in range(2, 11): kmeans = KMeans(n_clusters=k, **kmeans_kwargs) kmeans.fit(scaled_features) score = silhouette_score(scaled_features, kmeans.labels_) silhouette_coefficients.append(score)
ترسیم میانگین امتیاز Silhouette برای هر k نشان می دهد که بهترین گزینه برای k=3 است زیرا حداکثر امتیاز را دارد:
plt.style.use("fivethirtyeight") plt.plot(range(2, 11), silhouette_coefficients) plt.xticks(range(2, 11)) plt.xlabel("Number of Clusters") plt.ylabel("Silhouette Coefficient") plt.show()
کد بالا نمودار زیر را تولید می کند:
در نهایت، تصمیم شما در مورد تعداد خوشه ها برای استفاده باید ترکیبی از دانش حوزه و معیارهای ارزیابی خوشه بندی باشد. در این پست آموزش پایتون پیشرفته – راهنمایی عملی خوشه بندی K-Means در پایتون توضیح داده شد و منابع مهم آموزشی برای یادگیری شما عزیزان قید شد. پیشنهاد می کنیم فرصت های شغلی برنامه نویسی پایتون – معرفی ۱۰ شغل مهم و پردرآمد برنامه نویسی پایتون را نیز مطالعه کنید تا بیشتر به مزایای زبان برنامه نویسی پایتون علاقه مند شوید. منتظر نظرات و پیشنهادات شما هستیم. موفق و پیروز باشید.