K-înseamnă Clustering în R cu Exemplu

Cuprins:

Anonim

În acest tutorial, veți învăța

  • Ce este analiza Cluster?
  • K-înseamnă algoritm
  • Optim k

Ce este analiza Cluster?

Analiza cluster face parte din învățarea nesupravegheată . Un cluster este un grup de date care partajează caracteristici similare. Putem spune că analiza grupării este mai mult despre descoperire decât despre o predicție. Aparatul caută similitudinea datelor. De exemplu, puteți utiliza analiza cluster pentru următoarea aplicație:

  • Segmentarea clienților: caută similitudinea între grupurile de clienți
  • Clusterarea pieței bursiere: acțiuni de grup pe baza performanțelor
  • Reduceți dimensionalitatea unui set de date prin gruparea observațiilor cu valori similare

Analiza grupării nu este prea dificilă de implementat și este semnificativă, precum și acționabilă pentru afaceri.

Cea mai izbitoare diferență între învățarea supravegheată și cea nesupravegheată constă în rezultate. Învățarea fără supraveghere creează o nouă variabilă, eticheta, în timp ce învățarea supravegheată prezice un rezultat. Aparatul îl ajută pe practicant în încercarea de a eticheta datele pe baza unei relații strânse. Depinde de analist să folosească grupurile și să le dea un nume.

Să facem un exemplu pentru a înțelege conceptul de clustering. Pentru simplitate, lucrăm în două dimensiuni. Aveți date despre cheltuielile totale ale clienților și vârstele acestora. Pentru a îmbunătăți publicitatea, echipa de marketing dorește să trimită mai multe e-mailuri direcționate către clienții lor.

În graficul următor, reprezentați cheltuielile totale și vârsta clienților.

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

Un model este vizibil în acest moment

  1. În partea stângă jos, puteți vedea tineri cu o putere de cumpărare mai mică
  2. Mediul superior reflectă persoanele cu un loc de muncă pe care își pot permite să cheltuiască mai mult
  3. În cele din urmă, persoanele în vârstă cu un buget mai mic.

În figura de mai sus, grupați observațiile manual și definiți fiecare dintre cele trei grupuri. Acest exemplu este oarecum simplu și extrem de vizual. Dacă sunt adăugate noi observații la setul de date, le puteți eticheta în cercuri. Definiți cercul pe baza judecății noastre. În schimb, puteți utiliza Machine Learning pentru a grupa datele în mod obiectiv.

În acest tutorial, veți învăța cum să utilizați algoritmul k-means .

K-înseamnă algoritm

K-mean este, fără îndoială, cea mai populară metodă de clusterizare. Cercetătorii au lansat algoritmul în urmă cu zeci de ani și s-au făcut multe îmbunătățiri pentru k-means.

Algoritmul încearcă să găsească grupuri prin minimizarea distanței dintre observații, numite soluții optime locale . Distanțele sunt măsurate pe baza coordonatelor observațiilor. De exemplu, într-un spațiu bidimensional, coordonatele sunt simple și.

Algoritmul funcționează după cum urmează:

  • Pasul 1: Alegeți aleatoriu grupuri din planul de funcții
  • Pasul 2: Minimizați distanța dintre centrul clusterului și diferitele observații ( centroid ). Rezultă în grupuri cu observații
  • Pasul 3: Mutați centroidul inițial la media coordonatelor dintr-un grup.
  • Pasul 4: Minimizați distanța în funcție de noii centroizi. Se creează noi limite. Astfel, observațiile se vor deplasa de la un grup la altul
  • Repetați până când nicio observație nu schimbă grupurile

K-mijloace ia de obicei distanța euclidiană între caracteristică și caracteristică:

Sunt disponibile diferite măsuri, cum ar fi distanța Manhattan sau distanța Minlowski. Rețineți că, K-mean returnează diferite grupuri de fiecare dată când rulați algoritmul. Amintiți-vă că primele presupuneri inițiale sunt aleatorii și calculați distanțele până când algoritmul atinge o omogenitate în cadrul grupurilor. Adică, k-mean este foarte sensibil la prima alegere și, cu excepția cazului în care numărul de observații și grupuri este mic, este aproape imposibil să obțineți același cluster.

Selectați numărul de clustere

O altă dificultate întâlnită cu k-mean este alegerea numărului de clustere. Puteți seta o valoare ridicată de, adică un număr mare de grupuri, pentru a îmbunătăți stabilitatea, dar s-ar putea să ajungeți la overfit de date. Suprapunerea înseamnă că performanța modelului scade substanțial pentru noile date care vin. Mașina a aflat micile detalii ale setului de date și se străduiește să generalizeze tiparul general.

Numărul de clustere depinde de natura setului de date, industrie, afaceri și așa mai departe. Cu toate acestea, există o regulă generală pentru a selecta numărul adecvat de clustere:

cu egal cu numărul de observații din setul de date.

