K-znamená Clustering v R s příkladem

Co je to Cluster analýza?

Cluster analýza je součástí učení bez dozoru. Cluster je skupina dat, která sdílejí podobné funkce. Můžeme říci, že shluková analýza je více o objevu než o predikci. Stroj hledá podobnost v datech. Clusterovou analýzu můžete použít například pro následující aplikaci:

  • Segmentace zákazníků: Hledá podobnost mezi skupinami zákazníků
  • Shlukování akciového trhu: Skupinové akcie na základě výkonnosti
  • Snižte rozměrnost souboru dat seskupením pozorování s podobnými hodnotami

ClusterImplementace analýzy není příliš obtížná a je smysluplná i použitelná pro podnikání.

Nejmarkantnější rozdíl mezi učením pod dohledem a učením bez dozoru spočívá ve výsledcích. Učení bez dohledu vytváří novou proměnnou, označení, zatímco učení pod dohledem předpovídá výsledek. Stroj pomáhá praktikovi ve snaze označit data na základě úzké příbuznosti. Je na analytikovi, zda skupiny využije a pojmenuje je.

Uveďme si příklad, abychom porozuměli konceptu shlukování. Pro jednoduchost pracujeme ve dvou dimenzích. Máte k dispozici údaje o celkové útratě zákazníků a jejich věku. Pro zlepšení reklamy chce marketingový tým posílat svým zákazníkům cílenější e-maily.

V následujícím grafu vynesete celkovou útratu a věk zákazní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()

Cluster Analýza

V tomto bodě je vidět vzor

  1. Vlevo dole můžete vidět mladé lidi s nižší kupní silou
  2. Upper-middle odráží lidi s prací, za kterou si mohou dovolit utrácet více
  3. Konečně starší lidé s nižším rozpočtem.

Cluster Analýza

Na obrázku výše seskupujete pozorování ručně a definujete každou ze tří skupin. Tento příklad je poněkud přímočarý a vysoce vizuální. Pokud jsou k sadě dat připojena nová pozorování, můžete je označit v kruzích. Vy definujete kruh na základě našeho úsudku. Místo toho můžete použít Strojové učení objektivně seskupit data.

V tomto tutoriálu se naučíte používat k-znamená algoritmus.

Algoritmus K-means

K-mean je bezpochyby nejoblíbenější shlukovací metoda. Výzkumníci tento algoritmus zveřejnili před desítkami let a na k-means bylo provedeno mnoho vylepšení.

Algoritmus se snaží najít skupiny pomocí minimalizace vzdálenosti mezi pozorováními, tzv lokální optimální řešení. Vzdálenosti se měří na základě souřadnic pozorování. Například ve dvourozměrném prostoru jsou souřadnice jednoduché a .

Algoritmus K-means

Algoritmus funguje následovně:

  • Krok 1: Vyberte skupiny v plánu funkcí náhodně
  • Krok 2: Minimalizujte vzdálenost mezi středem shluku a různými pozorováními (těžiště). Výsledkem jsou skupiny s pozorováním
  • Krok 3: Shift počáteční těžiště k průměru souřadnic v rámci skupiny.
  • Krok 4: Minimalizujte vzdálenost podle nových těžišť. Vytvářejí se nové hranice. Pozorování se tak budou přesouvat z jedné skupiny do druhé
  • Opakujte, dokud žádné pozorování nezmění skupiny

K-means obvykle bere euklidovskou vzdálenost mezi prvkem a prvkem:

Algoritmus K-means

K dispozici jsou různé míry, jako je vzdálenost Manhattan nebo vzdálenost Minlowského. Všimněte si, že K-mean vrací různé skupiny pokaždé, když spustíte algoritmus. Připomeňme, že první počáteční odhady jsou náhodné a vypočítejte vzdálenosti, dokud algoritmus nedosáhne homogenity v rámci skupin. To znamená, že k-mean je velmi citlivý na první volbu, a pokud není počet pozorování a skupin malý, je téměř nemožné získat stejné shlukování.

Vyberte počet shluků

Dalším problémem s k-mean je volba počtu shluků. Můžete nastavit vysokou hodnotu , tj. velký počet skupin, abyste zlepšili stabilitu, ale můžete skončit s overfit dat. Přemontování znamená, že výkon modelu výrazně klesá pro nová přicházející data. Stroj se naučil malé detaily souboru dat a snaží se zobecnit celkový vzorec.

Počet klastrů závisí na povaze souboru dat, odvětví, podnikání a tak dále. Existuje však základní pravidlo pro výběr vhodného počtu clusterů:

Vyberte Počet Clusters

se rovná počtu pozorování v souboru dat.

Obecně řečeno, je zajímavé trávit čas hledáním nejlepší hodnoty, která odpovídá potřebám podniku.

K provedení shlukové analýzy použijeme datový soubor Ceny osobních počítačů. Tento datový soubor obsahuje 6259 pozorování a 10 objektů. Datový soubor sleduje cenu od roku 1993 do roku 1995 486 osobních počítačů v USA. Proměnné jsou mimo jiné cena, rychlost, ram, obrazovka, cd.

