K- jelenti ClusterR-ben a példával

Mi a Cluster elemzés?

Cluster az elemzés része a felügyelet nélküli tanulás. A fürt olyan adatok csoportja, amelyek hasonló tulajdonságokkal rendelkeznek. Azt mondhatjuk, hogy a klaszteranalízis sokkal inkább a felfedezésről szól, mint az előrejelzésről. A gép hasonlóságot keres az adatokban. A fürtelemzést például a következő alkalmazáshoz használhatja:

  • Ügyfélszegmentálás: hasonlóságot keres az ügyfélcsoportok között
  • Tőzsdei klaszterezés: Csoportos részvény a teljesítmények alapján
  • Csökkentse egy adatkészlet dimenzióját a hasonló értékű megfigyelések csoportosításával

ClusterAz elemzés végrehajtása nem túl nehéz, és az üzleti élet számára is értelmes és végrehajtható.

A legszembetűnőbb különbség a felügyelt és a nem felügyelt tanulás között az eredményekben rejlik. A felügyelt tanulás új változót, a címkét hoz létre, míg a felügyelt tanulás eredményt jósol. A gép segít a gyakorlónak abban, hogy szoros rokonság alapján címkézze fel az adatokat. Az elemző feladata, hogy használja-e a csoportokat, és nevet adjon nekik.

Vegyünk egy példát a klaszterezés fogalmának megértéséhez. Az egyszerűség kedvéért két dimenzióban dolgozunk. Adatai vannak az ügyfelek teljes költésére és életkorára vonatkozóan. A reklámozás javítása érdekében a marketingcsapat célzottabb e-maileket szeretne küldeni ügyfeleinek.

A következő grafikonon ábrázolja a teljes költést és az ügyfelek életkorát.

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 Elemzés

Ezen a ponton egy minta látható

  1. A bal alsó sarokban alacsonyabb vásárlóerővel rendelkező fiatalok láthatók
  2. A felső középső olyan embereket tükröz, akiknek olyan munkájuk van, amelyre többet tudnak költeni
  3. Végül az idősebbek alacsonyabb költségvetéssel.

Cluster Elemzés

A fenti ábrán kézzel csoportosítja a megfigyeléseket, és meghatározza mind a három csoportot. Ez a példa kissé egyértelmű és nagyon vizuális. Ha új megfigyeléseket fűznek az adatkészlethez, felcímkézheti őket a körökön belül. A kört a mi megítélésünk alapján határozod meg. Ehelyett használhatja Gépi tanulás hogy az adatokat objektíven csoportosítsuk.

Ebben az oktatóanyagban megtudhatja, hogyan kell használni a k-eszközökkel algoritmus.

K-közép algoritmus

A K-mean kétségtelenül a legnépszerűbb klaszterezési módszer. A kutatók évtizedekkel ezelőtt kiadták az algoritmust, és rengeteg fejlesztés történt a k-középen.

Az algoritmus a megfigyelések közötti távolság minimalizálásával próbál csoportokat találni, ún helyi optimális megoldásokat. A távolságok mérése a megfigyelések koordinátái alapján történik. Például egy kétdimenziós térben a koordináták egyszerűek és .

K-algoritmus

Az algoritmus a következőképpen működik:

  • 1. lépés: Véletlenszerűen válasszon csoportokat a funkciótervben
  • 2. lépés: Minimalizálja a távolságot a klaszter központja és a különböző megfigyelések között (súlypontja). Megfigyelésekkel rendelkező csoportokat eredményez
  • Lépés 3: Shift a kezdeti súlypont a csoporton belüli koordináták átlagához.
  • 4. lépés: Minimalizálja a távolságot az új súlypontoknak megfelelően. Új határok jönnek létre. Így a megfigyelések egyik csoportból a másikba kerülnek
  • Ismételje meg mindaddig, amíg egyetlen megfigyelés sem módosítja a csoportokat

A K-közép általában a jellemző és a jellemző közötti euklideszi távolságot veszi fel:

K-algoritmus

