K reiškia grupavimą R su pavyzdžiu

Šioje pamokoje sužinosite

  • Kas yra klasterio analizė?
  • K reiškia algoritmą
  • Optimalus k

Kas yra klasterio analizė?

Klasterinė analizė yra neprižiūrimo mokymosi dalis . Klasteris yra duomenų grupė, turinti panašių funkcijų. Galime sakyti, grupių analizė labiau susijusi su atradimu, o ne su prognoze. Mašina ieško duomenų panašumo. Pvz., Galite naudoti grupių analizę šiai programai:

  • Klientų segmentavimas: ieškoma panašumo tarp klientų grupių
  • Vertybinių popierių rinkos grupavimas: Grupės akcijos pagal rezultatus
  • Sumažinkite duomenų rinkinio matmenis, sugrupuodami stebėjimus su panašiomis vertėmis

Klasterių analizę nėra per sunku įgyvendinti, ji yra prasminga ir pritaikoma verslui.

Ryškiausias skirtumas tarp prižiūrimo ir neprižiūrimo mokymosi slypi rezultatuose. Neprižiūrimas mokymasis sukuria naują kintamąjį - etiketę, o prižiūrimas mokymas numato rezultatą. Mašina padeda specialistui ieškant duomenų pažymėti remiantis artimu ryšiu. Analitikas turi pasinaudoti grupėmis ir suteikti joms vardą.

Pateikime pavyzdį, kad suprastume klasterių sampratą. Siekdami paprastumo, dirbame dviem aspektais. Turite duomenų apie visas klientų išlaidas ir jų amžių. Siekdama pagerinti reklamą, rinkodaros komanda nori savo klientams siųsti tikslingesnius el. Laiškus.

Šioje diagramoje nurodote visas išlaidas ir klientų amžių.

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

Šiuo metu matomas raštas

  1. Apačioje kairėje galite pamatyti jaunų žmonių, turinčių mažesnę perkamąją galią
  2. Viršutinis vidurys atspindi žmones, kurie gali sau leisti daugiau išleisti
  3. Pagaliau vyresnio amžiaus žmonės, turintys mažesnį biudžetą.

Aukščiau pateiktame paveikslėlyje stebėjimus galite sugrupuoti ranka ir apibrėžti kiekvieną iš trijų grupių. Šis pavyzdys yra šiek tiek paprastas ir labai vizualus. Jei prie duomenų rinkinio pridedami nauji stebėjimai, juos galite pažymėti apskritimuose. Apskritimą apibrėžiate remdamiesi mūsų sprendimu. Vietoj to, naudodami mašininį mokymąsi, galite objektyviai grupuoti duomenis.

Šioje pamokoje sužinosite, kaip naudoti k reikšmės algoritmą.

K reiškia algoritmą

K-mean yra, be abejonės, populiariausias grupių metodas. Mokslininkai išleido algoritmą prieš kelis dešimtmečius, o k-priemonės buvo atliktos daug patobulinimų.

Algoritmas bando rasti grupes sumažindamas atstumą tarp stebėjimų, vadinamų optimaliais lokaliais sprendimais. Atstumai matuojami remiantis stebėjimų koordinatėmis. Pavyzdžiui, dvimatėje erdvėje koordinatės yra paprastos ir.

Algoritmas veikia taip:

  • 1 žingsnis: Atsitiktinai pasirinkite grupes funkcijų plane
  • 2 žingsnis: sumažinkite atstumą tarp klasterio centro ir skirtingų stebėjimų ( centroido ). Rezultatas yra grupės su stebėjimais
  • 3 žingsnis: perkelkite pradinį centroidą į koordinačių vidurkį grupėje.
  • 4 žingsnis: sumažinkite atstumą pagal naujus centroidus. Kuriamos naujos ribos. Taigi stebėjimai pereis iš vienos grupės į kitą
  • Kartokite tol, kol joks stebėjimas nepakeis grupės

K reikšmės paprastai euklido atstumu tarp objekto ir objekto:

