K означає Clustering – Introduction
Кластеризація K-Means є Машинне навчання без нагляду алгоритм, який групує непозначений набір даних у різні кластери. Метою статті є вивчення основ і роботи кластеризації k середніх разом із реалізацією.
Зміст
- Що таке K-means Clustering?
- Яка мета кластеризації k-середніх?
- Як працює кластеризація k-середніх?
- Реалізація K-Means кластеризації в Python
Що таке K-means Clustering?
Машинне навчання без нагляду це процес навчання комп’ютера використанню немаркованих, несекретних даних і надання можливості алгоритму працювати з цими даними без нагляду. Без будь-якого попереднього навчання роботі з даними робота машини в цьому випадку полягає в тому, щоб організувати несортовані дані відповідно до паралелей, шаблонів і варіацій.
K означає кластеризацію, призначає точки даних одному з K кластерів залежно від їх відстані від центру кластерів. Він починається з випадкового призначення центроїда кластерів у просторі. Потім кожна точка даних призначається одному з кластерів на основі її відстані від центроїда кластера. Після призначення кожної точки одному з кластерів призначаються нові центроїди кластера. Цей процес виконується ітеративно, доки не буде знайдено хороший кластер. Під час аналізу ми припускаємо, що номер кластера задано заздалегідь, і ми повинні поставити точки в одну з груп.
У деяких випадках K не визначено чітко, і ми повинні думати про оптимальну кількість K. K означає, що кластеризація дає найкращі дані, добре розділені. Якщо точки даних перекриваються, ця кластеризація не підходить. K Means є швидшим порівняно з іншими методами кластеризації. Це забезпечує міцний зв’язок між точками даних. K означає, що кластер не надає чіткої інформації щодо якості кластерів. Різне початкове призначення центроїда кластера може призвести до різних кластерів. Крім того, алгоритм K Means чутливий до шуму. Можливо, він застряг у місцевих мінімумах.
Яка мета кластеризації k-середніх?
Мета кластеризація полягає в тому, щоб розділити населення або встановити точок даних у декілька груп, щоб точок даних у кожній групі було більше порівнянний один до одного та відрізняються від точок даних в інших групах. По суті, це групування речей на основі того, наскільки вони схожі та відмінні один від одного.
Як працює кластеризація k-середніх?
Нам надається набір даних елементів із певними ознаками та значеннями для цих ознак (як вектор). Завдання полягає в тому, щоб розділити ці предмети на групи. Щоб досягти цього, ми будемо використовувати алгоритм K-means, алгоритм неконтрольованого навчання. «K» у назві алгоритму представляє кількість груп/кластерів, у які ми хочемо класифікувати наші елементи.
(Допоможе, якщо ви розглядаєте елементи як точки в n-вимірному просторі). Алгоритм класифікує елементи в k груп або кластерів подібності. Щоб обчислити цю подібність, ми будемо використовувати евклідову відстань як вимірювання.
Алгоритм роботи наступний:
- Спочатку ми випадковим чином ініціалізуємо k точок, які називаються середніми або кластерними центроїдами.
- Ми класифікуємо кожен елемент відповідно до його найближчого середнього значення та оновлюємо координати середнього значення, які є середніми значеннями елементів, класифікованих у цьому кластері на даний момент.
- Ми повторюємо процес протягом заданої кількості ітерацій, і в кінці ми маємо наші кластери.
Точки, згадані вище, називаються середніми, оскільки вони є середніми значеннями елементів, класифікованих у них. Для ініціалізації цих засобів у нас є багато варіантів. Інтуїтивно зрозумілим методом є ініціалізація засобів у випадкових елементах у наборі даних. Інший метод полягає в ініціалізації середніх випадковими значеннями між межами набору даних (якщо для функції х, елементи мають значення в [0,3], ми ініціалізуємо середні значеннями для х при [0,3]).
Наведений вище алгоритм у псевдокоді виглядає наступним чином:
Initialize k means with random values -->Для заданої кількості ітерацій: --> Перейти до елементів: --> Знайти середнє значення, найближче до елемента, обчисливши евклідову відстань елемента за допомогою кожного із середніх --> Призначити елемент середньому --> Оновити середнє за зсуваючи його до середнього значення елементів у цьому кластері
Реалізація K-Means кластеризації в Python
Приклад 1
Імпортуйте необхідні бібліотеки
Ми імпортуємо Numpy для статистичних обчислень, Matplotlib побудувати сюжет графік, і make_blobs із sklearn.datasets.
Python3
import> numpy as np> import> matplotlib.pyplot as plt> from> sklearn.datasets> import> make_blobs> |
Створіть спеціальний набір даних за допомогою make_blobs і побудуйте його
Python3
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-середніх. Він встановлює випадкове початкове число та генерує випадкові центри кластерів у визначеному діапазоні та створює порожній список балів для кожного кластера.
Python3
k> => 3> clusters> => {}> np.random.seed(> 23> )> for> idx> in> range> (k):> > center> => 2> *> (> 2> *> np.random.random((X.shape[> 1> ],))> -> 1> )> > points> => []> > cluster> => {> > 'center'> : center,> > 'points'> : []> > }> > > clusters[idx]> => cluster> > clusters> |
Вихід:
{0: {'center': array([0.06919154, 1.78785042]), 'points': []}, 1: {'center': array([ 1.06183904, -0.87041662]), 'points': []}, 2: {'center': array([-1.11581855, 0.74488834]), 'points': []}} Побудуйте випадковий центр ініціалізації з точками даних
Python3
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'> )> plt.show()> |
Вихід :
Точки даних із випадковим центром
Діаграма відображає точкову діаграму точок даних (X[:,0], X[:,1]) із лініями сітки. Він також позначає початкові центри кластерів (червоні зірки), згенеровані для кластеризації K-середніх.
Дайте визначення евклідової відстані
Python3
def> distance(p1,p2):> > return> np.sqrt(np.> sum> ((p1> -> p2)> *> *> 2> ))> |
Створіть функцію для призначення та оновлення центру кластера
E-крок призначає точки даних найближчому центру кластера, а M-крок оновлює центри кластера на основі середнього значення призначених точок у кластеризації K-means.
Python3
#Implementing E step> def> assign_clusters(X, clusters):> > for> idx> in> range> (X.shape[> 0> ]):> > 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> > #Implementing the M-Step> def> update_clusters(X, clusters):> > for> i> in> range> (k):> > points> => np.array(clusters[i][> 'points'> ])> > if> points.shape[> 0> ]>> 0> :> > new_center> => points.mean(axis> => 0> )> > clusters[i][> 'center'> ]> => new_center> > > clusters[i][> 'points'> ]> => []> > return> clusters> |
Крок 7: Створіть функцію для прогнозування кластера для точок даних
Python3
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> |
Призначення, оновлення та прогнозування центру кластера
Python3
clusters> => assign_clusters(X,clusters)> clusters> => update_clusters(X,clusters)> pred> => pred_cluster(X,clusters)> |
Побудуйте точки даних із прогнозованим центром кластера
Python3
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'> )> plt.show()> |
Вихід :
K-означає кластеризацію
На графіку показано точки даних, забарвлені їх прогнозованими кластерами. Червоні маркери представляють оновлені центри кластерів після кроків E-M в алгоритмі кластеризації K-середніх.
Приклад 2
Імпортуйте необхідні бібліотеки
Python3
import> pandas as pd> import> numpy as np> import> seaborn as sns> import> matplotlib.pyplot as plt> import> matplotlib.cm as cm> from> sklearn.datasets> import> load_iris> from> sklearn.cluster> import> KMeans> |
Завантажте набір даних
Python3
X, y> => load_iris(return_X_y> => True> )> |
Ліктьовий метод
Знаходження ідеальної кількості груп для поділу даних є основним етапом будь-якого неконтрольованого алгоритму. Одним із найпоширеніших методів визначення цього ідеального значення k є підхід ліктя.
Python3
#Find optimum number of cluster> sse> => []> #SUM OF SQUARED ERROR> for> k> in> range> (> 1> ,> 11> ):> > km> => KMeans(n_clusters> => k, random_state> => 2> )> > km.fit(X)> > sse.append(km.inertia_)> |
Побудуйте графік Elbow, щоб знайти оптимальну кількість кластерів
Python3
sns.set_style(> 'whitegrid'> )> g> => sns.lineplot(x> => range> (> 1> ,> 11> ), y> => sse)> g.> set> (xlabel> => 'Number of cluster (k)'> ,> > ylabel> => 'Sum Squared Error'> ,> > title> => 'Elbow Method'> )> plt.show()> |
Вихід:
Ліктьовий метод
З наведеного вище графіка ми можемо спостерігати, що при k=2 і k=3 ситуація подібна до ліктя. Отже, ми розглядаємо K=3
Побудуйте модель кластеризації Kmeans
Python3
kmeans> => KMeans(n_clusters> => 3> , random_state> => 2> )> kmeans.fit(X)> |
Вихід:
KMeans KMeans(n_clusters=3, random_state=2)
Знайдіть центр кластера
Python3
kmeans.cluster_centers_> |
Вихід:
array([[5.006 , 3.428 , 1.462 , 0.246 ], [5.9016129 , 2.7483871 , 4.39354839, 1.43387097], [6.85 , 3.07368421, 5.74210526, 2.07105263]])
Передбачте кластерну групу:
Python3
pred> => kmeans.fit_predict(X)> pred> |
Вихід:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1], dtype=int32)
Побудуйте центр кластера з точками даних
Python3
plt.figure(figsize> => (> 12> ,> 5> ))> plt.subplot(> 1> ,> 2> ,> 1> )> plt.scatter(X[:,> 0> ],X[:,> 1> ],c> => pred, cmap> => cm.Accent)> plt.grid(> True> )> for> center> in> kmeans.cluster_centers_:> > center> => center[:> 2> ]> > plt.scatter(center[> 0> ],center[> 1> ],marker> => '^'> ,c> => 'red'> )> plt.xlabel(> 'petal length (cm)'> )> plt.ylabel(> 'petal width (cm)'> )> > plt.subplot(> 1> ,> 2> ,> 2> )> plt.scatter(X[:,> 2> ],X[:,> 3> ],c> => pred, cmap> => cm.Accent)> plt.grid(> True> )> for> center> in> kmeans.cluster_centers_:> > center> => center[> 2> :> 4> ]> > plt.scatter(center[> 0> ],center[> 1> ],marker> => '^'> ,c> => 'red'> )> plt.xlabel(> 'sepal length (cm)'> )> plt.ylabel(> 'sepal width (cm)'> )> plt.show()> |
Вихід:
K-означає кластеризацію
На підсхемі ліворуч відображається залежність довжини пелюстки від ширини пелюстки з точками даних, пофарбованими кластерами, а червоні маркери вказують на центри кластерів K-означає. Підграфіка справа показує довжину чашолистка проти ширини чашолистка так само.
Висновок
Підсумовуючи, кластеризація K-means — це потужний неконтрольований алгоритм машинного навчання для групування немаркованих наборів даних. Його мета — розділити дані на кластери, зробивши схожі точки даних частиною однієї групи. Алгоритм ініціалізує центроїди кластера та ітеративно призначає точки даних найближчому центроїду, оновлюючи центроїди на основі середнього значення точок у кожному кластері.
Часті запитання (FAQ)
1. Що таке кластеризація k-середніх для аналізу даних?
K-means — це метод поділу, який поділяє набір даних на «k» окремих підмножин (кластерів), що не перекриваються, на основі подібності з метою мінімізації дисперсії в кожному кластері.
2. Який приклад k-середніх у реальному житті?
Сегментація клієнтів у маркетингу, де k-means групує клієнтів на основі купівельної поведінки, що дозволяє компаніям адаптувати маркетингові стратегії для різних сегментів.
3. Який тип даних є моделлю кластеризації k-середніх?
K-means добре працює з числовими даними, де концепція відстані між точками даних має значення. Його зазвичай застосовують до безперервних змінних.
4. Чи використовуються K-середні для прогнозування?
K-середнє в основному використовується для кластеризації та групування подібних точок даних. Він не передбачає міток для нових даних; він призначає їх до існуючих кластерів на основі подібності.
5. Яка мета кластеризації k-середніх?
Мета полягає в тому, щоб розділити дані на «k» кластерів, мінімізуючи внутрішньокластерну дисперсію. Він прагне сформувати групи, де точки даних у кожному кластері більше схожі одна на одну, ніж на точки в інших кластерах.