K-znamená shlukování v R s příkladem

Obsah:

Anonim

V tomto výukovém programu se naučíte

  • Co je to klastrová analýza?
  • Algoritmus K-means
  • Optimální k

Co je to klastrová analýza?

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

  • Segmentace zákazníků: Hledá podobnost mezi skupinami zákazníků
  • Shlukování akciových trhů: Skupinové akcie na základě výkonů
  • Snižte rozměrnost datové sady seskupením pozorování s podobnými hodnotami

Klastrová analýza není příliš obtížná na provedení a je pro podnikání smysluplná a použitelná.

Nejvýraznější rozdíl mezi supervizovaným a nekontrolovaným učením spočívá ve výsledcích. Neupravené učení vytváří novou proměnnou, štítek, zatímco supervizované učení předpovídá výsledek. Stroj pomáhá odborníkovi při hledání označení údajů na základě blízké příbuznosti. Je na analytikovi, aby tyto skupiny využil a pojmenoval je.

Pojďme si udělat příklad, abychom pochopili koncept shlukování. Pro zjednodušení pracujeme ve dvou dimenzích. Máte údaje o celkových výdajích zákazníků a jejich věku. Za účelem zlepšení reklamy chce marketingový tým zasílat cílenější e-maily svým zákazníkům.

V následujícím grafu vynesete celkové výdaje 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 viditelný vzor

  1. Vlevo dole můžete vidět mladé lidi s nižší kupní silou
  2. Horní a střední část odráží lidi s prací, kterou si mohou dovolit utrácet více
  3. 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 datové sadě připojena nová pozorování, můžete je označit v kruzích. Kruh definujete na základě našeho úsudku. Místo toho můžete pomocí Machine Learning objektivně seskupit data.

V tomto kurzu se naučíte, jak používat algoritmus k-means .

Algoritmus K-means

K-mean je bezpochyby nejoblíbenější metodou shlukování. Vědci tento algoritmus vydali před desítkami let a v k-means bylo provedeno mnoho vylepšení.

Algoritmus se snaží najít skupiny minimalizací vzdálenosti mezi pozorováními, které se nazývají lokální optimální řešení. Vzdálenosti se měří na základě souřadnic pozorování. Například v 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 hvězdokupy a různými pozorováními ( těžiště ). Výsledkem jsou skupiny s pozorováním
  • Krok 3: Posuňte počáteční těžiště na průměr souřadnic ve skupině.
  • Krok 4: Minimalizujte vzdálenost podle nových centroidů. Jsou vytvořeny nové hranice. Pozorování se tedy 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 na Manhattanu nebo vzdálenost na Minlowski. 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čítat vzdálenosti, dokud algoritmus nedosáhne homogenity ve skupinách. To znamená, že k-mean je velmi citlivý na první volbu, a pokud počet pozorování a skupin není malý, je téměř nemožné získat stejné shlukování.

Vyberte počet klastrů

Dalším problémem nalezeným u k-mean je volba počtu klastrů. Můžete nastavit vysokou hodnotu, tj. Velký počet skupin, pro zlepšení stability, ale můžete skončit s přeplněním dat. Overfitting znamená, že výkon modelu se u nových nadcházejících dat podstatně snižuje. Stroj se naučil malé podrobnosti o datové sadě a snaží se zobecnit celkový vzor.

Počet klastrů závisí na povaze souboru dat, odvětví, podnikání atd. Existuje však obecné pravidlo pro výběr příslušného počtu klastrů:

se rovná počtu pozorování v datové sadě.

Obecně lze říci, že je zajímavé trávit čas hledáním toho nejlepšího, co odpovídá potřebám firmy.

K provedení naší shlukové analýzy použijeme datový soubor Ceny osobních počítačů. Tato datová sada obsahuje 6 259 pozorování a 10 funkcí. Soubor údajů sleduje cenu 486 osobních počítačů v USA v letech 1993 až 1995. Proměnné jsou mimo jiné cena, rychlost, ram, obrazovka, cd.

Budete postupovat následovně:

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

Importovat data

K means není vhodný pro faktorové proměnné, protože je založen na vzdálenosti a diskrétní hodnoty nevracejí smysluplné hodnoty. V našem datovém souboru můžete odstranit tři kategorické proměnné. Kromě toho v této datové sadě nejsou žádné chybějící 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  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1… 

Ze souhrnné statistiky můžete vidět, že data mají velké hodnoty. Dobrým postupem při výpočtu k střední a vzdálenosti k je změna měřítka 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