Különféle mértékek állnak rendelkezésre, mint például a Manhattan távolság vagy a Minlowski távolság. Vegye figyelembe, hogy a K-mean különböző csoportokat ad vissza az algoritmus minden egyes futtatásakor. Emlékezzünk vissza, hogy az első kezdeti találgatások véletlenszerűek, és számítsuk ki a távolságokat, amíg az algoritmus el nem éri a homogenitást a csoportokon belül. Vagyis a k-átlag nagyon érzékeny az első választásra, és hacsak nem kicsi a megfigyelések és a csoportok száma, szinte lehetetlen ugyanazt a klaszterezést elérni.

Válassza ki a klaszterek számát

Egy másik nehézség a k-átlagnál a klaszterek számának megválasztása. A stabilitás javítása érdekében beállíthat egy magas értéket, azaz nagy számú csoportot, de előfordulhat, hogy ez a végeredmény túlfitt adatokból. A túlillesztés azt jelenti, hogy a modell teljesítménye jelentősen csökken az új adatokhoz. A gép megtanulta az adathalmaz apró részleteit, és küzdött az általános minta általánosításáért.

A klaszterek száma az adatkészlet természetétől, az iparágtól, az üzlettől és így tovább függ. Van azonban egy hüvelykujjszabály a megfelelő számú klaszter kiválasztásához:

Válassza ki a Számot Clusters

és egyenlő az adatkészletben lévő megfigyelések számával.

Általánosságban elmondható, hogy érdekes időt tölteni azzal, hogy megtalálja a legjobb értéket, hogy megfeleljen az üzleti igényeknek.

A klaszterezési elemzés elvégzéséhez a Személyi számítógépek árai adatkészletet fogjuk használni. Ez az adatkészlet 6259 megfigyelést és 10 jellemzőt tartalmaz. Az adatkészlet 1993 és 1995 között 486 személyi számítógép árát figyeli meg az Egyesült Államokban. A változók többek között az ár, sebesség, ram, képernyő, cd.

A következőképpen jár el:

  • Adatok importálása
  • Tanítsd meg a modellt
  • Értékelje a modellt

Adatok importálása

A K átlag nem alkalmas faktorváltozókra, mert a távolságon alapul, és a diszkrét értékek nem adnak vissza értelmes értékeket. Az adatkészletünkből törölheti a három kategorikus változót. Ezenkívül ebben az adatkészletben nincsenek hiányzó értékek.

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)

teljesítmény

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

Az összesített statisztikákból láthatja, hogy az adatok nagy értékekkel rendelkeznek. A k átlag és a távolság számításának bevált gyakorlata az adatok átskálázása úgy, hogy az átlag eggyel, a szórása pedig nullával legyen egyenlő.

summary(df)

output:

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

