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-средних .

Алгоритм K-средних

K-среднее, без сомнения, самый популярный метод кластеризации. Исследователи выпустили алгоритм несколько десятилетий назад, и в k-средних было внесено множество улучшений.

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

Алгоритм работает следующим образом:

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

K-средство обычно берет евклидово расстояние между объектом и объектом:

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

Выберите количество кластеров

Еще одна трудность, возникающая при использовании k-среднего, - это выбор количества кластеров. Вы можете установить высокое значение, то есть большое количество групп, для повышения стабильности, но вы можете получить избыточное количество данных. Переобучение означает, что производительность модели существенно снижается для новых поступающих данных. Машина изучила мелкие детали набора данных и изо всех сил пыталась обобщить общую картину.

Количество кластеров зависит от характера набора данных, отрасли, бизнеса и так далее. Однако есть практическое правило выбора подходящего количества кластеров:

с равным количеству наблюдений в наборе данных.

Вообще говоря, интересно потратить время на поиски наиболее выгодной цены, соответствующей потребностям бизнеса.

Мы будем использовать набор данных «Цены на персональные компьютеры» для выполнения кластерного анализа. Этот набор данных содержит 6259 наблюдений и 10 функций. В наборе данных указана цена 486 персональных компьютеров в США с 1993 по 1995 год. Переменными являются цена, скорость, оперативная память, экран, компакт-диск и другие.

Вы поступите следующим образом:

  • Импортировать данные
  • Обучите модель
  • Оцените модель

Импортировать данные

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

Вы изменяете масштаб переменных с помощью функции scale () библиотеки dplyr. Преобразование снижает влияние выбросов и позволяет сравнивать отдельное наблюдение со средним значением. Если стандартизованное значение (или 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 mean. Основная функция 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 («анимация»). Вы можете проверить, установлен ли пакет в нашей папке 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-mean в нашем наборе данных с пятью кластерами и назвать его pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • Список pc_cluster содержит семь интересных элементов:
  • pc_cluster $ cluster: указывает кластер каждого наблюдения
  • pc_cluster $ center: центры кластера
  • pc_cluster $ totss: общая сумма квадратов
  • pc_cluster $ insidess: В пределах суммы квадратов. Количество возвращаемых компонентов равно `k`
  • pc_cluster $ tot.withinss: Сумма в пределах
  • pc_clusterbetweenss: Общая сумма квадрата минус В пределах суммы квадрата
  • pc_cluster $ size: количество наблюдений в каждом кластере

Вы будете использовать сумму внутри суммы квадратов (то есть tot.winss), чтобы вычислить оптимальное количество кластеров 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 (cluster $ 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, сохранить общие значения без значений.

# 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-mean может подготовить поле для него / нее, предлагая кластеры.

В качестве предварительной оценки вы можете проверить размер кластеров.

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

Чтобы создать тепловую карту, необходимо выполнить три шага:

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

Шаг 1) Создайте фрейм данных

Создадим набор данных reshape

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-среднее

kmeans ()

df, k

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

kmeans () $ кластер

Кластерные центры

kmeans () $ центры

Размер кластера

kmeans () $ размер