K-Means Clustering je algoritam za učenje bez nadzora koji se koristi za rješavanje problema klasteriranja u strojnom učenju ili znanosti o podacima. U ovoj temi naučit ćemo što je algoritam klasteriranja K-means, kako algoritam radi, zajedno s Pythonovom implementacijom klasteriranja k-means.
Što je algoritam K-Means?
K-Means Clustering je Algoritam učenja bez nadzora , koji grupira neoznačeni skup podataka u različite klastere. Ovdje K definira broj unaprijed definiranih klastera koji se trebaju stvoriti u procesu, kao ako je K=2, bit će dva klastera, a za K=3, bit će tri klastera, i tako dalje.
To je iterativni algoritam koji dijeli neoznačeni skup podataka u k različitih klastera na takav način da svaki skup podataka pripada samo jednoj grupi koja ima slična svojstva.
Omogućuje nam grupiranje podataka u različite grupe i prikladan način za samostalno otkrivanje kategorija grupa u neoznačenom skupu podataka bez potrebe za bilo kakvom obukom.
To je algoritam temeljen na centroidu, gdje je svaki klaster pridružen centroidu. Glavni cilj ovog algoritma je minimizirati zbroj udaljenosti između podatkovne točke i njihovih odgovarajućih klastera.
Algoritam uzima neoznačeni skup podataka kao ulaz, dijeli skup podataka na k-broj klastera i ponavlja postupak dok ne pronađe najbolje klastere. Vrijednost k trebala bi biti unaprijed određena u ovom algoritmu.
K-znači grupiranje algoritam uglavnom obavlja dva zadatka:
- Određuje najbolju vrijednost za K središnje točke ili težišne točke iterativnim postupkom.
- Svaku podatkovnu točku dodjeljuje najbližem k-centru. One podatkovne točke koje su blizu određenog k-centra stvaraju klaster.
Stoga svaki klaster ima podatkovne točke s nekim zajedničkim karakteristikama i udaljen je od drugih klastera.
Donji dijagram objašnjava rad algoritma klasteriranja K-means:
Kako radi algoritam K-Means?
Rad algoritma K-Means objašnjen je u sljedećim koracima:
Korak 1: Odaberite broj K kako biste odredili broj klastera.
dijkstra
Korak 2: Odaberite nasumične K točke ili težišne točke. (Može biti nešto drugo iz ulaznog skupa podataka).
Korak-3: Dodijelite svaku podatkovnu točku njihovom najbližem središtu, što će formirati unaprijed definirane K klastere.
Korak-4: Izračunajte varijancu i postavite novo težište svakog klastera.
Korak-5: Ponovite treće korake, što znači da svaku podatkovnu točku ponovno dodijelite novom najbližem središtu svakog klastera.
Korak-6: Ako se dogodi bilo kakva ponovna dodjela, idite na korak-4 ili idite na ZAVRŠI.
Korak-7 : Model je spreman.
Razmotrimo gore navedene korake uzimajući u obzir vizualne crteže:
Pretpostavimo da imamo dvije varijable M1 i M2. Grafik raspršenosti ove dvije varijable na osi x-y dan je u nastavku:
- Uzmimo broj k klastera, tj. K=2, da identificiramo skup podataka i stavimo ih u različite klastere. To znači da ćemo ovdje pokušati grupirati ove skupove podataka u dva različita klastera.
- Moramo odabrati neke nasumične k točaka ili težište da formiramo klaster. Te točke mogu biti ili točke iz skupa podataka ili bilo koja druga točka. Dakle, ovdje biramo donje dvije točke kao k točaka, koje nisu dio našeg skupa podataka. Razmotrite sliku u nastavku:
- Sada ćemo svaku podatkovnu točku dijagrama raspršenja dodijeliti njezinoj najbližoj K-točki ili težištu. Izračunat ćemo ga primjenom neke matematike koju smo proučavali kako bismo izračunali udaljenost između dvije točke. Dakle, nacrtat ćemo medijan između oba težišta. Razmotrite sliku u nastavku:
Iz gornje slike jasno je da su točke s lijeve strane crte blizu K1 ili plavog težišta, a točke s desne strane crte blizu su žutog težišta. Obojimo ih u plavu i žutu za jasnu vizualizaciju.
- Kako trebamo pronaći najbliži klaster, tako ćemo ponoviti postupak odabirom novo težište . Za odabir novih težišta, izračunat ćemo težište tih težišta i pronaći ćemo nove težište kao što je prikazano u nastavku:
- Zatim ćemo svaku podatkovnu točku ponovno dodijeliti novom težištu. Za to ćemo ponoviti isti postupak pronalaženja srednje linije. Medijan će biti kao na slici ispod:
Na gornjoj slici možemo vidjeti da je jedna žuta točka na lijevoj strani crte, a dvije plave točke desno od linije. Dakle, ove tri točke bit će dodijeljene novim težištima.
Kako je došlo do preraspodjele, ponovno ćemo ići na korak 4, a to je pronalaženje novih težišta ili K-točaka.
- Ponovit ćemo postupak pronalaženjem težišta centroida, tako da će novi centroidi biti kao što je prikazano na slici ispod:
- Kako smo dobili nove težišnice, ponovno ćemo nacrtati središnju liniju i ponovno dodijeliti podatkovne točke. Dakle, slika će biti:
- Možemo vidjeti na gornjoj slici; nema različitih podatkovnih točaka s obje strane crte, što znači da je naš model formiran. Razmotrite sliku u nastavku:
Budući da je naš model spreman, sada možemo ukloniti pretpostavljene centroide, a dva konačna skupa bit će kao što je prikazano na slici ispod:
Kako odabrati vrijednost 'K broja klastera' u K-means klasteriranju?
Izvedba algoritma klasteriranja K-means ovisi o visoko učinkovitim klasterima koje on formira. Ali odabir optimalnog broja klastera velik je zadatak. Postoji nekoliko različitih načina za pronalaženje optimalnog broja klastera, ali ovdje raspravljamo o najprikladnijoj metodi za pronalaženje broja klastera ili vrijednosti K. Metoda je dana u nastavku:
Metoda lakta
Elbow metoda jedan je od najpopularnijih načina pronalaženja optimalnog broja klastera. Ova metoda koristi koncept WCSS vrijednosti. WCSS stoji za Unutar klastera Zbroj kvadrata , koji definira ukupne varijacije unutar klastera. Formula za izračunavanje vrijednosti WCSS-a (za 3 klastera) data je u nastavku:
WCSS= ∑Pja u klasteru1udaljenost (PiC1)2+∑Pja u klasteru 2udaljenost (PiC2)2+∑Pja u CLuster3udaljenost (PiC3)2U gornjoj formuli WCSS-a,
∑Pja u klasteru1udaljenost (PiC1)2: To je zbroj kvadrata udaljenosti između svake podatkovne točke i njezinog težišta unutar klastera1 i isti je za druga dva člana.
Za mjerenje udaljenosti između podatkovnih točaka i centroida, možemo koristiti bilo koju metodu kao što je Euklidska udaljenost ili Manhattanska udaljenost.
Da biste pronašli optimalnu vrijednost klastera, metoda lakta slijedi sljedeće korake:
- Izvršava klasteriranje K-srednjih vrijednosti na danom skupu podataka za različite K vrijednosti (rasponi od 1-10).
- Za svaku vrijednost K izračunava WCSS vrijednost.
- Iscrtava krivulju između izračunatih WCSS vrijednosti i broja klastera K.
- Oštra točka zavoja ili točka crteža izgleda kao krak, tada se ta točka smatra najboljom vrijednošću K.
Budući da grafikon prikazuje oštar zavoj, koji izgleda kao lakat, stoga je poznat kao metoda lakta. Grafikon za metodu lakta izgleda kao na slici ispod:
Napomena: Možemo odabrati broj klastera jednak zadanim podatkovnim točkama. Ako odaberemo broj klastera jednak podatkovnim točkama, tada vrijednost WCSS postaje nula, a to će biti krajnja točka grafikona.
Python implementacija algoritma klasteriranja K-means
U gornjem odjeljku, raspravljali smo o algoritmu K-means, sada da vidimo kako se može implementirati pomoću Piton .
Prije implementacije, shvatimo koju vrstu problema ćemo ovdje riješiti. Dakle, imamo skup podataka od Trgovački centar_Kupci , što su podaci kupaca koji posjećuju trgovački centar i tamo troše.
U danom skupu podataka imamo Customer_Id, spol, dob, godišnji prihod ($) i rezultat potrošnje (što je izračunata vrijednost koliko je kupac potrošio u trgovačkom centru, što je veća vrijednost, to je više potrošio). Iz ovog skupa podataka moramo izračunati neke uzorke, budući da je to nenadzirana metoda, pa ne znamo što bismo točno izračunali.
Koraci koje treba slijediti za implementaciju navedeni su u nastavku:
Korak 1: Korak prethodne obrade podataka
Prvi korak bit će prethodna obrada podataka, kao što smo radili u našim ranijim temama Regresija i klasifikacija. Ali što se tiče problema klasteriranja, bit će drugačiji od ostalih modela. Raspravljajmo o tome:
Kao što smo učinili u prethodnim temama, prvo ćemo uvesti biblioteke za naš model, što je dio predobrade podataka. Kod je naveden u nastavku:
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd
U gornjem kodu, numpy uvezli smo za izvođenje matematičkih izračuna, matplotlib služi za crtanje grafikona i pande služe za upravljanje skupom podataka.
Zatim ćemo uvesti skup podataka koji trebamo koristiti. Dakle, ovdje koristimo skup podataka Mall_Customer_data.csv. Može se uvesti pomoću donjeg koda:
# Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv')
Izvršavanjem gornjih redaka koda, dobit ćemo naš skup podataka u Spyder IDE. Skup podataka izgleda kao na slici ispod:
Iz gornjeg skupa podataka moramo pronaći neke obrasce u njemu.
Ovdje nam ne treba nikakva zavisna varijabla za korak predobrade podataka jer je to problem klasteriranja i nemamo pojma što bismo odredili. Stoga ćemo samo dodati redak koda za matricu značajki.
x = dataset.iloc[:, [3, 4]].values
Kao što vidimo, izdvajamo samo 3rdi 4thznačajka. To je zato što nam treba 2D dijagram za vizualizaciju modela, a neke značajke nisu potrebne, kao što je customer_id.
Korak 2: Pronalaženje optimalnog broja klastera metodom koljena
U drugom koraku pokušat ćemo pronaći optimalan broj klastera za naš problem klasteriranja. Dakle, kao što je gore objašnjeno, ovdje ćemo koristiti metodu lakta za ovu svrhu.
Kao što znamo, metoda lakta koristi WCSS koncept za crtanje dijagrama iscrtavanjem WCSS vrijednosti na Y-osi i broja klastera na X-osi. Dakle, izračunat ćemo vrijednost za WCSS za različite k vrijednosti u rasponu od 1 do 10. Ispod je kod za to:
#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()
Kao što možemo vidjeti u gornjem kodu, koristili smo KMmeans klasa sklearn. knjižnica klastera za formiranje klastera.
Zatim smo stvorili wcss_list varijabla za inicijalizaciju praznog popisa, koji se koristi za sadržavanje vrijednosti wcss izračunate za različite vrijednosti k u rasponu od 1 do 10.
Nakon toga, inicijalizirali smo for petlju za iteraciju na različitim vrijednostima k u rasponu od 1 do 10; budući da je for petlja u Pythonu, isključi izlazno ograničenje, pa se uzima kao 11 da uključi 10thvrijednost.
Ostatak koda je sličan kao što smo radili u ranijim temama, budući da smo model prilagodili matrici značajki i zatim iscrtali grafikon između broja klastera i WCSS-a.
Izlaz: Nakon izvršavanja gornjeg koda, dobit ćemo sljedeći rezultat:
Iz gornjeg crteža možemo vidjeti da je točka lakta na 5. Dakle, broj klastera ovdje će biti 5.
Korak 3: Uvježbavanje algoritma K-srednjih vrijednosti na skupu podataka uvježbavanja
Kako imamo broj klastera, sada možemo trenirati model na skupu podataka.
dugo do int java
Za obuku modela koristit ćemo ista dva retka koda kao što smo koristili u gornjem odjeljku, ali ovdje umjesto upotrebe i, koristit ćemo 5, jer znamo da postoji 5 klastera koje je potrebno formirati. Kod je naveden u nastavku:
#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)
Prvi redak je isti kao i gore za kreiranje objekta klase KMeans.
U drugom retku koda stvorili smo zavisnu varijablu y_predvidjeti za obuku modela.
Izvršavanjem gornjih redaka koda, dobit ćemo varijablu y_predict. Možemo provjeriti ispod istraživač varijabli opciju u Spyder IDE-u. Sada možemo usporediti vrijednosti y_predict s našim izvornim skupom podataka. Razmotrite sliku u nastavku:
Iz gornje slike sada možemo zaključiti da CustomerID 1 pripada klasteru
3 (kako indeks počinje od 0, stoga će se 2 smatrati 3), a 2 pripada klasteru 4, i tako dalje.
Korak 4: Vizualizacija klastera
Zadnji korak je vizualizacija klastera. Kako imamo 5 klastera za naš model, tako ćemo vizualizirati svaki klaster jedan po jedan.
Za vizualizaciju klastera koristit će se raspršeni dijagram pomoću funkcije mtp.scatter() matplotliba.
#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()
U gornjim redcima koda napisali smo kod za svaki klaster, u rasponu od 1 do 5. Prva koordinata mtp.scatter, tj. x[y_predict == 0, 0] koja sadrži x vrijednost za prikazivanje matrice ima vrijednosti, a y_predict je u rasponu od 0 do 1.
Izlaz:
Izlazna slika jasno prikazuje pet različitih grozdova različitih boja. Klasteri se formiraju između dva parametra skupa podataka; Godišnji prihod kupca i potrošnja. Možemo promijeniti boje i oznake prema zahtjevu ili izboru. Također možemo primijetiti neke točke iz gornjih obrazaca, koji su navedeni u nastavku:
- Cluster2 pokazuje da kupac ima visok prihod, ali nisku potrošnju, tako da ga možemo kategorizirati kao oprezan .
- Cluster3 pokazuje nizak prihod i nisku potrošnju tako da se mogu kategorizirati kao razumni.
- Cluster4 prikazuje kupce s niskim primanjima s vrlo visokom potrošnjom tako da ih se može kategorizirati nemaran .
- Cluster5 prikazuje kupce s visokim prihodom i visokom potrošnjom tako da se mogu kategorizirati kao ciljani, a ti kupci mogu biti najprofitabilniji kupci za vlasnika trgovačkog centra.