logo

K-Means klasterizacijos algoritmas

K-Means Clustering yra neprižiūrimas mokymosi algoritmas, naudojamas mašininio mokymosi arba duomenų mokslo klasterizacijos problemoms spręsti. Šioje temoje sužinosime, kas yra K-means klasterizacijos algoritmas, kaip veikia algoritmas, kartu su Python įdiegimu k-means klasterizavimu.

sąrašą kaip masyvą

Kas yra K-Means algoritmas?

K-Means Clustering yra Neprižiūrimas mokymosi algoritmas , kuri sugrupuoja nepažymėtą duomenų rinkinį į skirtingas grupes. Čia K apibrėžia iš anksto nustatytų klasterių, kuriuos reikia sukurti proceso metu, skaičių, nes jei K = 2, bus du klasteriai, o K = 3 - trys klasteriai ir pan.

Tai kartotinis algoritmas, kuris padalija nepažymėtą duomenų rinkinį į k skirtingų grupių taip, kad kiekvienas duomenų rinkinys priklausytų tik vienai grupei, turinčiai panašias savybes.

Tai leidžia mums sugrupuoti duomenis į skirtingas grupes ir patogus būdas savarankiškai atrasti grupių kategorijas nepažymėtame duomenų rinkinyje be jokio mokymo.

Tai centroidais pagrįstas algoritmas, kuriame kiekvienas klasteris yra susietas su centroidu. Pagrindinis šio algoritmo tikslas yra sumažinti atstumų sumą tarp duomenų taško ir atitinkamų grupių.

Algoritmas paima nepažymėtą duomenų rinkinį kaip įvestį, padalija duomenų rinkinį į k skaičių grupių ir kartoja procesą, kol neranda geriausių grupių. Šiame algoritme turėtų būti iš anksto nustatyta k reikšmė.

K reiškia grupavimas Algoritmas daugiausia atlieka dvi užduotis:

  • Iteraciniu procesu nustato geriausią K centro taškų arba centroidų vertę.
  • Priskiria kiekvieną duomenų tašką artimiausiam k centrui. Tie duomenų taškai, esantys netoli konkretaus k centro, sukuria klasterį.

Taigi kiekvienas klasteris turi duomenų taškus su tam tikrais bruožais ir yra nutolęs nuo kitų grupių.

Toliau pateiktoje diagramoje paaiškinamas K-means klasterizacijos algoritmo veikimas:

K-Means klasterizacijos algoritmas

Kaip veikia K-Means algoritmas?

K-Means algoritmo veikimas paaiškinamas toliau pateiktais žingsniais:

1 žingsnis: Pasirinkite skaičių K, kad nustatytumėte grupių skaičių.

2 žingsnis: Pasirinkite atsitiktinius K taškus arba centroidus. (Jis gali būti kitoks iš įvesties duomenų rinkinio).

3 veiksmas: Priskirkite kiekvieną duomenų tašką prie artimiausio centroido, kuris sudarys iš anksto nustatytas K grupes.

4 veiksmas: Apskaičiuokite dispersiją ir įdėkite naują kiekvieno klasterio centroidą.

5 veiksmas: Pakartokite trečius veiksmus, o tai reiškia, kad kiekvieną duomenų tašką priskirkite naujam artimiausiam kiekvienos grupės centroidui.

6 veiksmas: Jei įvyksta koks nors pakartotinis priskyrimas, pereikite prie 4 veiksmo, arba eikite į FINISH.

7 veiksmas : Modelis paruoštas.

Supraskime aukščiau nurodytus veiksmus, atsižvelgdami į vaizdinius siužetus:

Tarkime, kad turime du kintamuosius M1 ir M2. Šių dviejų kintamųjų x-y ašies sklaidos grafikas pateiktas žemiau:

