K-означає кластеризацію в R з прикладом

Зміст:

Anonim

У цьому підручнику ви дізнаєтесь

  • Що таке кластерний аналіз?
  • K-означає алгоритм
  • Оптимальний k

Що таке кластерний аналіз?

Кластерний аналіз є частиною навчання без нагляду . Кластер - це група даних, що мають подібні функції. Можна сказати, що кластерний аналіз - це більше відкриття, ніж передбачення. Машина шукає схожість даних. Наприклад, ви можете використовувати кластерний аналіз для наступної програми:

  • Сегментація клієнтів: шукає схожість між групами клієнтів
  • Кластеризація фондового ринку: Груповий запас на основі результатів
  • Зменшіть розмірність набору даних, групуючи спостереження з подібними значеннями

Кластерний аналіз не надто складний для реалізації, він є значущим, а також дієвим для бізнесу.

Найбільш вражаюча різниця між контрольованим та неконтрольованим навчанням полягає в результатах. Навчання без нагляду створює нову змінну - мітку, тоді як наглядове навчання передбачає результат. Машина допомагає практикуючому в пошуках маркування даних на основі близьких стосунків. Аналітик повинен використовувати групи та давати їм ім’я.

Давайте наведемо приклад для розуміння поняття кластеризації. Для простоти ми працюємо у двох вимірах. Ви маєте дані про загальні витрати клієнтів та їх вік. Щоб покращити рекламу, команда маркетингу хоче надсилати більше адресних електронних листів своїм клієнтам.

На наступному графіку ви вказуєте загальні витрати та вік клієнтів.

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()

На цьому місці видно візерунок

  1. У нижньому лівому куті ви бачите молодих людей із нижчою купівельною спроможністю
  2. Верхня середня частина відображає людей, які мають роботу, яку вони можуть дозволити собі витратити більше
  3. Нарешті, літні люди з меншим бюджетом.

На малюнку вище ви кластеруєте спостереження вручну та визначаєте кожну з трьох груп. Цей приклад є дещо зрозумілим та надзвичайно наочним. Якщо до набору даних додаються нові спостереження, ви можете позначити їх у колах. Ви визначаєте коло на основі нашого судження. Натомість ви можете використовувати машинне навчання, щоб об’єктивно групувати дані.

У цьому підручнику ви дізнаєтесь, як використовувати алгоритм k- mean.

K-означає алгоритм

Середнє значення K, без сумніву, є найпопулярнішим методом кластеризації. Дослідники випустили алгоритм десятиліття тому, і було зроблено багато вдосконалень в k-середніх.

Алгоритм намагається знайти групи, мінімізуючи відстань між спостереженнями, які називаються локальними оптимальними рішеннями. Відстані вимірюються на основі координат спостережень. Наприклад, у двовимірному просторі координати прості і.

Алгоритм працює наступним чином:

  • Крок 1: Вибирайте групи в плані функцій випадковим чином
  • Крок 2: Мінімізуйте відстань між центром скупчення та різними спостереженнями ( центроїд ). Результатом є групи з спостереженнями
  • Крок 3: Змістіть початковий центроїд на середнє значення координат у групі.
  • Крок 4: Мінімізуйте відстань відповідно до нових центроїдів. Створюються нові межі. Таким чином, спостереження будуть переходити від однієї групи до іншої
  • Повторюйте, поки жодне спостереження не змінить групи

K-означає зазвичай займає евклідову відстань між ознакою та ознакою:

Доступні різні міри, такі як відстань до Манхеттена або відстань Мінловського. Зауважте, що середнє значення K повертає різні групи кожного разу, коли ви запускаєте алгоритм. Нагадаємо, що перші початкові припущення є випадковими і обчислюють відстані, поки алгоритм не досягне однорідності в межах груп. Тобто k-середнє дуже чутливе до першого вибору, і якщо кількість спостережень і груп невелика, майже неможливо отримати однакову кластеризацію.

Виберіть кількість кластерів

Інша складність, виявлена ​​з k-середнім значенням, полягає у виборі кількості кластерів. Ви можете встановити велике значення, тобто велику кількість груп, для поліпшення стабільності, але у вас може з’явитися надмірна кількість даних. Переоснащення означає, що продуктивність моделі істотно знижується для нових надходять даних. Машина дізналася дрібні деталі набору даних і намагається узагальнити загальний шаблон.

Кількість кластерів залежить від природи набору даних, галузі, бізнесу тощо. Однак існує правило, щоб вибрати відповідну кількість кластерів:

