Кластеризация с R

Эта статья посвящена практическому кластерному анализу (неконтролируемому машинному обучению) в R с использованием популярного набора данных Iris.

Давайте освежим некоторые понятия из Википедии

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

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

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

Кластерный анализ или Кластеризация - это задача группировки набора объектов таким образом, чтобы объекты в одной группе (называемой кластером) более похожи (в некотором смысле) друг на друга, чем в других группах (кластерах).

О наборе данных Iris

Набор данных о цветках ириса был представлен британским статистиком и биологом Рональдом Фишером в его статье 1936 года Использование множественных измерений в таксономических задачах. Это, пожалуй, самая известная база данных, которую можно найти в литературе по распознаванию образов. Набор данных ириса дает измерения в сантиметрах переменных длина и ширина чашелистика и длина и ширина лепестка, соответственно, для 50 цветков каждого из 3 видов ириса. Это ирис setosa, versicolor и virginica .

Итак, приступим прямо сейчас! Вы можете скачать набор данных Iris и R-скрипт из моего репозитория на github.

Надеюсь, у вас установлены R »и RStudio для практического опыта со мной :)

Цель

Цель состоит в том, чтобы сегментировать данные по радужной оболочке (без меток) на кластеры - 1, 2 и 3 с помощью кластеризации k-средних и сравнить эти кластеры с фактическими кластерами видов - setosa , разноцветный и виргинский.

Установите и загрузите пакеты R

«Tidyverse», «cluster» и «reshape2» - здесь требуются эти три пакета R. Установите, если не сделали раньше. Нам нужно загрузить пакеты с помощью функции library.

install.packages(“tidyverse”)       # for data work & visualization
install.packages(“cluster”)         # for cluster modeling install.packages("reshape2")        # for melting data
# note : not required if already installed
library(tidyverse)
library(cluster)
library(reshape2)

Импортируйте набор данных Iris

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

setwd(“E:/my_folder/work_folder”)
mydata <- read.csv(“iris.csv”)

Или получить его из встроенных наборов данных R

mydata <- iris

Изучите набор данных

С помощью функций ниже мы можем проверить набор данных перед исследованием

glimpse(mydata)
head(mydata)
View(mydata)

Давайте теперь визуализируем данные с помощью ggplot2

Длина чашелистики по сравнению с шириной чашелистика

ggplot(mydata)+
 geom_point(aes(x = Sepal.Length, y = Sepal.Width), stroke = 2)+
 facet_wrap(~ Species)+ 
 labs(x = ‘Sepal Length’, y = ‘Sepal Width’)+
 theme_bw()

Длина лепестка против ширины лепестка

ggplot(mydata)+
 geom_point(aes(x = Petal.Length, y = Petal.Width), stroke = 2)+
 facet_wrap(~ Species)+ 
 labs(x = ‘Petal Length’, y = ‘Petal Width’)+
 theme_bw()

Длина чашелистика и длина лепестка

ggplot(mydata)+
 geom_point(aes(x = Sepal.Length, y = Petal.Length), stroke = 2)+
 facet_wrap(~ Species)+ 
 labs(x = ‘Sepal Length’, y = ‘Petal Length’)+
 theme_bw()

Ширина чаши по сравнению с шириной педали

ggplot(mydata)+
 geom_point(aes(x = Sepal.Width, y = Petal.Width), stroke = 2)+
 facet_wrap(~ Species)+ 
 labs(x = ‘Sepal Width’, y = ‘Pedal Width’)+
 theme_bw()

Коробчатые диаграммы

ggplot(mydata)+
 geom_boxplot(aes(x = Species, y = Sepal.Length, fill = Species))+
 theme_bw()
ggplot(mydata)+
 geom_boxplot(aes(x = Species, y = Sepal.Width, fill = Species))+
 theme_bw()
ggplot(mydata)+
 geom_boxplot(aes(x = Species, y = Petal.Length, fill = Species))+
 theme_bw()