K-Means klasterizacijos algoritmas
  • Imkime klasterių skaičių k, ty K=2, kad identifikuotume duomenų rinkinį ir sudėliotume juos į skirtingus klasterius. Tai reiškia, kad mes bandysime sugrupuoti šiuos duomenų rinkinius į dvi skirtingas grupes.
  • Norėdami sudaryti klasterį, turime pasirinkti keletą atsitiktinių k taškų arba centroidų. Šie taškai gali būti taškai iš duomenų rinkinio arba bet kuris kitas taškas. Taigi, čia mes pasirenkame du žemiau esančius taškus kaip k taškus, kurie nėra mūsų duomenų rinkinio dalis. Apsvarstykite toliau pateiktą vaizdą:
    K-Means klasterizacijos algoritmas
  • Dabar kiekvieną sklaidos diagramos duomenų tašką priskirsime artimiausiam K taškui arba centroidui. Apskaičiuosime taikydami tam tikrą matematiką, kurią ištyrėme norėdami apskaičiuoti atstumą tarp dviejų taškų. Taigi, mes nubrėžsime medianą tarp abiejų centroidų. Apsvarstykite toliau pateiktą vaizdą:
    K-Means klasterizacijos algoritmas

Iš aukščiau pateikto paveikslėlio aišku, kad kairiosios linijos taškai yra netoli K1 arba mėlynojo centroido, o taškai, esantys linijos dešinėje, yra arti geltonojo centroido. Nuspalvinkime juos mėlyna ir geltona spalva, kad būtų aiškus vaizdas.

K-Means klasterizacijos algoritmas
  • Kadangi reikia rasti artimiausią klasterį, todėl pasirinkdami pakartosime procesą naujas centroidas . Norėdami pasirinkti naujus centroidus, apskaičiuosime šių centroidų svorio centrus ir rasime naujus centroidus, kaip nurodyta toliau:
    K-Means klasterizacijos algoritmas
  • Tada kiekvieną duomenų tašką priskirsime naujam centroidui. Tam pakartosime tą patį medianos linijos radimo procesą. Mediana bus tokia, kaip toliau pateiktame paveikslėlyje:
    K-Means klasterizacijos algoritmas

Iš aukščiau esančio paveikslėlio matome, kad vienas geltonas taškas yra kairėje linijos pusėje, o du mėlyni taškai yra tiesiai į liniją. Taigi, šie trys taškai bus priskirti naujiems centroidams.

K-Means klasterizacijos algoritmas

Kadangi įvyko perskirstymas, mes vėl pereisime prie 4 žingsnio, kuriame ieškome naujų centroidų arba K taškų.

  • Pakartosime procesą surasdami centroidų svorio centrą, todėl nauji centroidai bus tokie, kaip parodyta žemiau esančiame paveikslėlyje:
    K-Means klasterizacijos algoritmas
  • Kai gavome naujus centroidus, vėl nubrėžsime vidurinę liniją ir perskirsime duomenų taškus. Taigi vaizdas bus toks:
    K-Means klasterizacijos algoritmas
  • Matome aukščiau esančiame paveikslėlyje; abiejose linijos pusėse nėra skirtingų duomenų taškų, o tai reiškia, kad mūsų modelis yra suformuotas. Apsvarstykite toliau pateiktą vaizdą:
    K-Means klasterizacijos algoritmas

Kadangi mūsų modelis yra paruoštas, dabar galime pašalinti numanomus centroidus, o du galutiniai klasteriai bus tokie, kaip parodyta toliau pateiktame paveikslėlyje:

K-Means klasterizacijos algoritmas

Kaip pasirinkti „K klasterių skaičiaus“ reikšmę K-means klasterizacijoje?

K-means klasterizacijos algoritmo našumas priklauso nuo labai efektyvių klasterių, kuriuos jis sudaro. Tačiau pasirinkti optimalų klasterių skaičių yra didelė užduotis. Yra keletas skirtingų būdų, kaip rasti optimalų klasterių skaičių, tačiau čia aptariame tinkamiausią metodą, kaip rasti klasterių skaičių arba K reikšmę. Metodas pateikiamas toliau:

Alkūnės metodas

Alkūnės metodas yra vienas iš populiariausių būdų rasti optimalų klasterių skaičių. Šis metodas naudoja WCSS vertės sąvoką. WCSS reiškia Klasterio kvadratų suma , kuris apibrėžia visus klasterio pokyčius. Formulė WCSS vertei apskaičiuoti (3 klasteriams) pateikta žemiau:

