K-välineiden ClusterR:ssä esimerkin kanssa
Mikä on Cluster analyysi?
Cluster analyysi on osa ohjaamaton oppiminen. Klusteri on joukko tietoja, joilla on samanlaisia ominaisuuksia. Voidaan sanoa, että klusterianalyysi on enemmän löytöä kuin ennustetta. Kone etsii tietojen samankaltaisuutta. Voit käyttää klusterianalyysiä esimerkiksi seuraavalle sovellukselle:
- Asiakkaiden segmentointi: Etsii samankaltaisuutta asiakasryhmien välillä
- Osakemarkkinoiden klusterointi: Ryhmäosakkeet suoritusten perusteella
- Vähennä tietojoukon ulottuvuutta ryhmittelemällä havainnot, joilla on samanlaiset arvot
ClusterAnalyysi ei ole liian vaikea toteuttaa ja se on liiketoiminnan kannalta mielekästä ja toimintakelpoista.
Silmiinpistävin ero ohjatun ja ohjaamattoman oppimisen välillä on tuloksissa. Ohjaamaton oppiminen luo uuden muuttujan, tunnisteen, kun taas ohjattu oppiminen ennustaa lopputuloksen. Kone auttaa ammatinharjoittajaa merkitsemään tiedot läheisen sukulaisuuden perusteella. On analyytikon tehtävä käyttää ryhmiä ja antaa niille nimi.
Tehdään esimerkki klusteroinnin käsitteen ymmärtämiseksi. Yksinkertaisuuden vuoksi työskentelemme kahdessa ulottuvuudessa. Sinulla on tietoja asiakkaiden kokonaiskulutuksesta ja heidän iästään. Mainonnan parantamiseksi markkinointitiimi haluaa lähettää asiakkailleen kohdistetumpia sähköposteja.
Seuraavassa kaaviossa kuvaat kokonaiskulutuksen ja asiakkaiden iän.
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()
Tässä vaiheessa näkyy kuvio
- Vasemmassa alakulmassa näet nuoret, joilla on heikompi ostovoima
- Ylempi keskiarvo kuvastaa ihmisiä, joilla on työpaikka, johon heillä on varaa kuluttaa enemmän
- Lopuksi vanhukset pienemmällä budjetilla.
Yllä olevassa kuvassa ryhmittelet havainnot käsin ja määrität kukin kolmesta ryhmästä. Tämä esimerkki on melko suoraviivainen ja erittäin visuaalinen. Jos tietojoukkoon liitetään uusia havaintoja, voit merkitä ne ympyröiden sisällä. Sinä määrittelet ympyrän arviomme perusteella. Sen sijaan voit käyttää Koneen oppiminen ryhmitellä tiedot objektiivisesti.
Tässä opetusohjelmassa opit käyttämään k-tarkoittaa algoritmi.
K-keinoalgoritmi
K-keskiarvo on epäilemättä suosituin klusterointimenetelmä. Tutkijat julkaisivat algoritmin vuosikymmeniä sitten, ja k-keskiarvoon on tehty paljon parannuksia.
Algoritmi yrittää löytää ryhmiä minimoimalla havaintojen välisen etäisyyden, ns paikallinen optimaalinen ratkaisuja. Etäisyydet mitataan havaintojen koordinaattien perusteella. Esimerkiksi kaksiulotteisessa avaruudessa koordinaatit ovat yksinkertaisia ja .
Algoritmi toimii seuraavasti:
- Vaihe 1: Valitse ryhmät ominaisuussuunnitelmasta satunnaisesti
- Vaihe 2: Minimoi klusterin keskustan ja eri havaintojen välinen etäisyys (sentroidi). Se johtaa ryhmiin havaintojen kanssa
- Vaihe 3: Shift aloituskeskipiste ryhmän koordinaattien keskiarvoon.
- Vaihe 4: Minimoi etäisyys uusien sentroidien mukaan. Uusia rajoja luodaan. Näin havainnot siirtyvät ryhmästä toiseen
- Toista, kunnes mikään havainto ei vaihda ryhmiä
K-keskiarvo ottaa yleensä euklidisen etäisyyden kohteen ja piirteen välillä:
Saatavilla on erilaisia mittoja, kuten Manhattanin etäisyys tai Minlowskin etäisyys. Huomaa, että K-keskiarvo palauttaa eri ryhmät joka kerta, kun suoritat algoritmin. Muista, että ensimmäiset arvaukset ovat satunnaisia ja laske etäisyydet, kunnes algoritmi saavuttaa homogeenisuuden ryhmien sisällä. Eli k-keskiarvo on erittäin herkkä ensimmäiselle valinnalle, ja ellei havaintojen ja ryhmien määrä ole pieni, on lähes mahdotonta saada sama klusterointi.
Valitse klusterien määrä
Toinen k-keskiarvon vaikeus on klustereiden lukumäärän valinta. Voit asettaa suuren arvon , eli suuren määrän ryhmiä parantaaksesi vakautta, mutta saatat päätyä siihen overfit tiedoista. Ylisovitus tarkoittaa, että mallin suorituskyky heikkenee huomattavasti uusien tulevien tietojen osalta. Kone oppi tietojoukon pienet yksityiskohdat ja kamppaili yleiskaavan yleistämiseksi.
Klusterien määrä riippuu tietojoukon luonteesta, toimialasta, liiketoiminnasta ja niin edelleen. On kuitenkin olemassa nyrkkisääntö sopivan klusterimäärän valitsemiseksi:
on yhtä suuri kuin havaintojen määrä tietojoukossa.
Yleisesti ottaen on mielenkiintoista käyttää aikoja parhaan vastineen etsimiseen liiketoiminnan tarpeisiin sopivaksi.
Käytämme henkilökohtaisten tietokoneiden hinnat -tietojoukkoa klusterointianalyysimme suorittamiseen. Tämä tietojoukko sisältää 6259 10 havaintoa ja 1993 ominaisuutta. Aineisto seuraa 1995 henkilökohtaisen tietokoneen hintaa Yhdysvalloissa vuosina 486–XNUMX. Muuttujia ovat muun muassa hinta, nopeus, ram, näyttö, cd.
Toimit seuraavasti:
- Tuo päivämäärät
- Harjoittele mallia
- Arvioi malli
Tuo päivämäärät
K-keskiarvo ei sovellu tekijämuuttujille, koska se perustuu etäisyyteen ja diskreetit arvot eivät palauta merkityksellisiä arvoja. Voit poistaa tietojoukostamme kolme kategorista muuttujaa. Lisäksi tästä tietojoukosta ei ole puuttuvia arvoja.
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)
ulostulo
## 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...
Yhteenvetotilastoista näet, että tiedoilla on suuria arvoja. Hyvä käytäntö k-keskiarvon ja etäisyyden laskennassa on skaalata tiedot uudelleen siten, että keskiarvo on yhtä ja keskihajonnan suuruus on nolla.
summary(df)
lähtö:
## 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
Skaalat muuttujat uudelleen dplyr-kirjaston scale()-funktiolla. Muunnos vähentää poikkeamien vaikutusta ja mahdollistaa yhden havainnon vertaamisen keskiarvoon. Jos standardoitu arvo (tai z-pistemäärä) on korkea, voit olla varma, että tämä havainto on todellakin keskiarvon yläpuolella (suuri z-piste tarkoittaa, että tämä piste on kaukana keskihajonnan keskiarvosta. Z-pisteet kaksi tarkoittaa, että arvo on 2 standardia Huomaa, että z-pistemäärä noudattaa Gaussin jakaumaa ja on symmetrinen keskiarvon ympärillä.
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-kannassa on funktio k-keskiarvo-algoritmin suorittamiseksi. K keskiarvon perusfunktio on:
kmeans(df, k) arguments: -df: dataset used to run the algorithm -k: Number of clusters
Harjoittele mallia
Kuvassa kolme kerroit yksityiskohtaisesti, kuinka algoritmi toimii. Voit nähdä jokaisen vaiheen graafisesti Yi Huin (myös Knit for Rmarkdownin luojan) upealla paketilla. Paketin animaatio ei ole saatavilla conda-kirjastossa. Voit käyttää toista tapaa asentaa paketti komennolla install.packages("animaatio"). Voit tarkistaa, onko paketti asennettu Anaconda-kansiostamme.
install.packages("animation")
Kun olet ladannut kirjaston, lisäät .ani:n kmeansin ja jälkeen R piirtää kaikki vaiheet. Esimerkkiä varten käytät algoritmia vain uudelleenskaalatuilla muuttujilla hd ja ram kolmella klusterilla.
set.seed(2345) library(animation) kmeans.ani(rescale_df[2:3], 3)
Koodin selitys
- kmeans.ani(rescale_df[2:3], 3): Valitse rescale_df-tietojoukon sarakkeet 2 ja 3 ja suorita algoritmi, jossa k asettaa arvoon 3. Piirrä animaatio.
Voit tulkita animaation seuraavasti:
- Vaihe 1: R valitsee satunnaisesti kolme pistettä
- Vaihe 2: Laske euklidinen etäisyys ja piirrä klusterit. Sinulla on yksi vihreä klusteri alhaalla vasemmalla, yksi suuri mustaksi väritetty klusteri oikealla ja punainen niiden välissä.
- Vaihe 3: Laske sentroidi eli klusterien keskiarvo
- Toista, kunnes tiedot eivät muuta klusteria
Algoritmi konvergoi seitsemän iteroinnin jälkeen. Voit suorittaa k-mean-algoritmin tietojoukossamme viidellä klusterilla ja kutsua sitä nimellä pc_cluster.
pc_cluster <-kmeans(rescale_df, 5)
- Luettelo pc_cluster sisältää seitsemän mielenkiintoista elementtiä:
- pc_cluster$cluster: Ilmaisee kunkin havainnon klusterin
- pc_cluster$centers: Klusterikeskukset
- pc_cluster$totss: Neliöiden kokonaissumma
- pc_cluster$withinss: Neliön summan sisällä. Komponenttien lukumäärän palautus on yhtä suuri kuin "k".
- pc_cluster$tot.withinss: Sisällön summa
- pc_clusterbetweenss: Neliön kokonaissumma miinus Neliön summan sisällä
- pc_cluster$size: Havainnon määrä kussakin klusterissa
Käytät neliön sisäsumman (eli tot.withinss) summaa laskeaksesi optimaalisen klusterien lukumäärän k. K:n löytäminen on todellakin merkittävä tehtävä.
Optimaalinen k
Yhtä tekniikkaa parhaan k:n valitsemiseksi kutsutaan nimellä kyynärpää menetelmä. Tämä menetelmä käyttää ryhmän sisäistä homogeenisuutta tai ryhmän sisäistä heterogeenisyyttä arvioimaan vaihtelua. Toisin sanoen olet kiinnostunut kunkin klusterin selittämän varianssin prosenttiosuudesta. Voit odottaa vaihtelun kasvavan klustereiden lukumäärän myötä, vaihtoehtoisesti heterogeenisuus vähenee. Haasteenamme on löytää k, joka on pienenevän tuoton takana. Uuden klusterin lisääminen ei paranna datan vaihtelua, koska selitettävää tietoa on vain vähän.
Tässä opetusohjelmassa löydämme tämän pisteen heterogeenisyysmittauksella. Klusterien sisällä oleva Total neliöiden summa on tot.withinss luettelossa palauttamalla kmean().
Voit muodostaa kyynärpääkaavion ja löytää optimaalisen k:n seuraavasti:
- Vaihe 1: Muodosta funktio, joka laskee klusterin sisällä olevien neliöiden kokonaissumman
- Vaihe 2: Suorita algoritmiajat
- Vaihe 3: Luo tietokehys algoritmin tuloksista
- Vaihe 4: Piirrä tulokset
Vaihe 1) Muodosta funktio, joka laskee klusterin sisällä olevan neliösumman
Luot funktion, joka suorittaa k-mean-algoritmin ja tallennat kokonaissumman klustereihin neliösumma
kmean_withinss <- function(k) { cluster <- kmeans(rescale_df, k) return (cluster$tot.withinss) }
Koodin selitys
- function(k): Aseta funktion argumenttien määrä
- kmeans(rescale_df, k): Suorita algoritmi k kertaa
- return(cluster$tot.withinss): Tallenna kokonaissumma klustereihin neliöiden summa
Voit testata funktiota arvolla 2.
lähtö:
## Try with 2 cluster
kmean_withinss(2)
lähtö:
## [1] 27087.07
Vaihe 2) Suorita algoritmi n kertaa
Käytät sapply()-funktiota algoritmin suorittamiseen alueella k. Tämä tekniikka on nopeampi kuin silmukan luominen ja arvon tallentaminen.
# Set maximum cluster max_k <-20 # Run algorithm over a range of k wss <- sapply(2:max_k, kmean_withinss)
Koodin selitys
- max_k <-20: Aseta enimmäismääräksi 20
- sapply(2:max_k, kmean_withinss): Suorita funktio kmean_withinss() alueella 2:max_k, eli 2-20.
Vaihe 3) Luo tietokehys algoritmin tuloksista
Kun olet luonut ja testannut funktiomme, voit käyttää k-mean-algoritmia alueella 2–20, tallentaa tot.withinss-arvot.
# Create a data frame to plot the graph elbow <-data.frame(2:max_k, wss)
Koodin selitys
- data.frame(2:max_k, wss): Luo tietokehys wss-algoritmivaraston lähdöllä
Vaihe 4) Piirrä tulokset
Piirrät kaavion nähdäksesi, missä kyynärpää on
# 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))
Kaaviosta näkyy, että optimaalinen k on seitsemän, jossa käyrän tuotto alkaa olla pienenevä.
Kun sinulla on optimaalinen k, suoritat algoritmin uudelleen niin, että k on 7, ja arvioi klusterit.
Klusterin tutkiminen
pc_cluster_2 <-kmeans(rescale_df, 7)
Kuten aiemmin mainittiin, voit käyttää jäljellä olevia mielenkiintoisia tietoja kmean(:n) palauttamasta luettelosta.
pc_cluster_2$cluster pc_cluster_2$centers pc_cluster_2$size
Arviointiosa on subjektiivinen ja perustuu algoritmin käyttöön. Tavoitteenamme on kerätä tietokone, jolla on samankaltaiset ominaisuudet. Tietokonemies osaa tehdä työn käsin ja ryhmätietokoneella osaamisensa perusteella. Prosessi vie kuitenkin paljon aikaa ja on virhealtis. K-mean-algoritmi voi valmistella hänelle kentän ehdottamalla klustereita.
Ennakkoarviointina voit tarkastella klustereiden kokoa.
pc_cluster_2$size
lähtö:
## [1] 608 1596 1231 580 1003 699 542
Ensimmäinen klusteri koostuu 608 havainnosta, kun taas pienimmässä klusterissa, numero 4, on vain 580 tietokonetta. Saattaa olla hyvä, että klusterien välillä on homogeenisuus, jos ei, voidaan vaatia ohuempaa tietojen valmistelua.
Saat syvemmän kuvan datasta keskiosan avulla. Rivit viittaavat klusterin numerointiin ja sarakkeet algoritmin käyttämiin muuttujiin. Arvot ovat kunkin klusterin keskiarvopisteitä kiinnostuneelle sarakkeelle. Standardointi helpottaa tulkintaa. Positiiviset arvot osoittavat, että tietyn klusterin z-piste on yleisen keskiarvon yläpuolella. Esimerkiksi klusterilla 2 on korkein hintakeskiarvo kaikista klustereista.
center <-pc_cluster_2$centers center
lähtö:
## 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
Voit luoda lämpökartan ggplotilla, jotta voimme korostaa luokkien välistä eroa.
Ggplotin oletusvärit on vaihdettava RColorBrewer-kirjaston avulla. Voit käyttää condaa kirjasto ja terminaalissa käynnistettävä koodi:
conda install -cr r-rcolorbrewer
Luodaksesi lämpökartan, toimi kolmessa vaiheessa:
- Rakenna tietokehys keskustan arvoista ja luo muuttuja klusterin numerolla
- Muokkaa tiedot uudelleen tidyr-kirjaston collection()-funktiolla. Haluat muuntaa tiedot laajasta pitkiksi.
- Luo väripaletti väreilläRampPaletti()-funktio
Vaihe 1) Rakenna tietokehys
Luodaan uudelleenmuotoilutietojoukko
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)
lähtö:
## 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
Vaihe 2) Muokkaa tiedot uudelleen
Alla oleva koodi luo väripaletin, jota käytät lämpökartan piirtämiseen.
library(RColorBrewer) # Create the palette hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
Vaihe 3) Visualisoi
Voit piirtää kaavion ja nähdä, miltä klusterit näyttävät.
# 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()
Yhteenveto
Voimme tiivistää k-keskiarvo-algoritmin alla olevaan taulukkoon
Paketti | Tavoite | Toiminto | Perustelu |
---|---|---|---|
pohja | Juna k-keskiarvo | kmeans () | df, k |
Pääsyklusteri | kmeans()$cluster | ||
Cluster keskukset | kmeans()$keskuksia | ||
Koko klusteri | kmeans()$koko |