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()
Ezen a ponton egy minta látható
- A bal alsó sarokban alacsonyabb vásárlóerővel rendelkező fiatalok láthatók
- A felső középső olyan embereket tükröz, akiknek olyan munkájuk van, amelyre többet tudnak költeni
- Végül az idősebbek alacsonyabb költségvetéssel.
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 .
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ü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:
é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.
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))
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()
Ö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 |