В този урок ще научите
- Какво представлява клъстерният анализ?
- 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()
В този момент се вижда шаблон
- В долния ляв ъгъл можете да видите млади хора с по-ниска покупателна способност
- Горната част на средата отразява хората с работа, която те могат да си позволят да харчат повече
- И накрая, възрастни хора с по-нисък бюджет.
На фигурата по-горе групирате наблюденията на ръка и дефинирате всяка от трите групи. Този пример е донякъде ясен и силно визуален. Ако към набора от данни са добавени нови наблюдения, можете да ги маркирате в кръговете. Вие определяте кръга въз основа на нашата преценка. Вместо това можете да използвате машинно обучение, за да групирате обективно данните.
В този урок ще научите как да използвате алгоритъма k- mean.
K-означава алгоритъм
K-средната стойност е без съмнение най-популярният метод за групиране. Изследователите пуснаха алгоритъма преди десетилетия и са направени много подобрения в k-средата.
Алгоритъмът се опитва да намери групи, като минимизира разстоянието между наблюденията, наречени локални оптимални решения. Разстоянията се измерват въз основа на координатите на наблюденията. Например, в двумерно пространство координатите са прости и.
Алгоритъмът работи както следва:
- Стъпка 1: Изберете групи в плана за функции на случаен принцип
- Стъпка 2: Минимизирайте разстоянието между центъра на клъстера и различните наблюдения ( центроид ). В резултат се получават групи с наблюдения
- Стъпка 3: Преместете първоначалния центроид към средната стойност на координатите в група.
- Стъпка 4: Минимизирайте разстоянието според новите центроиди. Създават се нови граници. По този начин наблюденията ще преминат от една група в друга
- Повтаряйте, докато нито едно наблюдение не променя групите
K-средството обикновено взема евклидовото разстояние между характеристиката и характеристиката:
Предлагат се различни мерки, като например разстоянието до Манхатън или разстоянието Минловски. Имайте предвид, че K-mean връща различни групи всеки път, когато стартирате алгоритъма. Спомнете си, че първите първоначални предположения са произволни и изчисляват разстоянията, докато алгоритъмът достигне хомогенност в рамките на групи. Тоест, k-средната стойност е много чувствителна към първия избор и ако броят на наблюденията и групите не е малък, е почти невъзможно да се получи същото групиране.
Изберете броя на клъстерите
Друга трудност, открита при k-средната стойност, е изборът на броя на клъстерите. Можете да зададете висока стойност, т.е. голям брой групи, за да подобрите стабилността, но може да се окажете с прекалено голямо количество данни. Прекаленото оборудване означава, че производителността на модела намалява значително за нови постъпващи данни. Машината научи малките подробности за набора от данни и се бори да обобщи цялостния модел.
Броят на клъстерите зависи от естеството на набора от данни, индустрията, бизнеса и т.н. Съществува обаче основно правило за избор на подходящия брой клъстери:
с равен на броя на наблюдението в набора от данни.
Най-общо казано, интересно е да прекарвате пъти, за да търсите най-добрата стойност, за да се съобразите с бизнес нуждите.
Ще използваме набора от данни „Цени на личните компютри“, за да извършим нашия клъстерен анализ. Този набор от данни съдържа 6259 наблюдения и 10 функции. Наборът от данни спазва цената от 1993 до 1995 г. на 486 персонални компютъра в САЩ. Променливите са цена, скорост, RAM, екран, CD и други.
Ще продължите по следния начин:
- Импортиране на данни
- Тренирайте модела
- Оценете модела
Импортиране на данни
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,… ## $ trend1, 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-оценка означава, че тази точка е далеч от средната стойност по отношение на стандартното отклонение. 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-mean алгоритъма в нашия набор от данни с пет клъстера и да го наречете pc_cluster.
pc_cluster <-kmeans(rescale_df, 5)
- Списъкът pc_cluster съдържа седем интересни елемента:
- pc_cluster $ 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, което е отвъд намаляващата възвръщаемост. Добавянето на нов клъстер не подобрява променливостта на данните, тъй като остава много малко информация за обяснение.
В този урок намираме тази точка, използвайки мярката за хетерогенност. Сумата от квадратите в рамките на клъстерите е tot.withinss в списъка, върнат от kmean ().
Можете да изградите графика на лакътя и да намерите оптималния k, както следва:
- Стъпка 1: Създайте функция за изчисляване на общата сума в рамките на клъстерите на квадратите
- Стъпка 2: Стартирайте времената на алгоритъма
- Стъпка 3: Създайте рамка за данни с резултатите от алгоритъма
- Стъпка 4: Начертайте резултатите
Стъпка 1) Създайте функция за изчисляване на общата сума в рамките на клъстерите на квадратите
Създавате функцията, която изпълнява k-средния алгоритъм, и съхранявате общата сума в рамките на клъстери сума от квадратчета
kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}
Обяснение на кода
- функция (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
За да създадете топлинна карта, продължавате в три стъпки:
- Изградете рамка за данни със стойностите на центъра и създайте променлива с номера на клъстера
- Преформатирайте данните с функцията collect () на библиотеката 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 () $ размер |