În general, este interesant să petreceți timp pentru a căuta cea mai bună valoare pentru a se potrivi cu nevoile afacerii.

Vom folosi prețurile seturilor de date pentru calculatoare personale pentru a efectua analiza de clustering. Acest set de date conține 6259 de observații și 10 caracteristici. Setul de date observă prețul din 1993 până în 1995 al 486 de computere personale din SUA. Variabilele sunt preț, viteză, ram, ecran, cd, printre altele.

Veți proceda după cum urmează:

  • Importați date
  • Antrenează modelul
  • Evaluează modelul

Importați date

K înseamnă că nu este potrivit pentru variabilele factor, deoarece se bazează pe distanță și valorile discrete nu returnează valori semnificative. Puteți șterge cele trei variabile categorice din setul nostru de date. În plus, nu există valori lipsă în acest set de date.

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)
Ieșire
## 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… 

Din statisticile rezumative, puteți vedea că datele au valori mari. O bună practică cu calcularea mediei k și a distanței este să redimensionați datele astfel încât media să fie egală cu una și abaterea standard să fie egală cu zero.

summary(df)

Ieșire:

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

Redimensionați variabilele cu funcția scale () a bibliotecii dplyr. Transformarea reduce impactul valorilor aberante și permite compararea unei singure observații cu media. Dacă o valoare standardizată (sau scor z ) este ridicată, puteți avea încredere că această observație este într-adevăr peste medie (un scor z mare implică faptul că acest punct este departe de medie în termen de deviație standard. A z- scorul de două indică faptul că valoarea este la 2 abateri standard distanță de medie. Notă, scorul z urmează o distribuție gaussiană și este simetric în jurul mediei.

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

Baza R are o funcție pentru a rula algoritmul k mediu. Funcția de bază a k medie este:

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

Antrenează modelul

În figura trei, ați detaliat modul în care funcționează algoritmul. Puteți vedea fiecare pas grafic cu pachetul excelent construit de Yi Hui (de asemenea, creatorul Knit for Rmarkdown). Animația pachetului nu este disponibilă în biblioteca conda. Puteți utiliza cealaltă modalitate de a instala pachetul cu install.packages („animație”). Puteți verifica dacă pachetul este instalat în folderul nostru Anaconda.

install.packages("animation") 

După ce încărcați biblioteca, adăugați .ani după kmeans și R va trasa toți pașii. În scop ilustrativ, rulați algoritmul numai cu variabilele redimensionate hd și ram cu trei clustere.

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

Explicarea codului

  • kmeans.ani (rescale_df [2: 3], 3): Selectați coloanele 2 și 3 din setul de date rescale_df și rulați algoritmul cu k seturi la 3. Trasați animația.

Puteți interpreta animația după cum urmează:

  • Pasul 1: R alege în mod aleatoriu trei puncte
  • Pasul 2: Calculați distanța euclidiană și trageți clusterele. Aveți un cluster în verde în partea stângă jos, un cluster mare colorat în negru în dreapta și unul roșu între ele.
  • Pasul 3: Calculați centroidul, adică media clusterelor
  • Repetați până când nu se modifică clusterul de date

Algoritmul converg după șapte iterații. Puteți rula algoritmul k-mean în setul nostru de date cu cinci clustere și îl puteți numi pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • Lista pc_cluster conține șapte elemente interesante:
  • pc_cluster $ cluster: Indică clusterul fiecărei observații
  • pc_cluster $ centres: centrele cluster
  • pc_cluster $ totss: Suma totală de pătrate
  • pc_cluster $ withinss: În suma pătratului. Numărul de componente returnate este egal cu `k`
  • pc_cluster $ tot.withinss: Suma de withinss
  • pc_clusterbetweenss: Suma totală a pătratului minus În cadrul sumei pătratului
  • pc_cluster $ size: Numărul de observații din cadrul fiecărui cluster

Veți utiliza suma sumei pătrate (adică tot.withinss) pentru a calcula numărul optim de clustere k. Găsirea lui k este într-adevăr o sarcină substanțială.

Optim k

O tehnică pentru a alege cel mai bun k se numește metoda cotului . Această metodă utilizează omogenitatea în cadrul grupului sau eterogenitatea în cadrul grupului pentru a evalua variabilitatea. Cu alte cuvinte, sunteți interesat de procentul de varianță explicat de fiecare cluster. Vă puteți aștepta ca variabilitatea să crească odată cu numărul de clustere, alternativ, heterogenitatea scade. Provocarea noastră este să găsim k-ul care depășește randamentele în scădere. Adăugarea unui nou cluster nu îmbunătățește variabilitatea datelor, deoarece foarte puține informații rămân de explicat.

În acest tutorial, găsim acest punct folosind măsura eterogenității. Suma totală a pătratelor din cadrul clusterelor este tot.withinss din listă întoarcere după kmean ().

Puteți construi graficul cotului și puteți găsi k-ul optim după cum urmează:

  • Pasul 1: Construiți o funcție pentru a calcula suma totală a pătratelor din cadrul clusterelor
  • Pasul 2: Rulați algoritmul de ori
  • Pasul 3: Creați un cadru de date cu rezultatele algoritmului
  • Pasul 4: Trageți rezultatele

Pasul 1) Construiți o funcție pentru a calcula suma totală a pătratelor din cadrul clusterelor