WCSS= ∑Paš 1 klasteryjeatstumas (PiC1)2+∑Paš esu 2 klasteryjeatstumas (PiC2)2+∑Paš CLuster3atstumas (PiC3)2

Pirmiau pateiktoje WCSS formulėje

Paš 1 klasteryjeatstumas (PiC1)2: Tai yra atstumų tarp kiekvieno duomenų taško ir jo centroido klasteryje1 kvadratų suma, o kitų dviejų terminų – atstumų suma.

Norėdami išmatuoti atstumą tarp duomenų taškų ir centroido, galime naudoti bet kokį metodą, pvz., Euklido atstumą arba Manheteno atstumą.

Norėdami rasti optimalią klasterių vertę, alkūnės metodas atlieka šiuos veiksmus:

  • Ji vykdo K-means klasterizavimą tam tikrame duomenų rinkinyje skirtingoms K reikšmėms (svyruoja nuo 1 iki 10).
  • Kiekvienai K reikšmei apskaičiuojama WCSS reikšmė.
  • Nubraižo kreivę tarp apskaičiuotų WCSS reikšmių ir klasterių skaičiaus K.
  • Staigus lenkimo taškas arba sklypo taškas atrodo kaip ranka, tada tas taškas laikomas geriausia K verte.

Kadangi diagrama rodo staigų posūkį, kuris atrodo kaip alkūnė, todėl jis žinomas kaip alkūnės metodas. Alkūnės metodo grafikas atrodo taip, kaip toliau pateiktame paveikslėlyje:

K-Means klasterizacijos algoritmas

Pastaba: galime pasirinkti klasterių skaičių, lygų pateiktiems duomenų taškams. Jei pasirinksime klasterių skaičių, lygų duomenų taškams, tada WCSS reikšmė taps lygi nuliui, ir tai bus grafiko galutinis taškas.

Python K-means klasterizacijos algoritmo įgyvendinimas

Aukščiau esančiame skyriuje aptarėme K-means algoritmą, dabar pažiūrėkime, kaip jį galima įgyvendinti naudojant Python .

Prieš įgyvendindami supraskime, kokio tipo problemą čia išspręsime. Taigi, mes turime duomenų rinkinį Mall_Customers , tai yra prekybos centre apsilankiusių ir jame išleidžiančių klientų duomenys.

Pateiktame duomenų rinkinyje turime Kliento_ID, lytis, amžius, metinės pajamos ($) ir išlaidų balas (tai yra skaičiuojama vertė, kiek klientas išleido prekybos centre, kuo daugiau vertės, tuo daugiau jis išleido). Iš šio duomenų rinkinio turime apskaičiuoti kai kuriuos modelius, nes tai yra neprižiūrimas metodas, todėl nežinome, ką tiksliai apskaičiuoti.

Toliau pateikiami įgyvendinimo žingsniai:

    Išankstinis duomenų apdorojimas Optimalaus klasterių skaičiaus nustatymas alkūnės metodu K-means algoritmo mokymas mokymo duomenų rinkinyje Klasterių vizualizavimas

1 veiksmas: išankstinio duomenų apdorojimo veiksmas

Pirmasis žingsnis bus išankstinis duomenų apdorojimas, kaip tai darėme ankstesnėse regresijos ir klasifikavimo temose. Tačiau klasterizacijos problema skirsis nuo kitų modelių. Aptarkime tai:

    Bibliotekų importavimas
    Kaip ir ankstesnėse temose, pirma, importuosime savo modelio bibliotekas, kurios yra išankstinio duomenų apdorojimo dalis. Kodas pateiktas žemiau:
 # importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd 

Aukščiau pateiktame kode nelygus importavome matematiniams skaičiavimams atlikti, matplotlib yra skirtas grafiko braižymui ir pandos yra skirti duomenų rinkiniui tvarkyti.

    Duomenų rinkinio importavimas:
    Tada importuosime duomenų rinkinį, kurį turime naudoti. Taigi čia mes naudojame Mall_Customer_data.csv duomenų rinkinį. Jį galima importuoti naudojant toliau pateiktą kodą:
 # Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv') 

