K-Medoids в R: пошаговый пример

K-Medoids в R: пошаговый пример

Кластеризация — это метод машинного обучения, который пытается найти группы или кластеры наблюдений в наборе данных.

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

Кластеризация — это форма обучения без учителя, потому что мы просто пытаемся найти структуру в наборе данных, а не предсказываем значение некоторой переменной ответа .

Кластеризация часто используется в маркетинге, когда компании имеют доступ к такой информации, как:

  • Семейный доход
  • Размер семьи
  • Глава семьи Род занятий
  • Удаленность от ближайшего населенного пункта

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

Одна из наиболее распространенных форм кластеризации известна как кластеризация k-средних .

К сожалению, на этот метод могут влиять выбросы, поэтому часто используемой альтернативой является кластеризация k-medoids .

Что такое кластеризация K-Medoids?

Кластеризация K-medoids — это метод, при котором мы помещаем каждое наблюдение в наборе данных в один из K кластеров.

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

На практике мы используем следующие шаги для выполнения кластеризации K-средних:

1. Выберите значение для K .

  • Во-первых, мы должны решить, сколько кластеров мы хотим идентифицировать в данных. Часто нам приходится просто тестировать несколько разных значений K и анализировать результаты, чтобы увидеть, какое количество кластеров кажется наиболее подходящим для данной задачи.

2. Случайным образом назначьте каждое наблюдение начальному кластеру от 1 до K.

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

  • Для каждого из кластеров K вычислите центр тяжести кластера. Это вектор медиан признаков p для наблюдений в k -м кластере.
  • Назначьте каждое наблюдение кластеру, центроид которого находится ближе всего. Здесь ближайший определяется с помощью евклидова расстояния .
Техническое примечание:
Поскольку k-medoids вычисляет центроиды кластера, используя медианы вместо средних значений, он имеет тенденцию быть более устойчивым к выбросам по сравнению с k-средними значениями.
На практике, если в наборе данных нет экстремальных выбросов, то k-means и k-medoids будут давать аналогичные результаты.

Кластеризация K-Medoids в R

В следующем руководстве представлен пошаговый пример выполнения кластеризации k-medoids в R.

Шаг 1: Загрузите необходимые пакеты

Во-первых, мы загрузим два пакета, которые содержат несколько полезных функций для кластеризации k-medoids в R.

library (factoextra)
library (cluster)

Шаг 2: Загрузите и подготовьте данные

В этом примере мы будем использовать набор данных USArrests , встроенный в R, который содержит количество арестов на 100 000 жителей в каждом штате США в 1973 году за убийства , нападения и изнасилования , а также процент населения в каждом штате, проживающего в городских районах. , урбан-поп .

В следующем коде показано, как сделать следующее:

  • Загрузите набор данных USArrests
  • Удалите все строки с отсутствующими значениями
  • Масштабируйте каждую переменную в наборе данных, чтобы иметь среднее значение 0 и стандартное отклонение 1.
#load data
df <- USArrests

#remove rows with missing values
df <- na.omit(df)

#scale each variable to have a mean of 0 and sd of 1
df <- scale(df)

#view first six rows of dataset
head(df)

 Murder Assault UrbanPop Rape
Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
Arizona 0.07163341 1.4788032 0.9989801 1.042878388
Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
California 0.27826823 1.2628144 1.7589234 2.067820292
Colorado 0.02571456 0.3988593 0.8608085 1.864967207

Шаг 3: Найдите оптимальное количество кластеров

Чтобы выполнить кластеризацию k-medoids в R, мы можем использовать функцию pam() , которая означает «разбиение по медианам» и использует следующий синтаксис:

pam (данные, k, метрика = «евклидово», стенд = ЛОЖЬ)

куда:

  • данные: имя набора данных.
  • k: количество кластеров.
  • метрика: метрика, используемая для расчета расстояния. По умолчанию используется euclidean , но вы также можете указать manhattan .
  • стенд: следует ли стандартизировать каждую переменную в наборе данных. По умолчанию ЛОЖЬ.

Поскольку мы заранее не знаем, сколько кластеров является оптимальным, мы создадим два разных графика, которые помогут нам принять решение:

1. Количество кластеров по сравнению с общей суммой квадратов

Во-первых, мы будем использовать функцию fviz_nbclust() , чтобы построить график количества кластеров по сравнению с общей суммой квадратов:

fviz_nbclust(df, pam, method = " wss ") 
Оптимальные кластеры для k-medoids