Galimos įvairios priemonės, tokios kaip Manheteno atstumas arba Minlowskio atstumas. Atkreipkite dėmesį, kad K vidurkis kiekvieną kartą paleidus algoritmą grąžina skirtingas grupes. Primename, kad pirmieji pradiniai spėjimai yra atsitiktiniai ir apskaičiuokite atstumus, kol algoritmas pasieks homogeniškumą grupėse. Tai reiškia, kad k-vidurkis yra labai jautrus pirmajam pasirinkimui ir, jei stebėjimų ir grupių skaičius yra nedidelis, beveik neįmanoma gauti to paties klasterio.

Pasirinkite grupių skaičių

Kitas sunkumas, nustatytas naudojant k-vidurkį, yra grupių skaičiaus pasirinkimas. Norėdami padidinti stabilumą, galite nustatyti didelę grupių vertę, ty daugybę grupių, tačiau duomenų gali būti per daug . Perkrovimas reiškia, kad modelio našumas žymiai sumažėja gaunant naujus duomenis. Mašina sužinojo mažai duomenų rinkinio detalių ir stengėsi apibendrinti bendrą modelį.

Grupių skaičius priklauso nuo duomenų rinkinio pobūdžio, pramonės, verslo ir pan. Tačiau yra tinkama taisyklė, pagal kurią reikia pasirinkti tinkamą grupių skaičių:

su lygu stebėjimo skaičiui duomenų rinkinyje.

Apskritai, įdomu praleisti laiką ieškant geriausios kainos, atitinkančios verslo poreikius.

Grupinių grupių analizei naudosime „Personal Computers“ duomenų rinkinį. Šiame duomenų rinkinyje yra 6259 stebėjimai ir 10 funkcijų. Duomenų rinkinyje stebima 486 asmeninių kompiuterių kaina 1993–1995 m. JAV. Kintamieji yra kaina, greitis, avinas, ekranas, kompaktinis diskas.

Jūs elgsitės taip:

  • Importuoti duomenis
  • Mokykite modelį
  • Įvertinkite modelį

Importuoti duomenis

K reikšmė netinka veiksnių kintamiesiems, nes ji yra pagrįsta atstumu, o diskrečios vertės negrąžina reikšmingų reikšmių. Mūsų duomenų rinkinyje galite ištrinti tris kategorinius kintamuosius. Be to, šiame duomenų rinkinyje nėra trūkstamų reikšmių.

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

Iš suvestinės statistikos matote, kad duomenų vertės yra didelės. Gera praktika su k vidurkio ir atstumo skaičiavimu yra duomenų skalė taip, kad vidurkis būtų lygus vienam, o standartinis nuokrypis būtų lygus nuliui.

summary(df)

Išvestis:

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

