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

Cluster analyysi

Tässä vaiheessa näkyy kuvio

  1. Vasemmassa alakulmassa näet nuoret, joilla on heikompi ostovoima
  2. Ylempi keskiarvo kuvastaa ihmisiä, joilla on työpaikka, johon heillä on varaa kuluttaa enemmän
  3. Lopuksi vanhukset pienemmällä budjetilla.

Cluster analyysi

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 .

K- tarkoittaa algoritmia

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ä:

K- tarkoittaa algoritmia

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:

Valitse numero Clusters

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.

Harjoittele mallia

Harjoittele mallia

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

Optimaalinen k

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

Tutkimalla Cluster

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