Общая сумма квадратов обычно всегда будет увеличиваться по мере увеличения количества кластеров, поэтому при создании графика такого типа мы ищем «локоть», где сумма квадратов начинает «изгибаться» или выравниваться.

Точка изгиба графика обычно является оптимальным количеством кластеров. Помимо этого числа, вероятно, произойдет переобучение .

Для этого графика кажется, что есть небольшой изгиб или «изгиб» при k = 4 кластерах.

2. Количество кластеров и статистика пропусков

Другой способ определить оптимальное количество кластеров — использовать метрику, известную как статистика разрыва , которая сравнивает общую внутрикластерную вариацию для разных значений k с их ожидаемыми значениями для распределения без кластеризации.

Мы можем рассчитать статистику разрыва для каждого количества кластеров, используя функцию clusGap() из пакета кластера , а также график зависимости кластеров от статистики разрыва, используя функцию fviz_gap_stat() :

#calculate gap statistic based on number of clusters
gap_stat <- clusGap(df,
 FUN = pam,
 K.max = 10, #max clusters to consider
 B = 50) #total bootstrapped iterations

#plot number of clusters vs. gap statistic
fviz_gap_stat(gap_stat) 
K-medoids оптимальное количество кластеров в R

Из графика видно, что статистика зазора максимальна при k = 4 кластерах, что соответствует методу локтя, который мы использовали ранее.

Шаг 4: Выполните кластеризацию K-Medoids с оптимальным K

Наконец, мы можем выполнить кластеризацию k-medoids в наборе данных, используя оптимальное значение k из 4:

#make this example reproducible
set.seed(1)

#perform k-medoids clustering with k = 4 clusters
kmed <- pam(df, k = 4)

#view results
kmed

 ID Murder Assault UrbanPop Rape
Alabama 1 1.2425641 0.7828393 -0.5209066 -0.003416473
Michigan 22 0.9900104 1.0108275 0.5844655 1.480613993
Oklahoma 36 -0.2727580 -0.2371077 0.1699510 -0.131534211
New Hampshire 29 -1.3059321 -1.3650491 -0.6590781 -1.252564419
Clustering vector:
 Alabama Alaska Arizona Arkansas California 
 1 2 2 1 2 
 Colorado Connecticut Delaware Florida Georgia 
 2 3 3 2 1 
 Hawaii Idaho Illinois Indiana Iowa 
 3 4 2 3 4 
 Kansas Kentucky Louisiana Maine Maryland 
 3 3 1 4 2 
 Massachusetts Michigan Minnesota Mississippi Missouri 
 3 2 4 1 3 
 Montana Nebraska Nevada New Hampshire New Jersey 
 3 3 2 4 3 
 New Mexico New York North Carolina North Dakota Ohio 
 2 2 1 4 3 
 Oklahoma Oregon Pennsylvania Rhode Island South Carolina 
 3 3 3 3 1 
 South Dakota Tennessee Texas Utah Vermont 
 4 1 2 3 4 
 Virginia Washington West Virginia Wisconsin Wyoming 
 3 3 4 4 3 
Objective function:
 build swap 
1.035116 1.027102 

Available components:
 [1] "medoids" "id.med" "clustering" "objective" "isolation" 
 [6] "clusinfo" "silinfo" "diss" "call" "data"

Обратите внимание, что четыре центроида кластера являются фактическими наблюдениями в наборе данных. В верхней части вывода мы видим, что четыре центроида соответствуют следующим состояниям:

  • Алабама
  • Мичиган
  • Оклахома
  • Нью-Гемпшир

Мы можем визуализировать кластеры на диаграмме рассеивания, которая отображает первые два основных компонента на осях, используя функцию fivz_cluster() :

#plot results of final k-medoids model
fviz_cluster(kmed, data = df)
Постройте кластеры k-medoids в R

Мы также можем добавить кластерные назначения каждого состояния обратно в исходный набор данных:

#add cluster assignment to original data
final_data <- cbind(USArrests, cluster = kmed$cluster)

#view final data
head(final_data)

 Murder Assault UrbanPop Rape cluster
Alabama 13.2 236 58 21.2 1
Alaska 10.0 263 48 44.5 2
Arizona 8.1 294 80 31.0 2
Arkansas 8.8 190 50 19.5 1
California 9.0 276 91 40.6 2
Colorado 7.9 204 78 38.7 2

Полный код R, использованный в этом примере, вы можете найти здесь .

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.