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()
V tomto bodě je vidět vzor
- Vlevo dole můžete vidět mladé lidi s nižší kupní silou
- Upper-middle odráží lidi s prací, za kterou si mohou dovolit utrácet více
- Konečně starší lidé s nižším rozpočtem.
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 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:
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ů:
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.
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))
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()
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 |