K-Means Clustering — це алгоритм неконтрольованого навчання, який використовується для вирішення проблем кластеризації в машинному навчанні або науці про дані. У цій темі ми дізнаємося, що таке алгоритм кластеризації K-means, як працює алгоритм, а також реалізацію кластеризації k-means на Python.
Що таке алгоритм K-Means?
Кластеризація K-Means є Алгоритм неконтрольованого навчання , який групує непозначений набір даних у різні кластери. Тут K визначає кількість заздалегідь визначених кластерів, які необхідно створити в процесі, наприклад, якщо K=2, буде два кластери, а для K=3 буде три кластери і так далі.
Це ітераційний алгоритм, який розділяє набір даних без міток на k різних кластерів таким чином, що кожен набір даних належить лише одній групі зі схожими властивостями.
Це дозволяє нам кластеризувати дані в різні групи та є зручним способом самостійного виявлення категорій груп у немаркованому наборі даних без необхідності навчання.
Це алгоритм на основі центроїда, де кожен кластер пов’язаний із центроїдом. Основною метою цього алгоритму є мінімізація суми відстаней між точкою даних і відповідними кластерами.
Алгоритм приймає набір даних без міток як вхідні дані, ділить набір даних на k-кількість кластерів і повторює процес, доки не знайде найкращі кластери. Значення k має бути заздалегідь визначене в цьому алгоритмі.
K-середнє кластеризація алгоритм в основному виконує два завдання:
- Визначає найкраще значення для K центральних точок або центроїдів за допомогою ітераційного процесу.
- Призначає кожну точку даних найближчому k-центру. Ті точки даних, які знаходяться поблизу певного k-центру, створюють кластер.
Таким чином, кожен кластер має точки даних з деякими спільними рисами, і він знаходиться далеко від інших кластерів.
На діаграмі нижче пояснюється робота алгоритму кластеризації K-середніх:
Як працює алгоритм K-Means?
Нижче описано роботу алгоритму K-Means.
Крок 1: Виберіть число K, щоб визначити кількість кластерів.
Крок 2: Виберіть випадкові точки K або центроїди. (Це може бути інше з вхідного набору даних).
отримати довжину масиву в c
Крок 3: Призначте кожну точку даних найближчому центроїду, який сформує попередньо визначені K кластерів.
Крок 4: Обчисліть дисперсію та розмістіть новий центроїд кожного кластера.
Крок 5: Повторіть третій крок, що означає перепризначення кожної точки даних новому найближчому центроїду кожного кластера.
Крок 6: Якщо відбувається будь-яке перепризначення, перейдіть до кроку 4, інакше перейдіть до FINISH.
Крок-7 : Модель готова.
Давайте розберемо наведені вище кроки, розглянувши візуальні графіки:
Припустимо, у нас є дві змінні M1 і M2. Нижче наведено графік розкиду цих двох змінних по осі x-y:
- Візьмемо число k кластерів, тобто K=2, щоб ідентифікувати набір даних і помістити їх у різні кластери. Це означає, що тут ми спробуємо згрупувати ці набори даних у два різні кластери.
- Нам потрібно вибрати кілька випадкових k точок або центроїд, щоб сформувати кластер. Ці точки можуть бути або точками з набору даних, або будь-якою іншою точкою. Отже, ми вибираємо наведені нижче дві точки як k точок, які не є частиною нашого набору даних. Розгляньте зображення нижче:
- Тепер ми призначимо кожну точку даних діаграми розсіювання її найближчій К-точці або центроїду. Ми обчислимо його, застосовуючи деяку математику, яку ми вивчали, щоб обчислити відстань між двома точками. Отже, ми проведемо медіану між обома центроїдами. Розгляньте зображення нижче:
З наведеного вище зображення видно, що точки ліворуч від лінії знаходяться поблизу K1 або синього центроїда, а точки праворуч від лінії розташовані близько до жовтого центроїда. Розфарбуємо їх у синій і жовтий колір для чіткої візуалізації.
- Оскільки нам потрібно знайти найближчий кластер, ми повторимо процес вибору новий центроїд . Щоб вибрати нові центроїди, ми обчислимо центр тяжіння цих центроїдів і знайдемо нові центроїди, як показано нижче:
- Далі ми перепризначимо кожну точку даних новому центроїду. Для цього ми повторимо той самий процес пошуку середньої лінії. Медіана буде схожа на зображення нижче:
На наведеному вище зображенні ми бачимо, що одна жовта точка знаходиться ліворуч від лінії, а дві сині точки розташовані праворуч від лінії. Отже, ці три точки будуть призначені новим центроїдам.
Оскільки відбулося перепризначення, ми знову перейдемо до кроку 4, який полягає у пошуку нових центроїдів або K-точок.
- Ми повторимо процес, знайшовши центр ваги центроїдів, тому нові центроїди будуть такими, як показано на зображенні нижче:
- Оскільки ми отримали нові центроїди, знову проведемо середню лінію та перепризначимо точки даних. Отже, зображення буде таким:
- Ми можемо бачити на зображенні вище; по обидва боки від лінії немає різних точок даних, що означає, що наша модель сформована. Розгляньте зображення нижче:
Оскільки наша модель готова, тепер ми можемо видалити передбачувані центроїди, і два останніх кластери будуть такими, як показано на зображенні нижче:
Як вибрати значення «K кількості кластерів» у K-means Clustering?
Продуктивність алгоритму кластеризації K-середніх залежить від високоефективних кластерів, які він формує. Але підібрати оптимальну кількість кластерів – велике завдання. Існують різні способи визначення оптимальної кількості кластерів, але тут ми обговорюємо найбільш відповідний метод визначення кількості кластерів або значення K. Метод наведено нижче:
Ліктьовий метод
Метод Elbow є одним із найпопулярніших способів знайти оптимальну кількість кластерів. Цей метод використовує концепцію значення WCSS. WCSS виступає за Сума квадратів у кластері , який визначає загальні варіації в межах кластера. Формула для розрахунку значення WCSS (для 3 кластерів) наведена нижче:
WCSS= ∑Пя в кластері1відстань (PiC1)2+∑Пя в Cluster2відстань (PiC2)2+∑Пя в CLuster3відстань (PiC3)2У наведеній вище формулі WCSS,
∑Пя в кластері1відстань (PiC1)2: це сума квадратів відстаней між кожною точкою даних і її центроїдом у кластері1 та те саме для двох інших членів.
Щоб виміряти відстань між точками даних і центроїдом, ми можемо використовувати будь-який метод, наприклад евклідову відстань або манхеттенську відстань.
переваги та недоліки техніки
Щоб знайти оптимальне значення кластерів, метод ліктя виконує такі кроки:
- Він виконує кластеризацію K-середніх на заданому наборі даних для різних значень K (діапазони від 1 до 10).
- Для кожного значення K обчислюється значення WCSS.
- Будує криву між обчисленими значеннями WCSS і кількістю кластерів K.
- Гостра точка вигину або точка графіка виглядає як плече, тоді ця точка вважається найкращим значенням K.
Оскільки графік показує різкий вигин, який виглядає як лікоть, тому він відомий як метод ліктя. Графік для методу ліктя виглядає як на зображенні нижче:
Примітка. Ми можемо вибрати кількість кластерів, що дорівнює заданим точкам даних. Якщо ми вибираємо кількість кластерів, що дорівнює точкам даних, тоді значення WCSS стає нульовим, і це буде кінцева точка графіка.
Реалізація на Python алгоритму кластеризації K-середніх
У наведеному вище розділі ми обговорювали алгоритм K-середніх, тепер давайте подивимося, як його можна реалізувати за допомогою Python .
Перед реалізацією давайте розберемося, який тип проблеми ми будемо тут вирішувати. Отже, у нас є набір даних Торговий центр_Клієнти , що є даними клієнтів, які відвідують торговий центр і витрачають там гроші.
У наведеному наборі даних ми маємо Customer_Id, стать, вік, річний дохід ($) і показник витрат (що є розрахованим значенням того, скільки клієнт витратив у торговому центрі, чим більше значення, тим більше він витратив). З цього набору даних нам потрібно обчислити деякі моделі, оскільки це неконтрольований метод, тому ми не знаємо, що саме обчислювати.
Нижче наведено кроки, яких необхідно виконати для впровадження:
Крок 1: Крок попередньої обробки даних
Першим кроком буде попередня обробка даних, як ми робили в наших попередніх темах регресії та класифікації. Але проблема кластеризації буде відрізнятися від інших моделей. Давайте обговоримо це:
Як і в попередніх темах, спочатку ми імпортуємо бібліотеки для нашої моделі, що є частиною попередньої обробки даних. Код наведено нижче:
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd
У наведеному вище коді numpy ми імпортували для виконання математичних розрахунків, matplotlib призначений для побудови графіка, і панди призначені для керування набором даних.
найкрасивіша усмішка в світі
Далі ми імпортуємо набір даних, який нам потрібно використовувати. Отже, тут ми використовуємо набір даних Mall_Customer_data.csv. Його можна імпортувати за допомогою наведеного нижче коду:
# Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv')
Виконуючи наведені вище рядки коду, ми отримаємо наш набір даних у Spyder IDE. Набір даних виглядає так, як показано на зображенні нижче:
З наведеного вище набору даних нам потрібно знайти в ньому деякі закономірності.
Тут нам не потрібна залежна змінна для етапу попередньої обробки даних, оскільки це проблема кластеризації, і ми не маємо уявлення про те, що визначати. Тому ми просто додамо рядок коду для матриці функцій.
x = dataset.iloc[:, [3, 4]].values
Як бачимо, видобуваємо лише 3rdі 4тисфункція. Це тому, що нам потрібен двовимірний графік для візуалізації моделі, а деякі функції не потрібні, наприклад customer_id.
Крок 2: Знаходження оптимальної кількості кластерів методом ліктя
На другому кроці ми спробуємо знайти оптимальну кількість кластерів для нашої задачі кластеризації. Отже, як обговорювалося вище, тут ми збираємося використовувати метод ліктя для цієї мети.
Як ми знаємо, метод ліктя використовує концепцію WCSS для малювання графіка, відкладаючи значення WCSS на вісь Y і кількість кластерів на вісь X. Отже, ми обчислимо значення для WCSS для різних значень k у діапазоні від 1 до 10. Нижче наведено його код:
#finding optimal number of clusters using the elbow method from sklearn.cluster import KMeans wcss_list= [] #Initializing the list for the values of WCSS #Using for loop for iterations from 1 to 10. for i in range(1, 11): kmeans = KMeans(n_clusters=i, init='k-means++', random_state= 42) kmeans.fit(x) wcss_list.append(kmeans.inertia_) mtp.plot(range(1, 11), wcss_list) mtp.title('The Elobw Method Graph') mtp.xlabel('Number of clusters(k)') mtp.ylabel('wcss_list') mtp.show()
Як ми бачимо в коді вище, ми використали KMeans клас sklearn. бібліотека кластерів для формування кластерів.
Далі ми створили wcss_list змінна для ініціалізації порожнього списку, який використовується для зберігання значення wcss, обчисленого для різних значень k у діапазоні від 1 до 10.
Після цього ми ініціалізували цикл for для ітерації з іншим значенням k у діапазоні від 1 до 10; оскільки цикл for у Python виключає вихідний ліміт, тому він приймається як 11, щоб включити 10тисзначення.
Інша частина коду подібна до тієї, яку ми робили в попередніх темах, оскільки ми підігнали модель на матрицю функцій, а потім побудували графік між кількістю кластерів і WCSS.
Вихід: Після виконання наведеного вище коду ми отримаємо наступний результат:
З наведеного вище графіка ми бачимо, що точка ліктя знаходиться в 5. Отже, кількість кластерів тут буде 5.
Крок 3: Навчання алгоритму K-середніх на навчальному наборі даних
Оскільки ми отримали кількість кластерів, тепер ми можемо навчити модель на наборі даних.
Щоб навчити модель, ми будемо використовувати ті самі два рядки коду, які ми використовували в розділі вище, але тут замість використання i ми будемо використовувати 5, оскільки ми знаємо, що потрібно сформувати 5 кластерів. Код наведено нижче:
#training the K-means model on a dataset kmeans = KMeans(n_clusters=5, init='k-means++', random_state= 42) y_predict= kmeans.fit_predict(x)
Перший рядок такий самий, як і вище, для створення об’єкта класу KMeans.
карта reactjs
У другому рядку коду ми створили залежну змінну y_predict тренувати модель.
Виконуючи наведені вище рядки коду, ми отримаємо змінну y_predict. Ми можемо перевірити це під провідник змінних у Spyder IDE. Тепер ми можемо порівняти значення y_predict з нашим вихідним набором даних. Розгляньте зображення нижче:
З наведеного вище зображення тепер ми можемо визначити, що CustomerID 1 належить до кластеру
3 (оскільки індекс починається з 0, тому 2 вважатиметься 3), а 2 належить кластеру 4 і так далі.
Крок 4: Візуалізація кластерів
Останнім кроком є візуалізація кластерів. Оскільки у нас є 5 кластерів для нашої моделі, ми візуалізуємо кожен кластер один за іншим.
Для візуалізації кластерів буде використовуватися діаграма розсіювання за допомогою функції mtp.scatter() matplotlib.
#visulaizing the clusters mtp.scatter(x[y_predict == 0, 0], x[y_predict == 0, 1], s = 100, c = 'blue', label = 'Cluster 1') #for first cluster mtp.scatter(x[y_predict == 1, 0], x[y_predict == 1, 1], s = 100, c = 'green', label = 'Cluster 2') #for second cluster mtp.scatter(x[y_predict== 2, 0], x[y_predict == 2, 1], s = 100, c = 'red', label = 'Cluster 3') #for third cluster mtp.scatter(x[y_predict == 3, 0], x[y_predict == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4') #for fourth cluster mtp.scatter(x[y_predict == 4, 0], x[y_predict == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5') #for fifth cluster mtp.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroid') mtp.title('Clusters of customers') mtp.xlabel('Annual Income (k$)') mtp.ylabel('Spending Score (1-100)') mtp.legend() mtp.show()
У вищенаведених рядках коду ми написали код для кожного кластера в діапазоні від 1 до 5. Перша координата mtp.scatter, тобто x[y_predict == 0, 0], що містить значення x для показу матриці містить значення, а y_predict має значення від 0 до 1.
Вихід:
На вихідному зображенні чітко видно п’ять різних кластерів різного кольору. Кластери формуються між двома параметрами набору даних; Річний дохід клієнта та витрати. Ми можемо змінити кольори та етикетки відповідно до вимог чи вибору. Ми також можемо помітити деякі моменти з наведених вище моделей, які наведені нижче:
- Cluster2 показує, що клієнт має високий дохід, але низькі витрати, тому ми можемо класифікувати його як обережний .
- Кластер 3 показує низькі доходи, а також низькі витрати, тому їх можна віднести до категорії розумних.
- Cluster4 показує клієнтів з низьким доходом і дуже високими витратами, щоб їх можна класифікувати як необережний .
- Cluster5 показує клієнтів із високим доходом і великими витратами, тому їх можна класифікувати як цільових, і ці клієнти можуть бути найприбутковішими клієнтами для власника торгового центру.