ggplot(mydata)+
 geom_boxplot(aes(x = Species, y = Petal.Width, fill = Species))+
 theme_bw()

k-означает кластеризацию

Кластеризация k-средних - это метод векторного квантования, который направлен на разделение n наблюдений на k кластеров, в которых каждое наблюдение принадлежит кластеру с ближайшее среднее (центры кластеров или центроид кластера), служащее прототипом кластера.

Найдите оптимальное количество кластеров методом локтя

set.seed(123) # for reproduction
wcss <- vector()
for (i in 1:10) wcss[i] <- sum(kmeans(mydata[, -5], i)$withinss)
plot(1:10,
 wcss,
 type = ‘b’,
 main = paste(‘The Elbow Method’),
 xlab = ‘Number of Clusters’,
 ylab = ‘WCSS’
)

точка изгиба: k (центры) = 3

Примените функцию kmeans к столбцам функций

set.seed(123)
km <- kmeans( x = mydata[, -5] , centers = 3)
yclus <- km$cluster
table(yclus)

вывод:

> table(yclus)
yclus
 1  2  3 
50 62 38

kmeans сгруппировал данные в три кластера - 1, 2 и 3, по 50, 62 и 38 наблюдений соответственно.

Визуализируйте кластеры kmeans

clusplot(mydata[, -5],
 yclus,
 lines = 0,
 shade = TRUE,
 color = TRUE,
 labels = 0,
 plotchar = FALSE,
 span = TRUE,
 main = paste(‘Clusters of Iris Flowers’)
)

Сравните кластеры

mydata$cluster.kmean <- yclus
cm <- table(mydata$Species, mydata$cluster.kmean)
cm

вывод:

> cm
              1  2  3
 setosa       50 0  0
 versicolor   0  48 2
 virginica    0  14 36

[(50 + 48 + 36) / 150] = 89% выходных данных кластера k-средних совпадают с фактическими кластерами видов. versicolor (кластер 2) и virginica (кластер 3) имеют некоторые перекрывающиеся черты, что также очевидно из визуализаций кластера.

График плиток: виды против кластеров k-средних

mtable <- melt(cm)
ggplot(mtable)+
 geom_tile(aes(x = Var1, y = Var2, fill = value))+
 labs(x = ‘Species’, y = ‘kmeans Cluster’)+
 theme_bw()

Диаграммы разброса (для просмотра кластеров видов и k-средних)

Длина чашелистики по сравнению с шириной чашелистика

mydata$cluster.kmean <- as.factor(mydata$cluster.kmean)
# Sepal-Length vs. Sepal-Width (Species)
ggplot(mydata)+
  geom_point(aes(x = Sepal.Length, y = Sepal.Width, 
                 color = Species) , size = 10)+ 
  labs(x = 'Sepal Length', y = 'Sepal Width')+
  ggtitle("Species")+
  theme_bw()
# Sepal-Length vs. Sepal-Width (kmeans cluster)
ggplot(mydata)+
  geom_point(aes(x = Sepal.Length, y = Sepal.Width, 
                 color = cluster.kmean) , size = 10)+ 
  labs(x = 'Sepal Length', y = 'Sepal Width')+
  ggtitle("kmeans Cluster")+
  theme_bw()

Длина лепестка против ширины лепестка

# Petal-Length vs. Petal-Width (Species)
ggplot(mydata)+
  geom_point(aes(x = Petal.Length, y = Petal.Width, 
                 color = Species) , size = 10)+ 
  labs(x = 'Petal Length', y = 'Petal Width')+
  ggtitle("Species")+
  theme_bw()
# Petal-Length vs. Petal-Width (kmeans cluster)
ggplot(mydata)+
  geom_point(aes(x = Petal.Length, y = Petal.Width, 
                 color = cluster.kmean) , size = 10)+ 
  labs(x = 'Petal Length', y = 'Petal Width')+
  ggtitle("kmeans Cluster")+
  theme_bw()

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

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



Давайте данные ace !!