A változókat a dplyr könyvtár scale() függvényével lehet átméretezni. Az átalakítás csökkenti a kiugró értékek hatását, és lehetővé teszi egyetlen megfigyelés összehasonlítását az átlaggal. Ha egy szabványos érték (vagy z-pontszám) értéke magas, biztos lehet benne, hogy ez a megfigyelés valóban meghaladja az átlagot (a nagy z-pontszám azt jelenti, hogy ez a pont messze van az átlagtól a szórás szempontjából. A kettős z-pontszám azt jelzi, hogy az érték 2 standard Eltérések az átlagtól. Megjegyzés, a z-érték Gauss-eloszlást követ, és szimmetrikus az átlag körül.

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

Az R bázisnak van egy függvénye a k átlag algoritmus futtatására. A k átlag alapvető funkciója:

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

Tanítsd meg a modellt

A harmadik ábrán részletezi az algoritmus működését. Minden lépést grafikusan láthatsz Yi Hui (a Knit for Rmarkdown megalkotója) nagyszerű csomagjának segítségével. A csomaganimáció nem érhető el a conda könyvtárban. Használhatja a másik módot is a csomag telepítésére az install.packages(“animáció”) paranccsal. Ellenőrizheti, hogy a csomag telepítve van-e az Anaconda mappánkban.

install.packages("animation")

A könyvtár betöltése után hozzáadja az .ani fájlt a kmeans és után R felvázolja az összes lépést. Szemléltetés céljából csak az algoritmust futtatja az átskálázott hd és ram változókkal három klaszterrel.

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

Kód Magyarázat

  • kmeans.ani(rescale_df[2:3], 3): Válassza ki a rescale_df adatkészlet 2. és 3. oszlopát, és futtassa az algoritmust k értékkel 3-ra. Ábrázolja az animációt.

Tanítsd meg a modellt

Tanítsd meg a modellt

Az animációt a következőképpen értelmezheti:

  • 1. lépés: R véletlenszerűen választ három pontot
  • 2. lépés: Számítsa ki az euklideszi távolságot, és rajzolja meg a klasztereket. Van egy zöld klaszter a bal alsó sarokban, egy nagy fürt fekete színű jobb oldalon, és egy piros közöttük.
  • 3. lépés: Számítsa ki a súlypontot, azaz a klaszterek átlagát
  • Ismételje meg mindaddig, amíg az adatok nem változtatják meg a klasztert

Az algoritmus hét iteráció után konvergált. Futtathatja a k-mean algoritmust az adatkészletünkben öt klaszterrel, és nevezheti pc_clusternek.

pc_cluster <-kmeans(rescale_df, 5)
  • A pc_cluster lista hét érdekes elemet tartalmaz:
  • pc_cluster$cluster: Az egyes megfigyelések klaszterét jelzi
  • pc_cluster$centers: A fürtközpontok
  • pc_cluster$totss: A négyzetek teljes összege
  • pc_cluster$withinss: A négyzet összegén belül. A visszatérő komponensek száma egyenlő "k"-vel
  • pc_cluster$tot.withinss: Azon belüli összeg összege
  • pc_clusterbetweenss: A négyzet teljes összege mínusz a négyzetösszegen belül
  • pc_cluster$size: Az egyes klasztereken belüli megfigyelések száma

A k klaszterek optimális számának kiszámításához a négyzet belüli összegének összegét (azaz tot.withinss) fogja használni. A k megtalálása valóban jelentős feladat.

Optimális k

A legjobb k kiválasztásának egyik technikája az úgynevezett könyök módszer. Ez a módszer a csoporton belüli homogenitást vagy a csoporton belüli heterogenitást használja a variabilitás értékelésére. Más szóval, Önt az egyes klaszterek által megmagyarázott variancia százalékos aránya érdekli. A klaszterek számával a változékonyság növekedésére számíthatunk, vagy a heterogenitás csökkenésére számíthatunk. A mi kihívásunk az, hogy megtaláljuk azt a k-t, amely túl van a csökkenő hozamokon. Egy új fürt hozzáadása nem javítja az adatok változékonyságát, mert nagyon kevés információ maradt a magyarázatra.

Ebben az oktatóanyagban ezt a pontot a heterogenitás mértékével találjuk meg. A klasztereken belüli Total négyzetösszeg a tot.withinss a listában, amelyet a kmean() ad vissza.

A könyökgráfot a következőképpen állíthatja össze, és megtalálhatja az optimális k-t:

  • 1. lépés: Készítsen függvényt a klasztereken belüli négyzetösszeg összegének kiszámításához
  • 2. lépés: Futtassa le az algoritmust
  • 3. lépés: Hozzon létre egy adatkeretet az algoritmus eredményeivel
  • 4. lépés: Ábrázolja az eredményeket

Step 1) Készítsen függvényt a klasztereken belüli teljes négyzetösszeg kiszámításához

Létrehozza a k-közép algoritmust futtató függvényt, és tárolja a végösszeget a klaszterek négyzetösszegében

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

Kód Magyarázat

  • function(k): Állítsa be a függvény argumentumainak számát
  • kmeans(rescale_df, k): Futtassa az algoritmust k-szer
  • return(cluster$tot.withinss): Tárolja a teljes összeget a klasztereken belüli négyzetösszegben

A függvényt 2-vel tesztelheti.

output:

## Try with 2 cluster
kmean_withinss(2)

output:

## [1] 27087.07

Step 2) Futtassa le az algoritmust n-szer

Az algoritmus k tartományban való futtatásához az saply() függvényt kell használni. Ez a technika gyorsabb, mint egy hurok létrehozása és az érték tárolása.

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