Budete postupovat následovně:

  • Importovat data
  • Trénujte model
  • Vyhodnoťte model

Importovat data

Prostředek K není vhodný pro faktorové proměnné, protože je založen na vzdálenosti a diskrétní hodnoty nevrací smysluplné hodnoty. V naší datové sadě můžete odstranit tři kategorické proměnné. Kromě toho v tomto datovém souboru nechybí žádné hodnoty.

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)

Výstup

## 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...

Ze souhrnných statistik můžete vidět, že data mají velké hodnoty. Osvědčeným postupem při výpočtu střední hodnoty k a vzdálenosti je změnit měřítko dat tak, aby se průměr rovnal jedné a směrodatná odchylka se rovnala nule.

summary(df)

Výstup:

##      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

Měřítko proměnných změníte pomocí funkce scale() knihovny dplyr. Transformace snižuje dopad odlehlých hodnot a umožňuje porovnat jediné pozorování s průměrem. Pokud je standardizovaná hodnota (resp z-skóre). odchylky od průměru Všimněte si, že z-skóre sleduje Gaussovo rozdělení a je symetrické kolem průměru.

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 báze má funkci pro spuštění algoritmu k střední. Základní funkce k mean je:

kmeans(df, k)
arguments:
-df: dataset used to run the algorithm
-k: Number of clusters

Trénujte model

Na obrázku tři podrobně popisujete, jak algoritmus funguje. Každý krok můžete vidět graficky se skvělým balíčkem sestaveným Yi Hui (také tvůrce Knit pro Rmarkdown). Animace balíčku není dostupná v knihovně conda. Můžete použít i jiný způsob instalace balíčku pomocí install.packages(“animation”). Můžete zkontrolovat, zda je balíček nainstalován v naší složce Anaconda.

install.packages("animation")

Po načtení knihovny přidáte .ani za kmeans a R vykreslí všechny kroky. Pro ilustraci spouštíte algoritmus pouze se změněnými proměnnými hd a ram se třemi clustery.

set.seed(2345)
library(animation)
kmeans.ani(rescale_df[2:3], 3)

Vysvětlení kódu

  • kmeans.ani(rescale_df[2:3], 3): Vyberte sloupce 2 a 3 datové sady rescale_df a spusťte algoritmus s k sadami na 3. Nakreslete animaci.

Trénujte modelku

Trénujte modelku

Animaci můžete interpretovat následovně:

  • Krok 1: R náhodně vybere tři body
  • Krok 2: Vypočítejte euklidovskou vzdálenost a nakreslete shluky. Máte jeden shluk zeleně vlevo dole, jeden velký shluk zbarvený černě vpravo a červený mezi nimi.
  • Krok 3: Vypočítejte těžiště, tj. průměr shluků
  • Opakujte, dokud cluster nezmění žádná data

Algoritmus konvergoval po sedmi iteracích. Algoritmus k-mean můžete spustit v naší datové sadě s pěti clustery a nazvat jej pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • Seznam pc_cluster obsahuje sedm zajímavých prvků:
  • pc_cluster$cluster: Označuje shluk každého pozorování
  • pc_cluster$centers: Cluster se vycentruje
  • pc_cluster$totss: Celkový součet čtverců
  • pc_cluster$withinss: V rámci součtu čtverce. Počet vrácených komponent se rovná `k`
  • pc_cluster$tot.withinss: Součet uvnitřss
  • pc_clusterbetweenss: Celkový součet čtverců mínus V rámci součtu čtverců
  • pc_cluster$size: Počet pozorování v každém clusteru

K výpočtu optimálního počtu shluků k použijete součet vnitřního součtu čtverce (tj. tot.withinss). Najít k je skutečně podstatný úkol.

Optimální k

Jedna technika pro výběr nejlepšího k se nazývá loketní metoda. Tato metoda využívá k hodnocení variability homogenitu v rámci skupiny nebo heterogenitu v rámci skupiny. Jinými slovy, zajímá vás procento rozptylu vysvětlené každým shlukem. Můžete očekávat, že se variabilita bude zvyšovat s počtem shluků, případně heterogenita klesá. Naším úkolem je najít k, které je za klesajícími výnosy. Přidání nového clusteru nezlepší variabilitu dat, protože zbývá jen velmi málo informací k vysvětlení.

V tomto tutoriálu najdeme tento bod pomocí míry heterogenity. Celkový součet čtverců v rámci clusterů je tot.withinss v seznamu, který vrací kmean().

Můžete sestavit graf lokte a najít optimální k takto:

  • Krok 1: Vytvořte funkci pro výpočet součtu v rámci shluků součtu čtverců
  • Krok 2: Spusťte časy algoritmu
  • Krok 3: Vytvořte datový rámec s výsledky algoritmu
  • Krok 4: Nakreslete výsledky

Krok 1) Sestrojte funkci pro výpočet součtu v rámci shluků součtu čtverců

Vytvoříte funkci, která spustí algoritmus k-mean, a uložíte součet do součet čtverců shluků