Jūs pakeisite kintamuosius naudodamiesi dplyr bibliotekos skalės () funkcija. Transformacija sumažina pašalinių efektų poveikį ir leidžia palyginti vienintelį stebėjimą su vidurkiu. Jei standartizuota vertė (arba z balas ) yra aukšta, galite būti tikri, kad šis pastebėjimas iš tikrųjų yra didesnis už vidurkį (didelis z balas reiškia, kad šis taškas yra toli nuo vidurkio, kalbant apie standartinį nuokrypį. dviejų balų reikšmė rodo, kad reikšmė yra 2 standartiniai nuokrypiai nuo vidurkio.

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 bazė turi funkciją paleisti k vidurkio algoritmą. Pagrindinė k vidurkio funkcija yra:

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

Mokykite modelį

Trečiame paveiksle jūs išsamiai aprašėte, kaip veikia algoritmas. Kiekvieną žingsnį galite pamatyti grafiškai su puikiu paketo komponavimu, kurį sukūrė Yi Hui (taip pat „Knit for Rmarkdown“ kūrėjas). Kompleksinės animacijos nėra daugiabučių namų bibliotekoje. Galite naudoti kitą būdą, kaip įdiegti paketą su install.packages („animacija“). Galite patikrinti, ar paketas įdiegtas mūsų aplanke „Anaconda“.

install.packages("animation") 

Įkėlę biblioteką, pridedate .ani po kmeans ir R nubrėžia visus veiksmus. Norėdami iliustruoti, paleidžiate algoritmą tik su pakeistais kintamaisiais hd ir ram su trimis grupėmis.

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

Kodo paaiškinimas

  • kmeans.ani (rescale_df [2: 3], 3): Pasirinkite rescale_df duomenų rinkinio 2 ir 3 stulpelius ir paleiskite algoritmą k rinkiniais į 3. Nubraižykite animaciją.

Animaciją galite interpretuoti taip:

  • 1 žingsnis: R atsitiktinai pasirenka tris taškus
  • 2 žingsnis: Apskaičiuokite Euklido atstumą ir nubrėžkite grupes. Apačioje kairėje turite vieną žalią grupę, dešinėje juodą spalvą ir tarp jų raudoną.
  • 3 žingsnis: Apskaičiuokite centroidą, ty grupių vidurkį
  • Pakartokite tol, kol duomenys nesikeis

Algoritmas suartėjo po septynių pakartojimų. Mūsų duomenų rinkinyje galite paleisti k-mean algoritmą su penkiomis grupėmis ir pavadinti jį pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • Sąraše pc_cluster yra septyni įdomūs elementai:
  • pc_cluster $ cluster: nurodo kiekvieno stebėjimo grupę
  • pc_cluster $ centrai: klasterio centrai
  • pc_cluster $ totss: Bendra kvadratų suma
  • pc_cluster $ withinss: Kvadrato sumoje. Grąžinamų komponentų skaičius yra lygus `k`
  • pc_cluster $ tot.withinss: „withinss“ suma
  • pc_clusterbetweenss: Bendra kvadrato suma atėmus kvadrato sumą
  • pc_cluster $ size: stebėjimų skaičius kiekviename klasteryje

Norėdami apskaičiuoti optimalų grupių k skaičių, naudosite kvadrato sumos sumą (ty tot.withinss). K rasti iš tikrųjų yra esminė užduotis.

Optimalus k

Viena iš būdų pasirinkti geriausią k vadinama alkūnės metodu . Šis metodas naudoja kintamumą grupės viduje arba grupės viduje. Kitaip tariant, jus domina kiekvieno klasterio paaiškinta dispersijos procentinė dalis. Galite tikėtis, kad kintamumas didės priklausomai nuo grupių skaičiaus, taip pat mažėja heterogeniškumas. Mūsų uždavinys yra rasti k, kuris yra už mažėjančios grąžos. Pridėjus naują grupę, duomenų kintamumas nepagerėja, nes paaiškinti lieka labai mažai informacijos.

Šioje pamokoje randame šį tašką naudodami heterogeniškumo matą. Bendra kvadratuose esančių grupių suma yra total.withinss sąraše, grąžinant kmean ().

Galite sukonstruoti alkūnės grafiką ir rasti optimalų k:

  • 1 žingsnis: Sukurkite funkciją, kad apskaičiuotumėte bendrą skaičių grupėse kvadratų sumą
  • 2 žingsnis: paleiskite algoritmo laikus
  • 3 žingsnis: sukurkite duomenų rėmelį su algoritmo rezultatais
  • 4 žingsnis: Nubraižykite rezultatus

1 žingsnis. Sukurkite funkciją, kad apskaičiuotumėte bendrą skaičių grupėse kvadratų sumą

Sukuriate funkciją, kuri vykdo k-vidurkio algoritmą, ir visą kaupiate grupių kvadratų sumoje

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

Kodo paaiškinimas

  • funkcija (k): nustatykite funkcijos argumentų skaičių
  • kmeans (rescale_df, k): paleiskite algoritmą k kartus
  • grąža (klasteris $ tot.withinss): išsaugokite sumą grupių kvadratų sumoje

Funkciją galite išbandyti lygia 2.

Išvestis:

## Try with 2 cluster
kmean_withinss(2)

Išvestis:

## [1] 27087.07 

2 žingsnis) Paleiskite algoritmą n kartų

Norėdami paleisti algoritmą k diapazone, naudosite funkciją sapply (). Ši technika yra greitesnė nei sukurti kilpą ir išsaugoti vertę.

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

Kodo paaiškinimas

  • max_k <-20: nustatykite didžiausią skaičių iki 20
  • sapply (2: max_k, kmean_withinss): Vykdykite funkciją kmean_withinss () 2 diapazone: max_k, ty nuo 2 iki 20.