Vykdydami aukščiau pateiktas kodo eilutes, mes gausime savo duomenų rinkinį Spyder IDE. Duomenų rinkinys atrodo taip, kaip toliau pateiktame paveikslėlyje:

K-Means klasterizacijos algoritmas

Iš pirmiau pateikto duomenų rinkinio turime rasti tam tikrus modelius.

    Nepriklausomų kintamųjų ištraukimas

Čia mums nereikia jokių priklausomų kintamųjų išankstiniam duomenų apdorojimo veiksmui, nes tai yra grupavimo problema, ir mes neįsivaizduojame, ką nustatyti. Taigi mes tiesiog pridėsime funkcijų matricos kodo eilutę.

 x = dataset.iloc[:, [3, 4]].values 

Kaip matome, išgauname tik 3rdir 4thfunkcija. Taip yra todėl, kad modeliui vizualizuoti reikia 2d brėžinio, o kai kurios funkcijos nėra būtinos, pvz., customer_id.

2 veiksmas: optimalaus klasterių skaičiaus radimas naudojant alkūnės metodą

Antrame žingsnyje mes bandysime rasti optimalų klasterių skaičių mūsų klasterizacijos problemai. Taigi, kaip aptarta aukščiau, šiuo tikslu naudosime alkūnės metodą.

Kaip žinome, alkūnės metodas naudoja WCSS koncepciją, kad nubrėžtų diagramą, nubraižant WCSS reikšmes Y ašyje ir klasterių skaičių X ašyje. Taigi mes apskaičiuosime WCSS reikšmę skirtingoms k reikšmėms nuo 1 iki 10. Žemiau pateikiamas jo kodas:

 #finding optimal number of clusters using the elbow method from sklearn.cluster import KMeans wcss_list= [] #Initializing the list for the values of WCSS #Using for loop for iterations from 1 to 10. for i in range(1, 11): kmeans = KMeans(n_clusters=i, init='k-means++', random_state= 42) kmeans.fit(x) wcss_list.append(kmeans.inertia_) mtp.plot(range(1, 11), wcss_list) mtp.title('The Elobw Method Graph') mtp.xlabel('Number of clusters(k)') mtp.ylabel('wcss_list') mtp.show() 

Kaip matome aukščiau pateiktame kode, mes naudojome KMeans sklearno klasė. klasterių biblioteka, kad sudarytų grupes.

Toliau mes sukūrėme wcss_list kintamasis, skirtas inicijuoti tuščią sąrašą, kuris naudojamas wcss reikšmei, apskaičiuotai skirtingoms k reikšmėms nuo 1 iki 10, įrašyti.

Po to inicijavome for kilpą, skirtą iteracijai su kita k reikšme, kuri svyruoja nuo 1 iki 10; kadangi „Python“ ciklo atveju neįtraukite išeinančio siuntimo limito, todėl laikoma, kad 11 apima 10thvertė.

Likusi kodo dalis yra panaši, kaip ir ankstesnėse temose, nes modelį pritaikėme prie funkcijų matricos ir nubraižėme grafiką tarp klasterių skaičiaus ir WCSS.

Išvestis: Įvykdę aukščiau pateiktą kodą, gausime žemiau pateiktą išvestį:

K-Means klasterizacijos algoritmas

Iš aukščiau pateikto sklypo matome, kad alkūnės taškas yra ties 5. Taigi klasterių skaičius čia bus 5.

K-Means klasterizacijos algoritmas

3 veiksmas: K-means algoritmo mokymas mokymo duomenų rinkinyje

Kadangi turime klasterių skaičių, dabar galime parengti modelį duomenų rinkinyje.

