K-средних Clusterработа в 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-mean, без сомнения, является самым популярным методом кластеризации. Исследователи выпустили алгоритм несколько десятилетий назад, и в k-средние было внесено множество улучшений.
Алгоритм пытается найти группы, минимизируя расстояние между наблюдениями, называемое локальный оптимум решения. Расстояния измеряются по координатам наблюдений. Например, в двумерном пространстве координаты простые и .
Алгоритм работает следующим образом:
- Шаг 1. Случайным образом выберите группы в плане функций.
- Шаг 2: Минимизируйте расстояние между центром кластера и различными наблюдениями (центроида). В результате формируются группы с наблюдениями
- Шаг 3: Shift от начального центроида до среднего значения координат внутри группы.
- Шаг 4: Минимизируйте расстояние в соответствии с новыми центроидами. Создаются новые границы. Таким образом, наблюдения будут переходить из одной группы в другую.
- Повторяйте до тех пор, пока ни одно наблюдение не изменит группы.
K-средние обычно принимают евклидово расстояние между объектом и объектом:
Доступны различные меры, такие как расстояние Манхэттена или расстояние Минловского. Обратите внимание, что K-mean возвращает разные группы каждый раз, когда вы запускаете алгоритм. Напомним, что первые первоначальные предположения являются случайными и вычисляют расстояния до тех пор, пока алгоритм не достигнет однородности внутри групп. То есть k-среднее очень чувствительно к первому варианту, и если количество наблюдений и групп невелико, получить такую же кластеризацию практически невозможно.
Выберите количество кластеров
Еще одна трудность, возникающая при использовании k-mean, — это выбор количества кластеров. Вы можете установить высокое значение , то есть большое количество групп, для повышения стабильности, но в итоге вы можете получить переобучать данных. Переобучение означает, что производительность модели существенно снижается для новых поступающих данных. Машина усвоила мелкие детали набора данных и с трудом смогла обобщить общую картину.
Количество кластеров зависит от характера набора данных, отрасли, бизнеса и т. д. Однако существует практическое правило выбора подходящего количества кластеров:
с равным количеству наблюдений в наборе данных.
Вообще говоря, интересно потратить время на поиск наилучшего значения, соответствующего потребностям бизнеса.
Мы будем использовать набор данных «Цены на персональные компьютеры» для выполнения кластерного анализа. Этот набор данных содержит 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 имеет функцию для запуска алгоритма k-среднего. Основная функция kmean:
kmeans(df, k) arguments: -df: dataset used to run the algorithm -k: Number of clusters
Тренируй модель
На рисунке три вы подробно описали, как работает алгоритм. Вы можете увидеть каждый шаг графически с помощью великолепного пакета, созданного Йи Хуэй (также создателем 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-mean в нашем наборе данных с пятью кластерами и назвать его 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: Сумма внутренних значений
- pc_clusterbetweenss: Общая сумма квадратов минус В пределах суммы квадратов
- pc_cluster$size: количество наблюдений в каждом кластере.
Вы будете использовать сумму внутренней суммы квадратов (т. е. tot.withinss) для вычисления оптимального количества кластеров k. Нахождение k действительно является серьезной задачей.
Оптимальный к
Один из методов выбора лучшего k называется локтевой метод. Этот метод использует внутригрупповую однородность или внутригрупповую гетерогенность для оценки изменчивости. Другими словами, вас интересует процент дисперсии, объясняемый каждым кластером. Можно ожидать, что изменчивость будет увеличиваться с увеличением количества кластеров, или наоборот, гетерогенность уменьшится. Наша задача — найти значение k, которое находится за пределами убывающей отдачи. Добавление нового кластера не улучшает изменчивость данных, поскольку остается очень мало информации для объяснения.
В этом уроке мы находим эту точку, используя меру неоднородности. Общая сумма квадратов внутри кластеров — это tot.withinss в списке, возвращаемом функцией kmean().
Вы можете построить график локтей и найти оптимальный k следующим образом:
- Шаг 1. Создайте функцию для вычисления суммы квадратов внутри кластеров.
- Шаг 2. Запустите алгоритм раз.
- Шаг 3. Создайте фрейм данных с результатами алгоритма.
- Шаг 4. Постройте график результатов
Шаг 1) Создайте функцию для вычисления суммы квадратов в пределах кластеров.
Вы создаете функцию, которая запускает алгоритм k-mean и сохраняет итоговую сумму в кластерах, сумму квадратов.
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-mean в диапазоне от 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-mean может подготовить для него поле, предложив кластеры.
В качестве предварительной оценки вы можете изучить размер кластеров.
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 -cr r-rcolorbrewer
Чтобы создать тепловую карту, вы выполняете три шага:
- Постройте фрейм данных со значениями центра и создайте переменную с номером кластера.
- Измените форму данных с помощью функции сбора() библиотеки tidyr. Вы хотите преобразовать данные из широких в длинные.
- Создайте палитру цветов с помощью цветаRampФункция Палитра()
Шаг 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-mean в таблице ниже.
Упаковка | Цель | Функция | Аргумент |
---|---|---|---|
Использование темпера с изогнутым основанием | Поезд k-среднее | kmeans () | дф, к |
Кластер доступа | kmeans()$кластер | ||
Cluster центры | kmeans()$центры | ||
Размер кластера | kmeans()$размер |