3 žingsnis) Sukurkite duomenų rėmelį su algoritmo rezultatais

Sukūrę ir išbandę mūsų funkciją, galite paleisti k-mean algoritmą nuo 2 iki 20, išsaugoti tot.withinss reikšmes.

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

Kodo paaiškinimas

  • data.frame (2: max_k, wss): sukurkite duomenų rėmelį su algoritmo saugyklos išvestimi wss

4 žingsnis) Nubraižykite rezultatus

Braižote grafiką, kad būtų galima vizualizuoti, kur yra alkūnės taškas

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

Iš grafiko matote, kad optimalus k yra septyni, kur kreivės grąža pradeda mažėti.

Kai turėsite optimalų k, pakartotinai paleisite algoritmą su k lygus 7 ir įvertinsite grupes.

Nagrinėjant klasterį

pc_cluster_2 <-kmeans(rescale_df, 7)

Kaip minėta anksčiau, galite rasti likusią įdomią informaciją, pateiktą kmean () sąraše.

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

Vertinimo dalis yra subjektyvi ir remiasi algoritmo naudojimu. Mūsų tikslas čia yra surinkti panašių funkcijų kompiuterį. Kompiuterių vaikinas gali atlikti darbą rankomis ir grupuoti kompiuterį, remdamasis savo patirtimi. Tačiau procesas užtruks daug laiko ir bus linkęs į klaidas. K-vidurkio algoritmas gali jam / jai paruošti lauką, siūlydamas klasterius.

Kaip išankstinį vertinimą galite išnagrinėti grupių dydį.

pc_cluster_2$size

Išvestis:

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

Pirmąjį klasterį sudaro 608 stebėjimai, o mažiausiame klasteryje - 4 - yra tik 580 kompiuterių. Gali būti gerai, kad klasteriai yra vienodi, jei ne, gali reikėti paruošti plonesnius duomenis.

Galite giliau pažvelgti į duomenis naudodami centrinį komponentą. Eilėse nurodomas sankaupos numeravimas, o stulpeliuose - algoritmo naudojami kintamieji. Vertės yra kiekvieno klasterio vidutinis balas pagal susidomėjusį stulpelį. Standartizavimas palengvina aiškinimą. Teigiamos vertės rodo, kad tam tikro klasterio z rezultatas yra didesnis nei bendras vidurkis. Pavyzdžiui, 2 klasteris turi aukščiausią kainų vidurkį tarp visų klasterių.

center <-pc_cluster_2$centerscenter

Išvestis:

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

Galite sukurti šilumos žemėlapį naudodami „ggplot“, kad padėtumėte mums pabrėžti skirtumą tarp kategorijų.

Numatytąsias „ggplot“ spalvas reikia pakeisti naudojant „RColorBrewer“ biblioteką. Norėdami naudoti terminalą, galite naudoti „conda“ biblioteką ir kodą:

conda install -cr r-rcolorbrewer

Norėdami sukurti šilumos žemėlapį, atlikite tris veiksmus:

  • Sukurkite duomenų rėmą su centro reikšmėmis ir sukurkite kintamąjį su klasterio numeriu
  • Suformuokite duomenis naudodamiesi „tidyr“ bibliotekos funkcija collect (). Norite transformuoti duomenis iš plačių į ilgus.
  • Sukurkite spalvų paletę naudodami funkciją colorRampPalette ()

1 žingsnis) Sukurkite duomenų rėmelį

Sukurkime pertvarkyti duomenų rinkinį

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)

Išvestis:

## 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 veiksmas) pertvarkykite duomenis

Žemiau pateiktas kodas sukuria spalvų paletę, kurią naudosite planuodami šilumos žemėlapį.

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

3 žingsnis) Vizualizuokite

Galite braižyti diagramą ir pamatyti, kaip atrodo klasteriai.

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

Santrauka

K-vidurkio algoritmą galime apibendrinti žemiau esančioje lentelėje

Pakuotė

Tikslas

funkcija

argumentas

bazė

Traukinio k-vidurkis

kmeans ()

df, k

Prieigos klasteris

kmeans () $ klasteris

Klasterių centrai

kmeans () $ centrai

Dydžių klasteris

kmeans () $ dydis

Įdomios straipsniai...