Kód Magyarázat

  • max_k <-20: Állítsa be a maximális számot 20-ra
  • sapply(2:max_k, kmean_withinss): Futtassa a kmean_withinss() függvényt 2:max_k tartományban, azaz 2 és 20 között.

Step 3) Hozzon létre egy adatkeretet az algoritmus eredményeivel

A függvény létrehozása és tesztelése után a k-mean algoritmust 2-20 tartományban futtathatja, tárolhatja a tot.withinss értékeket.

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

Kód Magyarázat

  • data.frame(2:max_k, wss): Hozzon létre egy adatkeretet a wss-ben lévő algoritmustároló kimenetével

Step 4) Ábrázolja az eredményeket

Megrajzolja a grafikont, hogy megjelenítse, hol van a könyökpont

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

Optimális k

A grafikonon látható, hogy az optimális k hét, ahol a görbe kezd csökkenő hozamot mutatni.

Ha megvan az optimális k, akkor újra futtassa az algoritmust úgy, hogy k egyenlő 7-tel, és kiértékeli a klasztereket.

A klaszter vizsgálata

pc_cluster_2 <-kmeans(rescale_df, 7)

Mint már említettük, a kmean() által visszaadott lista további érdekességeit is elérheti.

pc_cluster_2$cluster
pc_cluster_2$centers
pc_cluster_2$size

Az értékelési rész szubjektív, és az algoritmus használatára támaszkodik. Célunk az, hogy összegyűjtsük a hasonló tulajdonságokkal rendelkező számítógépeket. Egy számítógépes srác a szakértelme alapján kézzel és csoportos számítógéppel is el tudja végezni a munkát. A folyamat azonban sok időt vesz igénybe, és hibás lesz. A K-közép algoritmus klaszterek javaslatával fel tudja készíteni neki a terepet.

Előzetes értékelésként megvizsgálhatja a klaszterek méretét.

pc_cluster_2$size

output:

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

Az első klaszter 608 megfigyelésből áll, míg a legkisebb, a 4-es klaszterben mindössze 580 számítógép található. Jó lehet a klaszterek közötti homogenitás, ha nem, akkor vékonyabb adat-előkészítésre lehet szükség.

A középső komponens segítségével mélyebben megtekintheti az adatokat. A sorok a klaszter számozására, az oszlopok pedig az algoritmus által használt változókra vonatkoznak. Az értékek az egyes klaszterek átlagos pontszámai az érdeklődő oszlophoz. A szabványosítás megkönnyíti az értelmezést. A pozitív értékek azt jelzik, hogy egy adott klaszter z-pontszáma meghaladja a teljes átlagot. Például a 2. klaszter rendelkezik a legmagasabb árátlaggal az összes klaszter között.

center <-pc_cluster_2$centers
center

output:

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

Létrehozhat egy hőtérképet a ggplot segítségével, hogy segítsen kiemelni a kategóriák közötti különbséget.

A ggplot alapértelmezett színeit meg kell változtatni az RColorBrewer könyvtárral. Használhatja a condát könyvtár és a terminálban indítandó kód:

conda install -cr r-rcolorbrewer

A hőtérkép létrehozásához három lépést kell végrehajtania:

  • Hozzon létre egy adatkeretet a központ értékeivel, és hozzon létre egy változót a fürt számával
  • Alakítsa át az adatokat a tidyr könyvtár collection() függvényével. Átalakítani szeretné az adatokat szélesről hosszúra.
  • Készítse el a színpalettát színekkelRampPalette() függvény

Step 1) Készítsen adatkeretet

Hozzuk létre az átformálási adatkészletet

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)

output:

##   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) Formálja át az adatokat

Az alábbi kód létrehozza a színpalettát, amelyet a hőtérkép ábrázolásához fog használni.

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

3. lépés) Vizualizáld

Megrajzolhatja a grafikont, és megnézheti, hogyan néznek ki a klaszterek.

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

Megvizsgálva a Cluster

Összegzésként

A k-átlag algoritmust az alábbi táblázatban foglalhatjuk össze

Csomag Objektív Funkció Érv
bázis Vonat k-közép kmeans() df, k
Hozzáférési fürt kmeans()$klaszter
Cluster központok kmeans()$centers
Méret klaszter kmeans()$size