K-Means Clustering on valvomaton oppimisalgoritmi, jota käytetään ratkaisemaan koneoppimisen tai datatieteen klusterointiongelmia. Tässä aiheessa opimme mikä on K-means-klusterointialgoritmi, miten algoritmi toimii sekä k-means-klusteroinnin Python-toteutuksen.
Mikä on K-Means-algoritmi?
K-Means Clustering on Valvomaton oppimisalgoritmi , joka ryhmittelee merkitsemättömän tietojoukon eri klustereihin. Tässä K määrittelee prosessissa luotavien ennalta määritettyjen klustereiden lukumäärän, ikään kuin jos K = 2, on kaksi klusteria, ja K = 3:lla on kolme klusteria ja niin edelleen.
Se on iteratiivinen algoritmi, joka jakaa merkitsemättömän tietojoukon k eri klusteriin siten, että jokainen tietojoukko kuuluu vain yhteen ryhmään, jolla on samanlaiset ominaisuudet.
Sen avulla voimme ryhmitellä tiedot eri ryhmiin ja kätevän tavan löytää ryhmien luokat nimettömästä tietojoukosta yksinään ilman koulutusta.
Se on sentroidipohjainen algoritmi, jossa jokainen klusteri liittyy sentroidiin. Tämän algoritmin päätavoitteena on minimoida datapisteen ja niitä vastaavien klustereiden välisten etäisyyksien summa.
Algoritmi ottaa syötteeksi merkitsemättömän tietojoukon, jakaa tietojoukon k-määrään klustereita ja toistaa prosessia, kunnes se ei löydä parhaita klustereita. K:n arvo tulisi määrittää ennalta tässä algoritmissa.
java tapauslausunto
K- tarkoittaa klusterointi Algoritmi suorittaa pääasiassa kaksi tehtävää:
- Määrittää parhaan arvon K keskipisteelle tai sentroidille iteratiivisella prosessilla.
- Määrittää jokaisen datapisteen lähimpään k-keskukseen. Ne tietopisteet, jotka ovat lähellä tiettyä k-keskusta, luovat klusterin.
Siksi jokaisessa klusterissa on datapisteitä, joilla on joitain yhteisiä piirteitä, ja se on kaukana muista klustereista.
Alla oleva kaavio selittää K-means-klusterointialgoritmin toiminnan:
Kuinka K-Means-algoritmi toimii?
K-Means-algoritmin toiminta selitetään seuraavissa vaiheissa:
Vaihe 1: Valitse numero K päättääksesi klusterien lukumäärän.
Vaihe 2: Valitse satunnainen K pistettä tai painopiste. (Se voi olla muu kuin syötetietojoukossa).
Vaihe 3: Määritä jokainen datapiste lähimpään painopisteeseensä, joka muodostaa ennalta määritetyt K-klusterit.
Vaihe 4: Laske varianssi ja aseta jokaiselle klusterille uusi sentroidi.
Vaihe 5: Toista kolmannet vaiheet, mikä tarkoittaa, että jokainen tietopiste määritetään uudelleen kunkin klusterin uuteen lähimpään painopisteeseen.
Vaihe 6: Jos uudelleenmäärityksiä tapahtuu, siirry vaiheeseen 4 ja siirry kohtaan FINISH.
Vaihe-7 : Malli on valmis.
Ymmärretään yllä olevat vaiheet ottamalla huomioon visuaaliset juonet:
Oletetaan, että meillä on kaksi muuttujaa M1 ja M2. Näiden kahden muuttujan x-y-akselin sirontakäyrä on annettu alla:
- Otetaan luku k klustereita, eli K=2, tunnistaaksemme tietojoukon ja sijoittaaksemme ne eri klustereihin. Se tarkoittaa, että yritämme ryhmitellä nämä tietojoukot kahteen eri klusteriin.
- Meidän on valittava satunnaisia k pistettä tai painopiste muodostaaksemme klusterin. Nämä pisteet voivat olla joko tietojoukon pisteitä tai mitä tahansa muuta pistettä. Joten tässä valitsemme alla olevat kaksi pistettä k pisteiksi, jotka eivät ole osa tietojoukkoamme. Harkitse alla olevaa kuvaa:
- Nyt kohdistamme sirontakuvaajan jokaisen datapisteen sen lähimpään K-pisteeseen tai painopisteeseen. Laskemme sen soveltamalla tutkittuamme matematiikkaa kahden pisteen välisen etäisyyden laskemiseen. Joten piirrämme mediaanin molempien sentroidien välille. Harkitse alla olevaa kuvaa:
Yllä olevasta kuvasta on selvää, että viivan vasemmalla puolella olevat pisteet ovat lähellä K1:tä tai sinistä keskustaa ja viivan oikealla puolella olevat pisteet ovat lähellä keltaista keskustaa. Väritetään ne siniseksi ja keltaiseksi selkeän visualisoinnin takaamiseksi.
- Koska meidän on löydettävä lähin klusteri, toistamme prosessin valitsemalla uusi sentroidi . Uusien sentroidien valitsemiseksi laskemme näiden sentroidien painopisteet ja löydämme uudet sentroidit seuraavasti:
- Seuraavaksi määritämme jokaisen datapisteen uudelleen uuteen painopisteeseen. Tätä varten toistamme saman prosessin mediaaniviivan löytämiseksi. Mediaani on seuraavan kuvan mukainen:
Yllä olevasta kuvasta voimme nähdä, että yksi keltainen piste on viivan vasemmalla puolella ja kaksi sinistä pistettä on viivan oikealla puolella. Joten nämä kolme pistettä osoitetaan uusille sentroideille.
Koska uudelleenjako on tapahtunut, siirrymme taas vaiheeseen 4, jossa etsitään uusia sentroideja tai K-pisteitä.
- Toistamme prosessin etsimällä sentroidien painopisteet, joten uudet sentroidit ovat alla olevan kuvan mukaisia:
- Kun saimme uudet sentroidit, piirtää mediaaniviivan ja määrittää datapisteet uudelleen. Kuvasta tulee siis:
- Näemme yllä olevassa kuvassa; viivan kummallakaan puolella ei ole erilaisia datapisteitä, mikä tarkoittaa, että mallimme on muodostettu. Harkitse alla olevaa kuvaa:
Koska mallimme on valmis, voimme nyt poistaa oletetut sentroidit, ja kaksi lopullista klusteria ovat alla olevan kuvan mukaiset:
Kuinka valita K-keskiarvojen klusteroinnin arvo?
K-means-klusterointialgoritmin suorituskyky riippuu sen muodostamista erittäin tehokkaista klustereista. Mutta optimaalisen klusterimäärän valitseminen on suuri tehtävä. On olemassa joitakin eri tapoja löytää optimaalinen klusterimäärä, mutta tässä keskustellaan sopivimmasta menetelmästä klustereiden lukumäärän tai K:n arvon löytämiseksi. Menetelmä on annettu alla:
Kyynärpää menetelmä
Elbow-menetelmä on yksi suosituimmista tavoista löytää optimaalinen määrä klustereita. Tämä menetelmä käyttää WCSS-arvon käsitettä. WCSS tarkoittaa Klusterin neliösumman sisällä , joka määrittää klusterin sisäiset kokonaisvaihtelut. Alla on kaava WCSS-arvon laskemiseksi (3 klusterille):
WCSS= ∑Pminä klusterissa 1etäisyys (PiC1)2+∑Pminä klusterissa 2etäisyys (PiC2)2+∑Pminä CLuster3:ssaetäisyys (PiC3)2Yllä olevassa WCSS-kaavassa
∑Pminä klusterissa 1etäisyys (PiC1)2: Se on kunkin datapisteen ja sen painopisteen välisten etäisyyksien neliön summa klusterissa1 ja sama kahdelle muulle termille.
Datapisteiden ja sentroidin välisen etäisyyden mittaamiseen voimme käyttää mitä tahansa menetelmää, kuten Euklidisen etäisyyden tai Manhattanin etäisyyden.
Klusterien optimaalisen arvon löytämiseksi kyynärpäämenetelmä seuraa alla olevia vaiheita:
- Se suorittaa K-keskiarvojen klusteroinnin tietylle tietojoukolle eri K-arvoille (välillä 1-10).
- Laskee WCSS-arvon kullekin K:n arvolle.
- Piirtää käyrän laskettujen WCSS-arvojen ja klusterien määrän K välille.
- Taivutuksen jyrkkä piste tai kaavion piste näyttää käsivarrelta, jolloin sitä pistettä pidetään K:n parhaana arvona.
Koska kaavio näyttää jyrkän mutkan, joka näyttää kyynärpäältä, sitä kutsutaan kyynärpäämenetelmäksi. Kyynärpäämenetelmän kaavio näyttää alla olevalta kuvalta:
Huomautus: Voimme valita klustereiden määrän, joka vastaa annettuja tietopisteitä. Jos valitsemme datapisteitä vastaavan klustereiden määrän, WCSS:n arvosta tulee nolla, ja se on kaavion päätepiste.
Python K-means -klusterointialgoritmin toteutus
Yllä olevassa osiossa olemme käsitelleet K-means-algoritmia, nyt katsotaan kuinka se voidaan toteuttaa käyttämällä Python .
Ennen käyttöönottoa ymmärrämme, minkä tyyppisen ongelman ratkaisemme täällä. Meillä on siis tietojoukko Mall_Customers , joka on tiedot asiakkaista, jotka vierailevat ostoskeskuksessa ja kuluttavat siellä.
Annetussa tietojoukossa meillä on Asiakastunnus, sukupuoli, ikä, vuositulot ($) ja kulutuspisteet (joka on laskettu arvo, kuinka paljon asiakas on kuluttanut ostoskeskuksessa, mitä enemmän arvoa, sitä enemmän hän on kuluttanut). Tästä tietojoukosta meidän on laskettava joitain kuvioita, koska se on valvomaton menetelmä, joten emme tiedä mitä laskea tarkasti.
Käyttöönoton vaiheet on esitetty alla:
keskimmäinen css-painike
Vaihe 1: Tietojen esikäsittelyvaihe
Ensimmäinen askel on tietojen esikäsittely, kuten teimme aikaisemmissa Regressio- ja luokitteluaiheissamme. Mutta klusterointiongelman osalta se on erilainen kuin muut mallit. Keskustellaan siitä:
Kuten aiemmissa aiheissa, tuomme ensin kirjastot mallillemme, joka on osa tietojen esikäsittelyä. Koodi annetaan alla:
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd
Yllä olevassa koodissa nuhjuinen olemme tuoneet matematiikan laskennan suorittamista varten, matplotlib on kaavion piirtämiseen ja pandat ovat tietojoukon hallintaa varten.
Seuraavaksi tuomme käytettävän tietojoukon. Joten tässä käytämme Mall_Customer_data.csv-tietojoukkoa. Se voidaan tuoda alla olevalla koodilla:
# Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv')
Suorittamalla yllä olevat koodirivit, saamme tietojoukon Spyder IDE:hen. Tietojoukko näyttää alla olevalta kuvalta:
Yllä olevasta tietojoukosta meidän on löydettävä siitä joitain malleja.
Tässä emme tarvitse riippuvaisia muuttujia tietojen esikäsittelyvaiheeseen, koska se on klusterointiongelma, eikä meillä ole aavistustakaan siitä, mitä määrittää. Joten lisäämme vain koodirivin ominaisuuksien matriisiin.
x = dataset.iloc[:, [3, 4]].values
Kuten näemme, poimimme vain 3rdja 4thominaisuus. Tämä johtuu siitä, että tarvitsemme 2d-kuvaajan mallin visualisoimiseksi, ja joitain ominaisuuksia ei vaadita, kuten asiakastunnus.
Vaihe 2: Optimaalisen klustereiden lukumäärän löytäminen kyynärpäämenetelmällä
Toisessa vaiheessa yritämme löytää optimaalisen määrän klustereita klusterointiongelmallemme. Joten, kuten edellä käsiteltiin, tässä aiomme käyttää kyynärpäämenetelmää tähän tarkoitukseen.
Kuten tiedämme, kyynärpäämenetelmä käyttää WCSS-konseptia piirtämään kuvaaja piirtämällä WCSS-arvot Y-akselille ja klusterien lukumäärän X-akselille. Joten aiomme laskea WCSS:n arvon eri k-arvoille välillä 1-10. Alla on sen koodi:
#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()
Kuten yllä olevasta koodista näemme, olemme käyttäneet KMeans luokka sklearn. klusterikirjasto muodostamaan klustereita.
Seuraavaksi olemme luoneet wcss_list muuttuja alustaaksesi tyhjän luettelon, jota käytetään sisältämään wcss-arvon, joka on laskettu k:n eri arvoille välillä 1–10.
Tämän jälkeen olemme alustaneet for-silmukan iteraatiolle eri k:n arvolla, joka vaihtelee välillä 1 - 10; koska Pythonin silmukalle jätä pois lähtevän rajan, joten se otetaan 11:ksi, jos se sisältää 10tharvo.
Muu osa koodista on samanlainen kuin aiemmissa aiheissa, sillä olemme sovittaneet mallin ominaisuuksien matriisiin ja piirtäneet sitten kaavion klusterien määrän ja WCSS:n välille.
Lähtö: Yllä olevan koodin suorittamisen jälkeen saamme alla olevan tulosteen:
Yllä olevasta kaaviosta voimme nähdä, että kyynärpää on kohdassa 5. Siten klusterien lukumäärä tässä on 5.
Vaihe 3: K-means-algoritmin harjoitteleminen harjoitustietojoukossa
Koska meillä on klustereiden määrä, voimme nyt harjoitella mallia tietojoukossa.
Mallin kouluttamiseen käytämme samoja kahta koodiriviä kuin yllä olevassa osiossa, mutta tässä i:n sijaan käytämme 5:tä, koska tiedämme, että on muodostettava 5 klusteria. Koodi annetaan alla:
#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)
Ensimmäinen rivi on sama kuin yllä KMeans-luokan objektin luomiseksi.
Toisella koodirivillä olemme luoneet riippuvaisen muuttujan y_predict kouluttaa mallia.
Suorittamalla yllä olevat koodirivit, saamme muuttujan y_predict. Voimme tarkistaa sen alta muuttujien tutkija vaihtoehto Spyder IDE:ssä. Voimme nyt verrata y_predict-arvoja alkuperäiseen tietojoukkoon. Harkitse alla olevaa kuvaa:
Yllä olevasta kuvasta voimme nyt todeta, että asiakastunnus 1 kuuluu klusteriin
3 (koska indeksi alkaa 0:sta, joten 2:ta pidetään 3:na), ja 2 kuuluu klusteriin 4 ja niin edelleen.
Vaihe 4: Klusterien visualisointi
Viimeinen vaihe on visualisoida klusterit. Koska meillä on mallillemme 5 klusteria, visualisoimme jokaisen klusterin yksitellen.
Klusterien visualisoimiseksi käytetään scatter-diagrammia käyttämällä matplotlibin mtp.scatter()-funktiota.
#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()
Yllä oleville koodiriveille olemme kirjoittaneet koodin jokaiselle klusterille, välillä 1 - 5. Mtp.scatterin ensimmäinen koordinaatti, eli x[y_predict == 0, 0], joka sisältää x-arvon matriisin näyttämiselle ominaisuuksia arvot, ja y_predict on 0-1.
Lähtö:
Tulostuskuvassa näkyy selvästi viisi erilaista klusteria eri väreillä. Klusterit muodostetaan tietojoukon kahden parametrin väliin; Asiakkaan vuositulot ja kulut. Voimme muuttaa värejä ja tarroja tarpeen tai valinnan mukaan. Voimme myös havaita joitain kohtia yllä olevista kuvioista, jotka on annettu alla:
- Cluster2 osoittaa, että asiakkaalla on korkeat tulot mutta alhainen kulutus, joten voimme luokitella heidät varovainen .
- Cluster3 näyttää alhaiset tulot ja myös alhaiset menot, joten ne voidaan luokitella järkeviksi.
- Cluster4 näyttää pienituloiset asiakkaat, joilla on erittäin suuri kulutus, joten heidät voidaan luokitella huolimaton .
- Cluster5 näyttää korkeatuloiset ja paljon kuluttavat asiakkaat, jotta heidät voidaan luokitella kohteiksi, ja nämä asiakkaat voivat olla kauppakeskuksen omistajan kannattavimpia asiakkaita.