Proměnné změníte pomocí funkce scale () knihovny dplyr. Transformace snižuje dopad odlehlých hodnot a umožňuje porovnat jediné pozorování se střední hodnotou. Pokud je standardizovaná hodnota (nebo z-skóre ) vysoká, můžete si být jisti, že toto pozorování je skutečně nad průměrem (velké z-skóre znamená, že tento bod je daleko od průměru z hlediska směrodatné odchylky. skóre dvou značí, že hodnota je 2 standardní 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 základna má funkci pro spuštění k průměrného algoritmu. Základní funkce k střední hodnoty je:

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

Trénujte model

Na obrázku tři jste podrobně popsali, jak algoritmus funguje. Každý krok můžete vidět graficky pomocí skvělého balíčku vytvořeného Yi Hui (také tvůrcem Knit pro Rmarkdown). Animace balíčku není v knihovně conda k dispozici. Můžete použít jiný způsob instalace balíčku pomocí install.packages ("animace"). 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 po kmeans a R vykreslí všechny kroky. Pro ilustraci spustíte algoritmus pouze se změněnými proměnnými hd a ram se třemi klastry.

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 se sadami k na 3. Vykreslete 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. Vlevo dole máte jeden shluk zeleně, vpravo jeden velký shluk černě a mezi nimi červený.
  • Krok 3: Vypočítejte těžiště, tj. Průměr klastrů
  • Opakujte, dokud se žádný soubor nezmění data

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

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

Součet vnitřního součtu čtverců (tj. Tot. Do hloubky) použijete k výpočtu optimálního počtu klastrů k. Nalezení k je skutečně podstatný úkol.

Optimální k

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

V tomto kurzu najdeme tento bod pomocí míry heterogenity. Celkový součet čtverců v klastrech je tot. S návratem v seznamu podle kmean ().

Můžete sestrojit loketní graf a najít optimální k následujícím způsobem:

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

Krok 1) Vytvořte funkci pro výpočet součtu čtverců v klastrech

Vytvoříte funkci, která spouští algoritmus k-mean a uložíte součet v klastrech součet čtverců

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

Vysvětlení kódu

  • funkce (k): Nastaví počet argumentů ve funkci
  • kmeans (rescale_df, k): Spusťte algoritmus k krát
  • návrat (shluk $ tot.withinss): Uložte celkem v rámci shluků součet čtverců

Funkci můžete otestovat rovnou 2.

Výstup:

## Try with 2 cluster
kmean_withinss(2)

Výstup:

## [1] 27087.07 

Krok 2) Spusťte algoritmus nkrát

K spuštění algoritmu v rozsahu k použijete funkci sapply (). Tato technika je rychlejší než vytvoření smyčky a uložení hodnoty.

# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- 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 graphelbow <-data.frame(2:max_k, wss)

Vysvětlení kódu

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

Krok 4) Vyneste výsledky

Graf vykreslíte, abyste si představili, kde je loketní bod

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

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

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

Prozkoumejte shluk

pc_cluster_2 <-kmeans(rescale_df, 7)

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

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

Hodnotící část je subjektivní a spoléhá se na použití algoritmu. Naším cílem je zde shromáždit počítač s podobnými funkcemi. Počítačový člověk může dělat práci ručně a skupinový počítač 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 navrhováním shluků.

Jako předběžné vyhodnocení můžete prozkoumat velikost klastrů.

pc_cluster_2$size

Výstup:

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

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

Získáte hlubší pohled na data pomocí středové komponenty. Řádky odkazují na číslování klastru a sloupce proměnné použité algoritmem. Hodnoty představují průměrné skóre každého klastru pro daný sloupec. Standardizace usnadňuje interpretaci. Kladné hodnoty naznačují, že z-skóre pro daný klastr je nad celkovou střední hodnotou. Například klastr 2 má nejvyšší cenový průměr ze všech klastrů.

center <-pc_cluster_2$centerscenter

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. Ke spuštění v terminálu můžete použít knihovnu conda a kód:

conda install -cr r-rcolorbrewer

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

  • Vytvořte datový rámec s hodnotami středu a vytvořte proměnnou s číslem klastru
  • Upravte data pomocí funkce collect () knihovny tidyr. Chcete transformovat data ze širokého na dlouhý.
  • Vytvořte paletu barev pomocí funkce colorRampPalette ()

Krok 1) Vytvořte datový rámec

Vytvořme datovou sadu přetváření

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)

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) Upravte data

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

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

Krok 3) Vizualizujte

Můžete vykreslit graf a zjistit, jak vypadají shluky.

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

souhrn

Můžeme shrnout k-střední algoritmus v tabulce níže

Balík

Objektivní

funkce

argument

základna

Vlak k-střední

kmeans ()

df, k

Přístup ke clusteru

kmeans () $ cluster

Klastrová centra

kmeans () $ center

Velikost clusteru

kmeans () $ velikost