kmean_withinss <- function(k) {
    cluster <- kmeans(rescale_df, k)
    return (cluster$tot.withinss)
}

Vysvětlení kódu

  • function(k): Nastavte počet argumentů ve funkci
  • kmeans(rescale_df, k): Spusťte algoritmus kkrát
  • return(cluster$tot.withinss): Uloží celkový součet čtverců v rámci clusteru

Funkci můžete otestovat s rovná se 2.

Výstup:

## Try with 2 cluster
kmean_withinss(2)

Výstup:

## [1] 27087.07

Krok 2) Spusťte algoritmus nkrát

Pomocí funkce sapply() spustíte algoritmus v rozsahu k. Tato technika je rychlejší než vytvoření smyčky a uložení hodnoty.

# Set maximum cluster 
max_k <-20 
# Run algorithm over a range of k 
wss <- sapply(2:max_k, kmean_withinss)

Vysvětlení kódu

  • max_k <-20: Nastavte maximální počet na 20
  • sapply(2:max_k, kmean_withinss): Spusťte funkci kmean_withinss() v rozsahu 2:max_k, tj. 2 až 20.

Krok 3) Vytvořte datový rámec s výsledky algoritmu

Po vytvoření a testování naší funkce můžete spustit algoritmus k-mean v rozsahu od 2 do 20, uložit hodnoty tot.withinss.

# Create a data frame to plot the graph
elbow <-data.frame(2:max_k, wss)

Vysvětlení kódu

  • data.frame(2:max_k, wss): Vytvořte datový rámec s výstupem z úložiště algoritmů ve wss

Krok 4) Nakreslete výsledky

Vykreslíte graf, abyste si vizualizovali, kde je bod lokte

# 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))

Optimální k

Z grafu vidíte, že optimální k je sedm, kde křivka začíná mít klesající návratnost.

Jakmile budete mít naše optimální k, znovu spustíte algoritmus s k rovno 7 a vyhodnotíte shluky.

Zkoumání shluku

pc_cluster_2 <-kmeans(rescale_df, 7)

Jak již bylo zmíněno, máte přístup ke zbývajícím zajímavým informacím v seznamu vráceném kmean().

pc_cluster_2$cluster
pc_cluster_2$centers
pc_cluster_2$size

Hodnotící část je subjektivní a spoléhá na použití algoritmu. Naším cílem je zde shromáždit počítač s podobnými funkcemi. Počítačový chlap může dělat práci ručně a skupinovým počítačem na základě svých odborných znalostí. Tento proces však zabere spoustu času a bude náchylný k chybám. Algoritmus K-mean mu může připravit pole návrhem shluků.

Jako předchozí hodnocení můžete prozkoumat velikost shluků.

pc_cluster_2$size

Výstup:

## [1] 608 1596 1231  580 1003  699  542

První shluk se skládá z 608 pozorování, zatímco nejmenší shluk, číslo 4, má pouze 580 počítačů. Může být dobré mít homogenitu mezi clustery, pokud ne, může být vyžadována tenčí příprava dat.

S centrální komponentou získáte hlubší pohled na data. Řádky odkazují na číslování shluku a sloupce na proměnné používané algoritmem. Hodnoty jsou průměrné skóre každého shluku pro příslušný sloupec. Standardizace usnadňuje interpretaci. Kladné hodnoty znamenají, že z-skóre pro daný shluk je nad celkovým průměrem. Například shluk 2 má nejvyšší cenový průměr ze všech shluků.

center <-pc_cluster_2$centers
center

Výstup:

##   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

Pomocí ggplot můžete vytvořit teplotní mapu, která nám pomůže zvýraznit rozdíl mezi kategoriemi.

Výchozí barvy ggplot je třeba změnit pomocí knihovny RColorBrewer. Můžete použít kondu knihovna a kód ke spuštění v terminálu:

conda install -cr r-rcolorbrewer

Chcete-li vytvořit tepelnou mapu, postupujte ve třech krocích:

  • Sestavte datový rámec s hodnotami středu a vytvořte proměnnou s číslem clusteru
  • Změňte tvar dat pomocí funkce collect() knihovny tidyr. Chcete transformovat data ze širokých na dlouhá.
  • Vytvořte paletu barev s barvouRampFunkce Palette().

Krok 1) Sestavte datový rámec

Vytvořme datovou sadu pro změnu tvaru

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)

Výstup:

##   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		

Krok 2) Změňte tvar dat

Níže uvedený kód vytvoří paletu barev, kterou použijete k vykreslení tepelné mapy.

library(RColorBrewer)
# Create the palette
hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')

Krok 3) Vizualizujte

Můžete vykreslit graf a podívat se, jak shluky vypadají.

# 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()

Zkoumání Cluster

Shrnutí

Algoritmus k-mean můžeme shrnout v tabulce níže

Balíček Objektivní funkce Argument
základna Vlak k-mean kmeans() df, k
Přístupový cluster kmeans()$cluster
Cluster střediska kmeans()$centers
Shluk velikostí kmeans()$velikost