K-означає Clustering в R з прикладом
Що таке Cluster аналіз?
Cluster аналіз є частиною непідконтрольне навчання. Кластер — це група даних, які мають схожі характеристики. Можна сказати, що кластерний аналіз – це більше відкриття, ніж прогноз. Машина шукає подібність даних. Наприклад, ви можете використовувати кластерний аналіз для такої програми:
- Сегментація клієнтів: пошук подібності між групами клієнтів
- Кластеризація фондового ринку: групування акцій на основі продуктивності
- Зменште розмірність набору даних, згрупувавши спостереження зі схожими значеннями
Clusterаналіз не надто складний у реалізації, він є значущим і дієвим для бізнесу.
Найразючіша відмінність між навчанням під контролем і без нього полягає в результатах. Неконтрольоване навчання створює нову змінну, мітку, тоді як контрольоване навчання передбачає результат. Машина допомагає практикуючому в пошуках міток даних на основі тісного зв’язку. Використовувати групи та давати їм назву залежить від аналітика.
Давайте наведемо приклад, щоб зрозуміти концепцію кластеризації. Для простоти ми працюємо у двох вимірах. У вас є дані про загальні витрати клієнтів і їхній вік. Щоб покращити рекламу, маркетингова команда хоче надсилати своїм клієнтам більш цілеспрямовані електронні листи.
На наступному графіку ви відобразите загальні витрати та вік клієнтів.
library(ggplot2) df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54), spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24) ) ggplot(df, aes(x = age, y = spend)) + geom_point()
У цьому місці видно візерунок
- У нижньому лівому куті ви можете побачити молодих людей із нижчою купівельною спроможністю
- Вище середнього означає людей, які мають роботу, на яку вони можуть дозволити витратити більше
- Нарешті, літні люди з меншим бюджетом.
На малюнку вище ви групуєте спостереження вручну та визначаєте кожну з трьох груп. Цей приклад дещо простий і дуже наочний. Якщо до набору даних додаються нові спостереження, ви можете позначити їх у кружечках. Ви визначаєте коло на основі нашого судження. Замість цього можна використовувати машинне навчання об’єктивно групувати дані.
У цьому посібнику ви дізнаєтеся, як використовувати k-означає алгоритм.
Алгоритм K-середніх
K-середнє, без сумніву, найпопулярніший метод кластеризації. Дослідники випустили алгоритм десятиліття тому, і було зроблено багато покращень для k-середніх.
Алгоритм намагається знайти групи шляхом мінімізації відстані між спостереженнями, що називається локальний оптимальний рішення. Відстані вимірюються за координатами спостережень. Наприклад, у двовимірному просторі координати прості і .
Алгоритм роботи наступний:
- Крок 1. Довільно виберіть групи в плані функцій
- Крок 2: Мінімізуйте відстань між центром кластера та різними спостереженнями (центроїд). Це призводить до груп із спостереженнями
- Крок 3: Shift початковий центроїд до середнього значення координат у групі.
- Крок 4: Мінімізуйте відстань відповідно до нових центроїдів. Створюються нові межі. Таким чином, спостереження будуть переходити від однієї групи до іншої
- Повторюйте, доки жодне спостереження не змінить групи
K-means зазвичай приймає евклідову відстань між об’єктом і об’єктом:
Доступні різні вимірювання, наприклад Манхеттенська відстань або відстань Мінловського. Зауважте, що K-середнє повертає різні групи кожного разу, коли ви запускаєте алгоритм. Пам’ятайте, що перші початкові припущення є випадковими, і обчислюйте відстані, поки алгоритм не досягне однорідності в групах. Тобто k-середнє дуже чутливе до першого вибору, і якщо кількість спостережень і груп невелика, практично неможливо отримати однакову кластеризацію.
Виберіть кількість кластерів
Інша складність, яка виникає з k-середнім, полягає у виборі кількості кластерів. Ви можете встановити високе значення , тобто велику кількість груп, щоб підвищити стабільність, але ви можете закінчити з переобладнаний даних. Переобладнання означає, що продуктивність моделі суттєво знижується для нових надходять даних. Машина вивчала дрібні деталі набору даних і намагалася узагальнити загальну схему.
Кількість кластерів залежить від характеру набору даних, галузі, бізнесу тощо. Однак існує емпіричне правило вибору відповідної кількості кластерів:
з дорівнює кількості спостережень у наборі даних.
Загалом, цікаво витрачати час на пошук найкращого варіанту, який відповідає потребам бізнесу.
Ми будемо використовувати набір даних Prices of Personal Computers для виконання аналізу кластеризації. Цей набір даних містить 6259 спостережень і 10 ознак. Набір даних враховує ціни з 1993 по 1995 роки 486 персональних комп'ютерів у США. Серед змінних – це ціна, швидкість, оперативна пам’ять, екран, компакт-диск.
Ви будете діяти наступним чином:
- Дати імпорту
- Тренуйте модель
- Оцініть модель
Дати імпорту
Значення K не підходить для факторних змінних, оскільки воно базується на відстані, а дискретні значення не повертають значущих значень. Ви можете видалити три категоричні змінні в нашому наборі даних. Крім того, у цьому наборі даних немає пропущених значень.
library(dplyr) PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv" df <- read.csv(PATH) %>% select(-c(X, cd, multi, premium)) glimpse(df)
Вихід
## Observations: 6, 259 ## Variables: 7 ## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2... ##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25, ... ##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210... ##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4, ... ##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, ... ##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, ... ## $ trend <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
Зі зведеної статистики можна побачити, що дані мають великі значення. Хорошою практикою з обчисленням k середнього значення та відстані є зміна масштабу даних так, щоб середнє дорівнювало одиниці, а стандартне відхилення дорівнювало нулю.
summary(df)
вихід:
## price speed hd ram ## Min. : 949 Min. : 25.00 Min. : 80.0 Min. : 2.000 ## 1st Qu.:1794 1st Qu.: 33.00 1st Qu.: 214.0 1st Qu.: 4.000 ` ## Median :2144 Median : 50.00 Median : 340.0 Median : 8.000 ## Mean :2220 Mean : 52.01 Mean : 416.6 Mean : 8.287 ## 3rd Qu.:2595 3rd Qu.: 66.00 3rd Qu.: 528.0 3rd Qu.: 8.000 ## Max. :5399 Max. :100.00 Max. :2100.0 Max. :32.000 ## screen ads trend ## Min. :14.00 Min. : 39.0 Min. : 1.00 ## 1st Qu.:14.00 1st Qu.:162.5 1st Qu.:10.00 ## Median :14.00 Median :246.0 Median :16.00 ## Mean :14.61 Mean :221.3 Mean :15.93 ## 3rd Qu.:15.00 3rd Qu.:275.0 3rd Qu.:21.50 ## Max. :17.00 Max. :339.0 Max. :35.00
Ви масштабуєте змінні за допомогою функції scale() бібліотеки dplyr. Трансформація зменшує вплив викидів і дозволяє порівнювати окреме спостереження із середнім. Якщо стандартизоване значення (або z-оцінка) є високим, ви можете бути впевнені, що це спостереження справді перевищує середнє значення (великий z-показник означає, що ця точка далека від середнього значення за стандартним відхиленням. Z-показник, що дорівнює два, означає, що значення є стандартним 2 відхилення від середнього. Зауважте, що z-показник відповідає розподілу Гауса та є симетричним відносно середнього.
rescale_df <- df % > % mutate(price_scal = scale(price), hd_scal = scale(hd), ram_scal = scale(ram), screen_scal = scale(screen), ads_scal = scale(ads), trend_scal = scale(trend)) % > % select(-c(price, speed, hd, ram, screen, ads, trend))
R base має функцію для запуску алгоритму k середнього. Основна функція k mean:
kmeans(df, k) arguments: -df: dataset used to run the algorithm -k: Number of clusters
Тренуйте модель
На малюнку 3 ви докладно описали, як працює алгоритм. Ви можете побачити кожен крок у графічному вигляді за допомогою чудової збірки пакета від Yi Hui (також творця Knit для Rmarkdown). Анімація пакета недоступна в бібліотеці conda. Ви можете скористатися іншим способом інсталяції пакета за допомогою install.packages(“animation”). Ви можете перевірити, чи встановлено пакет у нашій папці Anaconda.
install.packages("animation")
Після завантаження бібліотеки ви додаєте .ani після kmeans і R накреслить усі кроки. Для ілюстрації, ви виконуєте лише алгоритм із перемасштабованими змінними hd і ram із трьома кластерами.
set.seed(2345) library(animation) kmeans.ani(rescale_df[2:3], 3)
Пояснення коду
- kmeans.ani(rescale_df[2:3], 3): виберіть стовпці 2 і 3 набору даних rescale_df і запустіть алгоритм із значеннями k 3. Побудуйте анімацію.
Ви можете інтерпретувати анімацію наступним чином:
- Крок 1: R навмання обирає три точки
- Крок 2: обчисліть евклідову відстань і намалюйте кластери. У вас є один кластер зеленого кольору внизу ліворуч, один великий кластер чорного кольору праворуч і червоний кластер між ними.
- Крок 3: Обчисліть центроїд, тобто середнє значення кластерів
- Повторюйте, доки дані не змінять кластер
Алгоритм сходився після семи ітерацій. Ви можете запустити алгоритм k-середнього в нашому наборі даних із п’ятьма кластерами та назвати його pc_cluster.
pc_cluster <-kmeans(rescale_df, 5)
- Список pc_cluster містить сім цікавих елементів:
- pc_cluster$cluster: вказує на кластер кожного спостереження
- pc_cluster$centers: центри кластерів
- pc_cluster$totss: загальна сума квадратів
- pc_cluster$withinss: в межах суми квадратів. Кількість повернених компонентів дорівнює `k`
- pc_cluster$tot.withinss: сума insidess
- pc_clusterbetweenss: загальна сума квадратів мінус сума квадратів
- pc_cluster$size: кількість спостережень у кожному кластері
Ви будете використовувати суму внутрішньої суми квадратів (тобто tot.withinss), щоб обчислити оптимальну кількість кластерів k. Знаходження k справді є серйозним завданням.
Оптимальна к
Один із методів вибору найкращого k називається ліктьовий метод. Цей метод використовує однорідність усередині групи або неоднорідність усередині групи для оцінки мінливості. Іншими словами, вас цікавить відсоток дисперсії, пояснений кожним кластером. Ви можете очікувати, що мінливість збільшиться зі збільшенням кількості кластерів, інакше гетерогенність зменшиться. Наше завдання полягає в тому, щоб знайти k, яке перевищує спадну віддачу. Додавання нового кластера не покращує мінливість даних, оскільки залишається дуже мало інформації для пояснення.
У цьому посібнику ми знаходимо цю точку за допомогою міри неоднорідності. Загальна сума квадратів у межах кластерів є tot.withinss у списку, який повертає kmean().
Ви можете побудувати ліктьовий графік і знайти оптимальне k таким чином:
- Крок 1: Створіть функцію для обчислення загальної суми квадратів у кластерах
- Крок 2. Запустіть алгоритм разів
- Крок 3: Створіть фрейм даних із результатами алгоритму
- Крок 4: Побудуйте результати
Крок 1) Побудуйте функцію для обчислення загальної суми квадратів у кластерах
Ви створюєте функцію, яка запускає алгоритм k-середніх і зберігає загальну суму квадратів у кластерах
kmean_withinss <- function(k) { cluster <- kmeans(rescale_df, k) return (cluster$tot.withinss) }
Пояснення коду
- function(k): Установіть кількість аргументів у функції
- kmeans(rescale_df, k): Запустіть алгоритм k разів
- return(cluster$tot.withinss): зберігати загальну суму квадратів у кластерах
Ви можете перевірити функцію з дорівнює 2.
вихід:
## Try with 2 cluster
kmean_withinss(2)
вихід:
## [1] 27087.07
Крок 2) Виконайте алгоритм n разів
Ви будете використовувати функцію sapply(), щоб запустити алгоритм у діапазоні k. Ця техніка швидша, ніж створення циклу та збереження значення.
# Set maximum cluster max_k <-20 # Run algorithm over a range of k wss <- sapply(2:max_k, kmean_withinss)
Пояснення коду
- max_k <-20: встановіть максимальну кількість 20
- sapply(2:max_k, kmean_withinss): запустіть функцію kmean_withinss() у діапазоні 2:max_k, тобто від 2 до 20.
Крок 3) Створіть кадр даних із результатами алгоритму
Після створення та тестування нашої функції ви можете запустити алгоритм k-середнього в діапазоні від 2 до 20, зберегти значення tot.withinss.
# Create a data frame to plot the graph elbow <-data.frame(2:max_k, wss)
Пояснення коду
- data.frame(2:max_k, wss): Створення кадру даних із виходом алгоритму, що зберігається в wss
Крок 4) Побудуйте результати
Ви будуєте графік, щоб візуалізувати, де знаходиться точка ліктя
# Plot the graph with gglop ggplot(elbow, aes(x = X2.max_k, y = wss)) + geom_point() + geom_line() + scale_x_continuous(breaks = seq(1, 20, by = 1))
На графіку можна побачити оптимальне k дорівнює семи, де крива починає мати спадну віддачу.
Отримавши наше оптимальне k, ви повторно запускаєте алгоритм, коли k дорівнює 7, і оцінюєте кластери.
Огляд кластера
pc_cluster_2 <-kmeans(rescale_df, 7)
Як згадувалося раніше, ви можете отримати доступ до решти цікавої інформації зі списку, який повертає kmean().
pc_cluster_2$cluster pc_cluster_2$centers pc_cluster_2$size
Оцінювальна частина є суб’єктивною та базується на використанні алгоритму. Наша мета тут — зібрати комп’ютер із подібними функціями. Комп’ютерник може виконувати роботу вручну та групувати комп’ютери на основі свого досвіду. Однак цей процес займе багато часу та може призвести до помилок. Алгоритм K-середнього може підготувати поле для нього/неї, пропонуючи кластери.
Для попередньої оцінки ви можете перевірити розмір кластерів.
pc_cluster_2$size
вихід:
## [1] 608 1596 1231 580 1003 699 542
Перший кластер складається з 608 спостережень, тоді як найменший кластер під номером 4 містить лише 580 комп’ютерів. Було б добре мати однорідність між кластерами, якщо ні, може знадобитися тонша підготовка даних.
За допомогою центрального компонента ви зможете глибше поглянути на дані. Рядки вказують на нумерацію кластера, а стовпці — на змінні, які використовує алгоритм. Значення є середнім балом кожного кластера для відповідного стовпця. Стандартизація полегшує інтерпретацію. Позитивні значення вказують на те, що z-показник для даного кластера вище загального середнього. Наприклад, кластер 2 має найвищу середню ціну серед усіх кластерів.
center <-pc_cluster_2$centers center
вихід:
## price_scal hd_scal ram_scal screen_scal ads_scal trend_scal ## 1 -0.6372457 -0.7097995 -0.691520682 -0.4401632 0.6780366 -0.3379751 ## 2 -0.1323863 0.6299541 0.004786730 2.6419582 -0.8894946 1.2673184 ## 3 0.8745816 0.2574164 0.513105797 -0.2003237 0.6734261 -0.3300536 ## 4 1.0912296 -0.2401936 0.006526723 2.6419582 0.4704301 -0.4132057 ## 5 -0.8155183 0.2814882 -0.307621003 -0.3205176 -0.9052979 1.2177279 ## 6 0.8830191 2.1019454 2.168706085 0.4492922 -0.9035248 1.2069855 ## 7 0.2215678 -0.7132577 -0.318050275 -0.3878782 -1.3206229 -1.5490909
Ви можете створити теплову карту за допомогою ggplot, щоб допомогти нам підкреслити різницю між категоріями.
Стандартні кольори ggplot потрібно змінити за допомогою бібліотеки RColorBrewer. Ви можете використовувати conda бібліотека і код для запуску в терміналі:
conda install -cr r-rcolorbrewer
Щоб створити теплову карту, виконайте три кроки:
- Побудуйте фрейм даних із значеннями центру та створіть змінну з номером кластера
- Змініть форму даних за допомогою функції gather() бібліотеки tidyr. Ви хочете перетворити дані з широких на довгі.
- Створіть палітру кольорів за допомогою кольоруRampФункція Palette().
Крок 1) Побудуйте фрейм даних
Давайте створимо набір даних зміни форми
library(tidyr) # create dataset with the cluster number cluster <- c(1: 7) center_df <- data.frame(cluster, center) # Reshape the data center_reshape <- gather(center_df, features, values, price_scal: trend_scal) head(center_reshape)
вихід:
## cluster features values ## 1 1 price_scal -0.6372457 ## 2 2 price_scal -0.1323863 ## 3 3 price_scal 0.8745816 ## 4 4 price_scal 1.0912296 ## 5 5 price_scal -0.8155183 ## 6 6 price_scal 0.8830191
Крок 2) Переформатуйте дані
Наведений нижче код створює палітру кольорів, які ви використовуватимете для побудови теплової карти.
library(RColorBrewer) # Create the palette hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
Крок 3) Візуалізуйте
Ви можете побудувати графік і побачити, як виглядають кластери.
# Plot the heat map ggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) + scale_y_continuous(breaks = seq(1, 7, by = 1)) + geom_tile() + coord_equal() + scale_fill_gradientn(colours = hm.palette(90)) + theme_classic()
Підсумки
Ми можемо підсумувати алгоритм k-середнього в таблиці нижче
пакет | Мета | функція | аргументація |
---|---|---|---|
база | Тренувати k-середнє | kmeans() | df, k |
Кластер доступу | kmeans()$cluster | ||
Cluster центри | kmeans()$centers | ||
Розмір кластера | kmeans()$size |