Norėdami išmokyti modelį, naudosime tas pačias dvi kodo eilutes, kurias naudojome aukščiau esančiame skyriuje, tačiau čia vietoj i naudosime 5, nes žinome, kad reikia suformuoti 5 klasterius. Kodas pateiktas žemiau:

 #training the K-means model on a dataset kmeans = KMeans(n_clusters=5, init='k-means++', random_state= 42) y_predict= kmeans.fit_predict(x) 

Pirmoji eilutė yra tokia pati kaip aukščiau, kuriant KMeans klasės objektą.

Antroje kodo eilutėje sukūrėme priklausomą kintamąjį y_prognozuoti apmokyti modelį.

Vykdydami aukščiau pateiktas kodo eilutes, gausime y_predict kintamąjį. Galime patikrinti žemiau kintamųjų tyrinėtojas parinktis Spyder IDE. Dabar galime palyginti y_predict reikšmes su pradiniu duomenų rinkiniu. Apsvarstykite toliau pateiktą vaizdą:

K-Means klasterizacijos algoritmas

Iš aukščiau pateikto vaizdo dabar galime pasakyti, kad Kliento ID 1 priklauso klasteriui

3 (kadangi indeksas prasideda nuo 0, todėl 2 bus laikomas 3), o 2 priklauso 4 klasteriui ir pan.

4 veiksmas: klasterių vizualizavimas

Paskutinis žingsnis yra vizualizuoti grupes. Kadangi savo modeliui turime 5 klasterius, kiekvieną klasterį vizualizuosime po vieną.

Norėdami vizualizuoti grupes, naudosite sklaidos diagramą naudodami matplotlib funkciją mtp.scatter().

 #visulaizing the clusters mtp.scatter(x[y_predict == 0, 0], x[y_predict == 0, 1], s = 100, c = 'blue', label = 'Cluster 1') #for first cluster mtp.scatter(x[y_predict == 1, 0], x[y_predict == 1, 1], s = 100, c = 'green', label = 'Cluster 2') #for second cluster mtp.scatter(x[y_predict== 2, 0], x[y_predict == 2, 1], s = 100, c = 'red', label = 'Cluster 3') #for third cluster mtp.scatter(x[y_predict == 3, 0], x[y_predict == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4') #for fourth cluster mtp.scatter(x[y_predict == 4, 0], x[y_predict == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5') #for fifth cluster mtp.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroid') mtp.title('Clusters of customers') mtp.xlabel('Annual Income (k$)') mtp.ylabel('Spending Score (1-100)') mtp.legend() mtp.show() 

Aukščiau pateiktose kodo eilutėse parašėme kodą kiekvienai klasteriui, kuris svyruoja nuo 1 iki 5. Pirmoji mtp.scatter koordinatė, ty x[y_predict == 0, 0], kurioje yra x reikšmė, rodanti matricą funkcijų reikšmės, o y_predict yra nuo 0 iki 1.

Išvestis:

K-Means klasterizacijos algoritmas

Išvesties vaizdas aiškiai rodo penkias skirtingas grupes su skirtingomis spalvomis. Klasteriai sudaromi tarp dviejų duomenų rinkinio parametrų; Kliento metinės pajamos ir išlaidos. Galime pakeisti spalvas ir etiketes pagal poreikį ar pasirinkimą. Taip pat galime pastebėti kai kuriuos punktus iš aukščiau pateiktų modelių, kurie pateikiami toliau:

    Klasteris1rodo vidutinį atlyginimą ir vidutines išlaidas gaunančius klientus, todėl galime šiuos klientus suskirstyti į kategorijas
  • Cluster2 rodo, kad klientas gauna dideles pajamas, bet išleidžia mažas, todėl galime juos suskirstyti į kategorijas atsargus .
  • Cluster3 rodo mažas pajamas ir mažas išlaidas, todėl jas galima priskirti prie protingų.
  • Cluster4 rodo mažas pajamas gaunančius klientus, kurie išleidžia labai dideles išlaidas, todėl juos galima priskirti kategorijai neatsargus .
  • Cluster5 rodo dideles pajamas gaunančius ir daug išleidžiančius klientus, todėl juos galima priskirti tiksliniams, o šie klientai gali būti pelningiausi prekybos centro savininko klientai.