Creați funcția care rulează algoritmul k-mean și stocați suma în clustere suma de pătrate

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

Explicarea codului

  • funcție (k): setați numărul de argumente din funcție
  • kmeans (rescale_df, k): Rulați algoritmul de k ori
  • return (cluster $ tot.withinss): Stocați totalul în clustere suma de pătrate

Puteți testa funcția cu egal cu 2.

Ieșire:

## Try with 2 cluster
kmean_withinss(2)

Ieșire:

## [1] 27087.07 

Pasul 2) Rulați algoritmul de n ori

Veți utiliza funcția sapply () pentru a rula algoritmul într-un interval de k. Această tehnică este mai rapidă decât crearea unei bucle și stocarea valorii.

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

Explicarea codului

  • max_k <-20: setați un număr maxim de 20
  • sapply (2: max_k, kmean_withinss): Rulați funcția kmean_withinss () într-un interval 2: max_k, adică de la 2 la 20.

Pasul 3) Creați un cadru de date cu rezultatele algoritmului

După crearea și testarea funcției noastre, puteți rula algoritmul k-mean într-un interval de la 2 la 20, stocați valorile tot.withinss.

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

Explicarea codului

  • data.frame (2: max_k, wss): creați un cadru de date cu ieșirea magazinului de algoritmi în wss

Pasul 4) Trasează rezultatele

Trageți graficul pentru a vizualiza unde este punctul cotului

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

Din grafic, puteți vedea k optim este șapte, unde curba începe să aibă un randament în scădere.

Odată ce aveți k-ul nostru optim, rulați din nou algoritmul cu k egal cu 7 și evaluați clusterele.

Examinarea clusterului

pc_cluster_2 <-kmeans(rescale_df, 7)

După cum am menționat anterior, puteți accesa informațiile interesante rămase în lista returnată de kmean ().

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

Partea de evaluare este subiectivă și se bazează pe utilizarea algoritmului. Scopul nostru aici este să adunăm computer cu funcții similare. Un tip de calculator poate face treaba manual și poate grupa computerul pe baza expertizei sale. Cu toate acestea, procesul va dura mult timp și va fi predispus la erori. Algoritmul K-mean poate pregăti câmpul pentru el / ea sugerând clustere.

Ca evaluare prealabilă, puteți examina dimensiunea clusterelor.

pc_cluster_2$size

Ieșire:

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

Primul cluster este compus din 608 de observații, în timp ce cel mai mic cluster, numărul 4, are doar 580 de computere. Ar putea fi bine să existe o omogenitate între clustere, dacă nu, ar putea fi necesară o pregătire mai subțire a datelor.

Obțineți o privire mai profundă asupra datelor cu componenta centrală. Rândurile se referă la numerotarea clusterului și la coloane variabilele utilizate de algoritm. Valorile reprezintă scorul mediu de către fiecare cluster pentru coloana interesată. Standardizarea facilitează interpretarea. Valorile pozitive indică scorul z pentru un cluster dat este peste media generală. De exemplu, clusterul 2 are cea mai mare medie a prețului dintre toate clusterele.

center <-pc_cluster_2$centerscenter

Ieșire:

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

Puteți crea o hartă de căldură cu ggplot pentru a ne ajuta să evidențiem diferența dintre categorii.

Culorile implicite ale ggplot trebuie schimbate cu biblioteca RColorBrewer. Puteți utiliza biblioteca conda și codul pentru a lansa în terminal:

conda install -cr r-rcolorbrewer

Pentru a crea o hartă de căldură, procedați în trei pași:

  • Construiți un cadru de date cu valorile centrului și creați o variabilă cu numărul clusterului
  • Remodelați datele cu funcția de colectare () a bibliotecii tidyr. Doriți să transformați datele de la larg la lung.
  • Creați paleta de culori cu funcția colorRampPalette ()

Pasul 1) Construiți un cadru de date

Să creăm setul de date de remodelare

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)

Ieșire:

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

Pasul 2) Remodelați datele

Codul de mai jos creează paleta de culori pe care o veți folosi pentru a trasa harta de căldură.

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

Pasul 3) Vizualizați

Puteți trage graficul și puteți vedea cum arată clusterele.

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

rezumat

Putem rezuma algoritmul k-mediu în tabelul de mai jos

Pachet

Obiectiv

funcţie

argument

baza

Antrenează k-mean

kmeans ()

df, k

Cluster de acces

kmeans () $ cluster

Centre de cluster

kmeans () $ centres

Cluster de dimensiuni

kmeans () $ size