K-tähendab ClusterR programmeerimine näitega
⚡ Nutikas kokkuvõte
K-tähendab ClusterR-is rühmitatakse vaatlusi, minimeerides iga punkti ja selle klastri tsentroidi vahelist kaugust. See samm standardiseerib arvutipõhiste hindade andmestikku, animeerib algoritmi, leiab küünarnukimeetodi abil optimaalse k ja loeb klastreid soojuskaardi abil.

Mis on Cluster analüüs?
Cluster analüüs kuulub järelevalveta õppimine. Klaster on andmete rühm, millel on sarnased funktsioonid. Võime öelda, et rühmitusanalüüs on rohkem avastamine kui ennustus. Masin otsib andmetes sarnasust. Näiteks saate klastrianalüüsi kasutada järgmise rakenduse jaoks:
- Klientide segmenteerimine: otsib sarnasust kliendirühmade vahel
- Aktsiaturgude klasterdamine: Grupi aktsiad tootluste põhjal
- Andmestiku dimensioonilisuse vähendamine grupi järgiping sarnaste väärtustega vaatlused
ClusterAnalüüsi elluviimine ei ole liiga keeruline ning see on ettevõtte jaoks nii mõttekas kui ka rakendatav.
Kõige silmatorkavam erinevus juhendatud ja juhendamata õppimise vahel peitub tulemustes. Juhendajata õppimine loob uue muutuja, sildi, samas kui juhendatud õpe ennustab tulemust. Masin aitab praktiseerijal andmeid tiheda seotuse alusel märgistada. Analüütiku ülesanne on rühmi ära kasutada ja neile nime anda.
Toome näite, et mõista klastrite kontseptsiooni. Lihtsuse huvides töötame kahemõõtmeliselt. Teil on andmed klientide kogukulu ja nende vanuse kohta. Reklaami parandamiseks soovib turundusmeeskond saata oma klientidele rohkem suunatud e-kirju.
Järgmisel graafikul kujutate kogukulu ja klientide vanust.
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()
Sellel hetkel on näha muster
- Vasakpoolses allnurgas näete madalama ostujõuga noori
- Ülemine keskmine peegeldab inimesi, kellel on töö, mida nad saavad lubada rohkem kulutada
- Lõpuks väiksema eelarvega vanemad inimesed.
Ülaltoodud joonisel koondate vaatlused käsitsi ja määratlete kõik kolm rühma. See näide on mõneti otsekohene ja väga visuaalne. Kui andmekogumile on lisatud uusi vaatlusi, saate need ringides sildistada. Te määratlete ringi meie hinnangu põhjal. Selle asemel võite kasutada Masinõpe et andmeid objektiivselt rühmitada.
Sellest õpetusest saate teada, kuidas kasutada k-tähendab algoritm.
K-keskmiste algoritm
K-keskmised on kõige laialdasemalt kasutatav klastrite moodustamise meetod. Algoritm pärineb 1950. aastatest ja seda on sellest ajast alates mitu korda täiustatud.
Algoritm püüab leida rühmi, minimeerides vaatluste vahelist kaugust, nn kohalik optimaalne Lahendused. Vahemaid mõõdetakse vaatluste koordinaatide põhjal. Näiteks kahemõõtmelises ruumis on koordinaadid lihtsalt x ja y.
Algoritm töötab järgmiselt:
- 1. samm: Valige tunnuste ruumist juhuslikult k algkeskmeid
- 2. samm: määrake iga vaatlus lähimasse klastri keskpunkti ehk tsentroidSee tekitab k rühma
- Samm 3: Shift esialgne tsentroid rühmasiseste koordinaatide keskmisele.
- 4. samm: minimeerige kaugus vastavalt uutele tsentroididele. Luuakse uued piirid. Seega liiguvad vaatlused ühest rühmast teise
- Korrake, kuni ükski vaatlus ei muuda rühmi
K-keskmine mõõdab tavaliselt kahe vaatluspunkti x ja y vahelist eukleidilist kaugust:
Saadaval on ka teisi mõõdikuid, näiteks Manhattani või Minkowski kaugus. Pane tähele, et K-mean tagastab iga kord algoritmi käivitamisel erinevad rühmad. Tuleta meelde, et esimesed esialgsed oletused on juhuslikud ja arvuta vahemaid seni, kuni algoritm saavutab rühmades homogeensuse. See tähendab, et k-mean on esimese valiku suhtes väga tundlik ja kui vaatluste ja rühmade arv pole väike, on peaaegu võimatu saada sama klastrite arvu.
Klastrite arvu valimine
Teine k-keskmise puhul esinev raskus on klastrite arvu valik. Rühmasisese homogeensuse parandamiseks saab k väärtuseks määrata suure väärtuse, mis tähendab suurt hulka rühmi, kuid riskite sellega, et üleliigne andmed. Ülesobitamine tähendab, et uute andmete puhul langeb jõudlus järsult, kuna mudel on meelde jätnud selle konkreetse valimi müra, mitte aluseks oleva mustri.
Klastrite arv sõltub andmekogumi olemusest, tööstusest, ärist jne. Siiski on olemas rusikareegel sobiva arvu klastrite valimiseks:
kus n on andmestikus olevate vaatluste arv.
Praktikas tasub kulutada aega k väärtuse otsimisele, mis sobib kõige paremini ettevõtte vajadustega.
Klasterdamisanalüüsi läbiviimiseks kasutame personaalarvutite hindade andmestikku. See andmestik sisaldab 6259 vaatlust ja 10 funktsiooni. Andmekogum jälgib USA-s 1993 personaalarvuti hinda aastatel 1995–486. Muutujad on muu hulgas hind, kiirus, ram, ekraan, cd.
Te jätkate järgmiselt:
- Andmete importimine
- Treeni modelli
- Hinnake mudelit
Andmete importimine
K-keskmised ei sobi faktormuutujate jaoks, kuna see töötab vahemaade puhul ja diskreetsetel siltidel pole omavahel olulist vahemaad. Eemaldage kolm kategoorilist veergu (cd, multi, premium) koos reaindeksiga X. See andmestik ei sisalda puuduvaid väärtusi.
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äljund
## 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...
Kokkuvõtlikust statistikast näete, et andmetel on suured väärtused. Enne mis tahes kaugusel põhineva meetodi kasutamist on hea tava andmed standardiseerida nii, et igal muutujal oleks keskmine null ja standardhälve üksIlma selleta domineeriks hind, mille väärtused ulatuvad tuhandetesse, kauguse arvutamisel ja ekraani suurus ei loeks peaaegu midagi.
summary(df)
Väljund:
## 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
Muutujate skaala muutmine toimub dplyr teegi funktsiooni scale() abil. Teisendus vähendab kõrvalekallete mõju ja võimaldab võrrelda ainuvaatlust keskmisega. Kui standardväärtus (või z-skoor) on kõrge, võite olla kindel, et see tähelepanek on tõepoolest keskmisest kõrgem (suur z-skoor tähendab, et see punkt on standardhälbe poolest keskmisest kaugel. Z-skoor kaks näitab, et väärtus on 2 standard kõrvalekalded keskmisest. Pange tähele, et z-skoor järgib Gaussi jaotust ja on keskmise ümber sümmeetriline.
# Note: speed is deliberately left out of the scaled data frame 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 baasil on funktsioon k keskmise algoritmi käivitamiseks. K-keskmise põhifunktsioon on:
kmeans(df, k) arguments: -df: dataset used to run the algorithm -k: Number of clusters
Treeni modelli
Joonisel kolm kirjeldasite algoritmi toimimist. Iga sammu saate graafiliselt vaadata Yihui Xie kirjutatud animatsioonipaketi abil, kes lõi ka R Markdowni jaoks knitr'i. Pakett ei asu conda kanalites, seega installige see CRAN-ist:
install.packages("animation")
Pärast teegi laadimist lisate .ani pärast kmeans ja R joonistab kõik sammud. Illustratsiooni eesmärgil käitate algoritmi ainult kolme klastriga muudetud muutujatega hd ja ram.
set.seed(2345) library(animation) kmeans.ani(rescale_df[2:3], 3)
Code Selgitus
- kmeans.ani(rescale_df[2:3], 3): valige andmestiku rescale_df veerud 2 ja 3 ning käivitage algoritm k komplektiga väärtusele 3. Joonistage animatsioon.
Animatsiooni saate tõlgendada järgmiselt:
- 1. samm: R valib juhuslikult kolm punkti
- 2. samm: arvutage välja Eukleidiline kaugus ja joonistage klastrid. Teil on üks roheline kobar all vasakul, üks suur musta värvi kobar paremal ja punane nende vahel.
- 3. samm: arvutage välja tsentroid, st klastrite keskmine
- Korrake, kuni andmed ei muuda klastrit
Algoritm lähenes seitsme iteratsiooni järel. Saate käivitada meie viie klastriga andmestiku k-keskmise algoritmi ja nimetada seda pc_cluster.
pc_cluster <-kmeans(rescale_df, 5)
Loendis pc_cluster on seitse kasulikku elementi:
- pc_cluster$cluster: Igale vaatlusele määratud klaster
- pc_cluster$centers: klastri keskused
- pc_cluster$totss: ruutude kogusumma
- pc_cluster$withinss: Ruutude summa piires üks väärtus klastri kohta
- pc_cluster$tot.withinss: withinss-i summa
- pc_cluster$betweenss: Ruutude kogusumma miinus seespool olev ruutude summa
- pc_cluster$size: vaatluste arv igas klastris
Klastrite optimaalse arvu k arvutamiseks kasutate ruudu sisesumma (st tot.withinss) summat. K leidmine on tõepoolest oluline ülesanne.
Kuidas leida optimaalne k küünarnukimeetodi abil
Ühte tehnikat parima k valimiseks nimetatakse küünarnuki meetod. See meetod kasutab varieeruvuse hindamiseks rühmasisest homogeensust või rühmasisest heterogeensust. Teisisõnu huvitab teid iga klastri seletatav dispersiooni protsent. Võite eeldada, et varieeruvus suureneb koos klastrite arvuga, alternatiivselt väheneb heterogeensus. Meie väljakutse on leida k, mis jääb kahanevatest tuludest kaugemale. Uue klastri lisamine ei paranda andmete varieeruvust, sest selgitamiseks on jäänud väga vähe teavet.
Selles õpetuses leiame selle punkti heterogeensuse mõõtmise abil. Klastrite kogusumma ruutude summa on tot.withinss loendis, mille tagastab kmean().
Saate koostada küünarnuki graafiku ja leida optimaalse k järgmiselt:
- 1. samm: konstrueerige funktsioon klastrite ruutude summa arvutamiseks
- 2. samm: Käivitage algoritm k väärtuste vahemikus
- 3. samm: looge andmeraam algoritmi tulemustega
- 4. samm: joonistage tulemused
Step 1) Koostage funktsioon klastrite ruutude summa arvutamiseks
Loote funktsiooni, mis käivitab k-keskmise algoritmi ja salvestate kogusumma klastrite ruutude summa
kmean_withinss <- function(k) { cluster <- kmeans(rescale_df, k) return (cluster$tot.withinss) }
Code Selgitus
- function(k): määrab funktsiooni argumentide arvu
- kmeans(rescale_df, k): Käivita algoritm selle k väärtusega
- return(cluster$tot.withinss): salvestab kogusumma klastrites ruutude summa
Testi funktsiooni, kui k on võrdne 2-ga.
Väljund:
## Try with 2 cluster
kmean_withinss(2)
Väljund:
## [1] 27087.07
Step 2) Käivitage algoritm n korda
Algoritmi käivitamiseks vahemikus k kasutate funktsiooni sapply(). See tehnika on kiirem kui silmuse loomine ja väärtuse salvestamine.
# Set maximum cluster max_k <-20 # Run algorithm over a range of k wss <- sapply(2:max_k, kmean_withinss)
Code Selgitus
- max_k <- 20: Määra k maksimaalseks väärtuseks 20
- sapply(2:max_k, kmean_withinss): käivitage funktsioon kmean_withinss() vahemikus 2:max_k, st 2 kuni 20.
Step 3) Looge andmeraam algoritmi tulemustega
Kui funktsioon on kirjutatud ja testitud, käivitage see vahemikus 2 kuni 20 ja salvestage kõik tot.withinss väärtused.
# Create a data frame to plot the graph elbow <-data.frame(2:max_k, wss)
Code Selgitus
- data.frame(2:max_k, wss): looge andmeraam wss-is oleva algoritmihoidla väljundiga
Step 4) Joonistage tulemused
Joonistate graafiku, et visualiseerida, kus on küünarnuki punkt
# 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))
Graafikult on näha, et optimaalne k on seitse, kus kõver hakkab kahanema.
Kui teil on optimaalne k, käivitate algoritmi uuesti, kus k on 7, ja hindate klastreid.
Klastrite uurimine
pc_cluster_2 <-kmeans(rescale_df, 7)
Nagu varem mainitud, pääsete juurde ülejäänud huvitavale teabele loendis, mille kmean() tagastab.
pc_cluster_2$cluster pc_cluster_2$centers pc_cluster_2$size
Hindamine on subjektiivne ja sõltub klastrite otstarbest. Eesmärk on grupeerida sarnaste spetsifikatsioonidega arvutid. Valdkonnaekspert saaks seda käsitsi teha, kuid protsess oleks aeglane ja veaohtlik. K-tähendab, kas rühm...ping objektiivselt ja jätab eksperdile tulemuse tõlgendamise ja nimetamise.
Eelhinnanguna saate uurida klastrite suurust.
pc_cluster_2$size
Väljund:
## [1] 608 1596 1231 580 1003 699 542
Suurim klaster, number 2, sisaldab 1,596 vaatlust, samas kui väikseim, number 7, sisaldab ainult 542 arvutit. Klastrite vaheline homogeensus võib olla hea, vastasel juhul võib olla vaja õhemat andmetöötlust.
Keskmise komponendi abil saate andmetest sügavama ülevaate. Read tähistavad klastri numeratsiooni ja veerud algoritmi poolt kasutatavaid muutujaid. Väärtused on iga klastri keskmine skoor vastava veeru kohta. Standardiseerimine muudab tõlgendamise lihtsamaks. Positiivsed väärtused näitavad, et antud klastri z-skoor on üldisest keskmisest kõrgem. Näiteks 4. klastril on kõrgeim keskmine hind (price_scal = 1.09), samas kui 5. klastril on see madalaim (-0.82).
center <-pc_cluster_2$centers center
Väljund:
## 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
Saate luua ggploti abil soojuskaardi, mis aitab meil kategooriate erinevusi esile tuua.
Ggploti vaikevärve tuleb RColorBreweri teegiga muuta. Võite kasutada conda raamatukogu ja terminalis käivitatav kood:
conda install -c r r-rcolorbrewer
Soojuskaardi loomiseks toimige kolmes etapis:
- Koostage andmeraam keskuse väärtustega ja looge muutuja klastri numbriga
- Kujundage andmed ümber tidyr teegi funktsiooni kogumine() abil. Soovite andmeid laiadest pikkadeks muuta.
- Looge värvipalett värvigaRampPalette() funktsioon
Step 1) Looge andmeraam
Loome ümberkujundamise andmestiku
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äljund:
## 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
Step 2) Loo värvipalett
Allolev kood loob soojuskaardi värvipaleti.
library(RColorBrewer) # Create the palette hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
Samm 3) Visualiseeri
Saate joonistada graafiku ja vaadata, kuidas klastrid välja näevad.
# 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()
Kuidas saada reprodutseeritavaid K-keskmiste tulemusi funktsioonidega set.seed() ja nstart
Õpetuses märgitakse, et k-means tagastab igal käivitamisel erinevad rühmad. See ei ole iseärasus, millega leppida, vaid probleem kahe standardse lahendusega ja kumbagi ei kasutata ülaltoodud näidetes.
1. Fikseeri alguspunkt funktsiooniga set.seed(). Esialgsed tsentroidid loositakse juhuslikult, seega sama kutse annab iga kord erinevad klastrid. Seemne määramine muudab kogu analüüsi korratavaks:
set.seed(123)
pc_cluster_2 <- kmeans(rescale_df, 7)
2. Käivita mitu starti ja säilita parim nstart abil. Üks juhuslik algus võib koonduda halva lokaalse optimumini. Argument nstart käivitab algoritmi mitu korda erinevatest juhuslikest algustest ja tagastab selle, millel on ruutude summa piires madalaim summa:
set.seed(123)
pc_cluster_2 <- kmeans(rescale_df, centers = 7, nstart = 25)
Tavaliselt soovitatakse kakskümmend viis algust ja see maksab sellise suurusega andmestiku puhul väga vähe. Ilma selleta muutub küünarnukikõver ise ebastabiilseks, sest iga punkt graafikul pärineb ühest ebaõnnestunud või õnnelikust algusest. Varem defineeritud kmean_withinss() funktsioon tuleks seega kirjutada järgmiselt:
kmean_withinss <- function(k) { cluster <- kmeans(rescale_df, centers = k, nstart = 25) return (cluster$tot.withinss) }
3. Tõsta iter.max väärtust, kui algoritm annab hoiatuse. Kui R teatab, et „ei koondunud 10 iteratsiooni jooksul”, siis andke edasi iter.max = 50, et anda sellele rohkem ruumi.
K-keskmised vs hierarhilised Clustersisse R
K-keskmised pole ainus saadaolev klastrite moodustamise meetod ja valik sõltub tavaliselt andmete suurusest ja sellest, kas te juba teate, mitu rühma soovite.
| Kriteeriumid | K-tähendab | Hierarhiline |
|---|---|---|
| Klastrite arv | Tuleb eelnevalt valida | Valitud pärast dendrogrammi lõikamist |
| Tulemuste stabiilsus | Varieerub juhusliku alguse järgi | Deterministlik |
| Skaalautuvus | Haldab väga suuri andmekogumeid | Võitleb üle paari tuhande rea |
| Cluster kujundada | Eeldab ligikaudu sfäärilisi, sarnase suurusega rühmi | Paindlikum |
| Väljund | Lame siltide komplekt | Dendrogramm, mis näitab pesastatud struktuuri |
| R funktsioon | kmeans(df, k) | hclust(dist(df)) |
# Hierarchical alternative on the same scaled data hc <- hclust(dist(rescale_df), method = "ward.D2") plot(hc) groups <- cutree(hc, k = 7)
6,259 vaatluse korral peab hierarhiline klasterdamine looma ligikaudu 19.6 miljonist paarist koosneva kaugusmaatriksi, mistõttu on selle andmestiku jaoks praktiline valik k-keskmised. Pange tähele, et k-keskmised eeldavad sarnase suuruse ja ligikaudu sfäärilise kujuga klastreid; kui see eeldus ei päde, käsitleb DBSCAN ebakorrapäraseid kujusid ja tuvastab erandid, selle asemel et iga punkti rühma sundida.
K-tähendab ClusterR-is: funktsioonide viide
Kõik selles õpetuses kasutatud funktsioonid on loetletud allpool:
| Pakend | Eesmärk | funktsioon | Argument |
|---|---|---|---|
| baas | Treeni k-keskmine | kmeans() | df, k |
| Juurdepääsuklaster | kmeans()$klaster | ||
| Cluster keskused | kmeans()$keskused | ||
| Cluster suurused | kmeans()$ suurus | ||
| Kokku ruutude summa piires | kmeans()$tot.withinss | Kasutatakse küünarnuki meetodil | |
| Ruutude summa vahel | kmeans()$betweenss | ||
| baas | Reprodutseeritav jooks | set.seed() | seemneväärtus |
| baas | Tulemuse stabiliseerimine | kmeans(df, k, nstart = 25) | nstart |