з рівним кількості спостережень у наборі даних.

Взагалі кажучи, цікаво витрачати час, щоб знайти найкраще значення, яке відповідає потребам бізнесу.

Для використання кластерного аналізу ми використовуватимемо набір даних „Ціни персональних комп’ютерів”. Цей набір даних містить 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  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

Ви масштабуєте змінні за допомогою функції масштабу () бібліотеки dplyr. Перетворення зменшує вплив викидів і дозволяє порівняти єдине спостереження із середнім значенням. Якщо стандартизоване значення (або z-бал ) є високим, ви можете бути впевнені, що це спостереження справді перевищує середнє значення (великий z-бал означає, що ця точка далека від середнього за терміном середньоквадратичного відхилення. A 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 є:

kmeans(df, k)arguments:-df: dataset used to run the algorithm-k: Number of clusters

Тренуйте модель

На малюнку три ви детально описали, як працює алгоритм. Ви можете бачити кожен крок графічно за допомогою чудового пакету, створеного Yi Hui (також творцем Knit for Rmarkdown). Анімація пакету недоступна в бібліотеці conda. Ви можете використовувати інший спосіб встановлення пакета за допомогою install.packages ("анімація"). Ви можете перевірити, чи встановлений пакет у нашій папці 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 $ кластер: вказує кластер кожного спостереження
  • pc_cluster $ центри: Центри кластера
  • pc_cluster $ totss: Загальна сума квадратів
  • pc_cluster $ Withinss: В межах суми квадрата. Кількість повернених компонентів дорівнює `k`
  • pc_cluster $ tot.withinss: Сума внутрішніх
  • pc_clusterbetweenss: Загальна сума квадрата мінус У межах суми квадрата
  • pc_cluster $ size: Кількість спостережень у кожному кластері

Ви будете використовувати суму внутрішньої суми квадрата (тобто tot.withinss) для обчислення оптимальної кількості кластерів k. Пошук k справді є істотним завданням.

Оптимальний k

Один із методів вибору найкращого k називається методом ліктя . Цей метод використовує однорідність всередині групи або неоднорідність всередині групи для оцінки мінливості. Іншими словами, вас цікавить відсоток дисперсії, пояснюваний кожним кластером. Ви можете очікувати, що мінливість збільшиться із збільшенням кількості скупчень, або ж неоднорідність зменшиться. Наше завдання полягає в тому, щоб знайти k, який виходить за межі зменшення віддачі. Додавання нового кластера не покращує мінливість даних, оскільки для пояснення залишається дуже мало інформації.

У цьому посібнику ми знаходимо цей момент, використовуючи міру неоднорідності. Сума квадратів у кластерах становить загальну суму без повернення списку за допомогою 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 (кластер $ tot.withinss): Зберігає загальну суму в кластерах суму квадратів

Ви можете перевірити функцію рівним 2.

Вихід:

## Try with 2 cluster
kmean_withinss(2)

Вихід:

## [1] 27087.07 

Крок 2) Запустіть алгоритм n разів

Ви будете використовувати функцію sapply () для запуску алгоритму в діапазоні k. Цей прийом швидший, ніж створення циклу і зберігання значення.

# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- 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 graphelbow <-data.frame(2:max_k, wss)

Пояснення коду

  • data.frame (2: max_k, wss): Створіть фрейм даних з виходом сховища алгоритмів у wss

Крок 4) Побудуйте графік результатів

Ви складаєте графік, щоб візуалізувати, де знаходиться точка ліктя

# Plot the graph with gglopggplot(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$clusterpc_cluster_2$centerspc_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$centerscenter

Вихід:

## 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

Щоб створити теплову карту, виконайте три кроки:

  • Побудуйте фрейм даних зі значеннями центру і створіть змінну з номером кластера
  • Переформатуйте дані за допомогою функції збору () бібліотеки tidyr. Ви хочете перетворити дані з широких на довгі.
  • Створіть палітру кольорів за допомогою функції colorRampPalette ()

Крок 1) Створення кадру даних

Давайте створимо переформатований набір даних

library(tidyr)# create dataset with the cluster numbercluster <- c(1: 7)center_df <- data.frame(cluster, center)# Reshape the datacenter_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 palettehm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')

Крок 3) Візуалізуйте

Ви можете побудувати графік і побачити, як виглядають кластери.

# Plot the heat mapggplot(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-mean

kmeans ()

df, k

Кластер доступу

kmeans () $ кластер

Кластерні центри

kmeans () $ центрів

Кластер розмірів

kmeans () $ розмір