K-Means Clustering je algoritmus učenia bez dozoru, ktorý sa používa na riešenie problémov s klastrovaním v strojovom učení alebo vede o údajoch. V tejto téme sa dozvieme, čo je K-means clustering algoritmus, ako tento algoritmus funguje, spolu s implementáciou k-means clusteringu v Pythone.
Čo je K-Means Algorithm?
K-Means Clustering je Algoritmus učenia bez dozoru , ktorý zoskupuje neoznačenú množinu údajov do rôznych klastrov. Tu K definuje počet preddefinovaných zhlukov, ktoré je potrebné v procese vytvoriť, ako keby K=2, boli by tam dva klastre a pre K=3 budú tri klastre atď.
internetový protokol smtp
Ide o iteračný algoritmus, ktorý rozdeľuje neoznačený súbor údajov do k rôznych klastrov tak, že každý súbor údajov patrí iba do jednej skupiny, ktorá má podobné vlastnosti.
Umožňuje nám to zoskupiť údaje do rôznych skupín a je to pohodlný spôsob, ako samostatne objaviť kategórie skupín v neoznačenom súbore údajov bez potreby akéhokoľvek školenia.
Je to algoritmus založený na centroidoch, kde je každý klaster spojený s ťažiskom. Hlavným cieľom tohto algoritmu je minimalizovať súčet vzdialeností medzi dátovým bodom a ich zodpovedajúcimi klastrami.
Algoritmus vezme neoznačený súbor údajov ako vstup, rozdelí súbor údajov na k-počet klastrov a opakuje proces, kým nenájde najlepšie klastre. Hodnota k by mala byť v tomto algoritme vopred určená.
K-znamená zhlukovanie Algoritmus vykonáva hlavne dve úlohy:
- Určuje najlepšiu hodnotu pre K stredových bodov alebo ťažísk iteračným procesom.
- Priradí každý údajový bod k jeho najbližšiemu k-centru. Tie dátové body, ktoré sú blízko konkrétneho k-centra, vytvárajú zhluk.
Každý klaster má teda dátové body s niektorými spoločnými znakmi a je vzdialený od iných klastrov.
Nižšie uvedený diagram vysvetľuje fungovanie K-means Clustering Algorithm:
Ako funguje algoritmus K-Means?
Fungovanie algoritmu K-Means je vysvetlené v nasledujúcich krokoch:
Krok 1: Vyberte číslo K, aby ste určili počet klastrov.
Krok 2: Vyberte náhodných K bodov alebo ťažísk. (Môže to byť iné zo vstupného súboru údajov).
Krok 3: Každý údajový bod priraďte k jeho najbližšiemu ťažisku, ktoré vytvorí preddefinované K klastre.
Krok 4: Vypočítajte rozptyl a umiestnite nové ťažisko každého zhluku.
Krok 5: Opakujte tretie kroky, čo znamená, že každý údajový bod znova priraďte k novému najbližšiemu ťažisku každého klastra.
Krok 6: Ak dôjde k akémukoľvek preradeniu, prejdite na krok 4, inak prejdite na FINISH.
Krok-7 : Model je pripravený.
Poďme pochopiť vyššie uvedené kroky zvážením vizuálnych grafov:
Predpokladajme, že máme dve premenné M1 a M2. Graf rozptylu na osi x-y týchto dvoch premenných je uvedený nižšie:
- Vezmime si počet k zhlukov, t. j. K=2, aby sme identifikovali množinu údajov a umiestnili ich do rôznych zhlukov. To znamená, že sa pokúsime zoskupiť tieto množiny údajov do dvoch rôznych klastrov.
- Na vytvorenie zhluku musíme vybrať niekoľko náhodných k bodov alebo ťažísk. Tieto body môžu byť buď body zo súboru údajov, alebo akýkoľvek iný bod. Takže tu vyberáme dva nižšie uvedené body ako k bodov, ktoré nie sú súčasťou nášho súboru údajov. Zvážte nasledujúci obrázok:
- Teraz priradíme každý dátový bod bodového grafu jeho najbližšiemu K-bodu alebo ťažisku. Vypočítame to použitím nejakej matematiky, ktorú sme študovali na výpočet vzdialenosti medzi dvoma bodmi. Takže nakreslíme stred medzi oboma ťažiskami. Zvážte nasledujúci obrázok:
Z obrázku vyššie je jasné, že body na ľavej strane čiary sú blízko ťažiska K1 alebo modrého ťažiska a body napravo od čiary sú blízko žltého ťažiska. Vyfarbme ich ako modré a žlté pre jasnú vizualizáciu.
- Keďže potrebujeme nájsť najbližší zhluk, tak výber zopakujeme nový centroid . Na výber nových ťažísk vypočítame ťažisko týchto ťažísk a nájdeme nové ťažiská, ako je uvedené nižšie:
- Ďalej priradíme každý údajový bod novému ťažisku. Na tento účel zopakujeme rovnaký proces hľadania strednej čiary. Medián bude ako na obrázku nižšie:
Z obrázku vyššie vidíme, že jeden žltý bod je na ľavej strane čiary a dva modré body sú priamo pri čiare. Takže tieto tri body budú priradené novým centroidom.
Keďže došlo k preradeniu, opäť prejdeme ku kroku 4, ktorým je hľadanie nových ťažísk alebo K-bodov.
- Proces zopakujeme nájdením ťažiska ťažísk, takže nové ťažiská budú také, ako je znázornené na obrázku nižšie:
- Keď sme dostali nové ťažiská, znova nakreslíme stredovú čiaru a priradíme dátové body. Takže obrázok bude:
- Môžeme vidieť na obrázku vyššie; na žiadnej strane čiary nie sú žiadne odlišné dátové body, čo znamená, že je vytvorený náš model. Zvážte nasledujúci obrázok:
Keďže je náš model pripravený, môžeme teraz odstrániť predpokladané ťažiská a dva posledné zhluky budú také, ako je znázornené na obrázku nižšie:
Ako zvoliť hodnotu 'K počtu klastrov' v K-means Clustering?
Výkonnosť algoritmu klastrovania K-means závisí od vysoko efektívnych zhlukov, ktoré vytvára. Ale výber optimálneho počtu klastrov je veľká úloha. Existuje niekoľko rôznych spôsobov, ako nájsť optimálny počet zhlukov, ale tu diskutujeme o najvhodnejšej metóde na zistenie počtu zhlukov alebo hodnoty K. Metóda je uvedená nižšie:
Lakťová metóda
Metóda Elbow je jedným z najpopulárnejších spôsobov, ako nájsť optimálny počet zhlukov. Táto metóda využíva koncept hodnoty WCSS. WCSS znamenať V rámci klastrového súčtu štvorcov , ktorá definuje celkové variácie v rámci klastra. Vzorec na výpočet hodnoty WCSS (pre 3 klastre) je uvedený nižšie:
WCSS= ∑Pi v klastri 1vzdialenosť (PiC1)2+∑Pi v klastri 2vzdialenosť (PiC2)2+∑Pi v CLuster3vzdialenosť (PiC3)2Vo vyššie uvedenom vzorci WCSS,
∑Pi v klastri 1vzdialenosť (PiC1)2: Je to súčet druhej mocniny vzdialeností medzi každým dátovým bodom a jeho ťažiskom v rámci klastra1 a rovnaký pre ďalšie dva výrazy.
Na meranie vzdialenosti medzi dátovými bodmi a ťažiskom môžeme použiť akúkoľvek metódu, ako je euklidovská vzdialenosť alebo vzdialenosť na Manhattane.
Ak chcete nájsť optimálnu hodnotu klastrov, metóda lakťa sa riadi nasledujúcimi krokmi:
- Vykonáva klastrovanie K-means na danom súbore údajov pre rôzne hodnoty K (rozsahy od 1 do 10).
- Pre každú hodnotu K vypočíta hodnotu WCSS.
- Vykreslí krivku medzi vypočítanými hodnotami WCSS a počtom zhlukov K.
- Ostrý bod ohybu alebo bod grafu vyzerá ako rameno, potom sa tento bod považuje za najlepšiu hodnotu K.
Keďže graf ukazuje ostrý ohyb, ktorý vyzerá ako lakeť, preto je známy ako metóda lakťa. Graf pre lakťovú metódu vyzerá ako na obrázku nižšie:
Poznámka: Môžeme zvoliť počet zhlukov, ktorý sa rovná daným dátovým bodom. Ak zvolíme počet zhlukov rovný dátovým bodom, potom sa hodnota WCSS stane nulou a to bude koncový bod grafu.
Python Implementácia K-means Clustering Algorithm
Vo vyššie uvedenej časti sme diskutovali o algoritme K-means, teraz sa pozrime, ako ho možno implementovať pomocou Python .
Pred implementáciou pochopme, aký typ problému tu budeme riešiť. Takže máme súbor údajov Mall_Customers , čo sú údaje zákazníkov, ktorí navštívia nákupné centrum a utratia tam.
V danom súbore údajov máme Customer_Id, Pohlavie, Vek, Ročný príjem ($) a Skóre výdavkov (čo je vypočítaná hodnota, koľko zákazník minul v nákupnom centre, čím väčšia hodnota, tým viac utratil). Z tohto súboru údajov musíme vypočítať nejaké vzory, keďže ide o metódu bez dozoru, takže nevieme, čo presne vypočítať.
Kroky, ktoré je potrebné dodržať pri implementácii, sú uvedené nižšie:
Krok 1: Predspracovanie údajov Krok
Prvým krokom bude predbežné spracovanie údajov, ako sme to urobili v našich predchádzajúcich témach Regresia a klasifikácia. Ale pre problém zhlukovania sa bude líšiť od iných modelov. Poďme o tom diskutovať:
Ako sme to urobili v predchádzajúcich témach, najprv naimportujeme knižnice pre náš model, ktorý je súčasťou predspracovania údajov. Kód je uvedený nižšie:
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd
Vo vyššie uvedenom kóde je numpy importovali sme na vykonávanie matematického výpočtu, matplotlib slúži na vykreslenie grafu a pandy slúžia na správu súboru údajov.
Ďalej importujeme množinu údajov, ktorú potrebujeme použiť. Takže tu používame množinu údajov Mall_Customer_data.csv. Dá sa importovať pomocou nižšie uvedeného kódu:
# Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv')
Spustením vyššie uvedených riadkov kódu získame našu množinu údajov v Spyder IDE. Súbor údajov vyzerá ako na obrázku nižšie:
Z vyššie uvedeného súboru údajov v ňom musíme nájsť nejaké vzory.
Tu nepotrebujeme žiadnu závislú premennú na krok predbežného spracovania údajov, pretože ide o problém zhlukovania a nemáme potuchy o tom, čo určiť. Takže len pridáme riadok kódu pre maticu funkcií.
double to string java
x = dataset.iloc[:, [3, 4]].values
Ako vidíme, extrahujeme iba 3rda 4thvlastnosť. Je to preto, že na vizualizáciu modelu potrebujeme 2D graf a niektoré funkcie nie sú potrebné, ako napríklad customer_id.
Krok 2: Nájdenie optimálneho počtu zhlukov pomocou metódy lakťa
V druhom kroku sa pokúsime nájsť optimálny počet zhlukov pre náš problém s klastrovaním. Takže, ako je uvedené vyššie, na tento účel použijeme metódu lakťa.
symetrický rozdiel
Ako vieme, lakťová metóda používa koncepciu WCSS na kreslenie grafu vynesením hodnôt WCSS na os Y a počtu zhlukov na osi X. Takže vypočítame hodnotu pre WCSS pre rôzne hodnoty k v rozsahu od 1 do 10. Nižšie je uvedený kód:
#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()
Ako môžeme vidieť vo vyššie uvedenom kóde, použili sme KMeans trieda sklearn. klastrovú knižnicu na vytvorenie klastrov.
Ďalej sme vytvorili wcss_list premenná na inicializáciu prázdneho zoznamu, ktorý sa používa na uloženie hodnoty wcss vypočítanej pre rôzne hodnoty k v rozsahu od 1 do 10.
Potom sme inicializovali cyklus for pre iteráciu na inú hodnotu k v rozsahu od 1 do 10; pretože cyklus for v Pythone vylúčte výstupný limit, takže sa berie ako 11 na zahrnutie 10thhodnotu.
Zostávajúca časť kódu je podobná ako v predchádzajúcich témach, pretože sme model prispôsobili matici funkcií a potom vyniesli graf medzi počtom klastrov a WCSS.
Výkon: Po vykonaní vyššie uvedeného kódu dostaneme nasledujúci výstup:
Z vyššie uvedeného grafu môžeme vidieť, že bod lakťa je v 5. Takže počet zhlukov tu bude 5.
Krok 3: Trénovanie algoritmu K-means na trénovacej množine údajov
Keďže máme počet klastrov, môžeme teraz trénovať model na množine údajov.
Na trénovanie modelu použijeme rovnaké dva riadky kódu, aké sme použili v predchádzajúcej časti, ale tu namiesto použitia i použijeme 5, keďže vieme, že je potrebné vytvoriť 5 zhlukov. Kód je uvedený nižšie:
#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)
Prvý riadok je rovnaký ako vyššie pre vytvorenie objektu triedy KMeans.
V druhom riadku kódu sme vytvorili závislú premennú y_predpovedať trénovať modelku.
Spustením vyššie uvedených riadkov kódu získame premennú y_predict. Môžeme to skontrolovať nižšie premenný prieskumník možnosť v Spyder IDE. Teraz môžeme porovnať hodnoty y_predict s naším pôvodným súborom údajov. Zvážte nasledujúci obrázok:
Z vyššie uvedeného obrázku teraz vieme, že CustomerID 1 patrí do klastra
3 (keďže index začína od 0, teda 2 sa bude považovať za 3) a 2 patrí do klastra 4 atď.
Krok 4: Vizualizácia klastrov
Posledným krokom je vizualizácia zhlukov. Keďže pre náš model máme 5 klastrov, budeme každý klaster vizualizovať jeden po druhom.
Na vizualizáciu zhlukov použijeme bodový graf pomocou funkcie mtp.scatter() matplotlib.
#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()
Vo vyššie uvedených riadkoch kódu sme napísali kód pre každý klaster v rozsahu od 1 do 5. Prvá súradnica mtp.scatter, t.j. x[y_predict == 0, 0] obsahujúca hodnotu x pre zobrazenie matice obsahuje hodnoty a y_predict je v rozsahu od 0 do 1.
Výkon:
Výstupný obrázok jasne ukazuje päť rôznych zhlukov s rôznymi farbami. Klastre sa tvoria medzi dvoma parametrami súboru údajov; Ročný príjem zákazníka a výdavky. Farby a štítky môžeme zmeniť podľa požiadavky alebo výberu. Môžeme tiež pozorovať niektoré body z vyššie uvedených vzorov, ktoré sú uvedené nižšie:
- Cluster2 ukazuje, že zákazník má vysoký príjem, ale nízke výdavky, takže ich môžeme kategorizovať ako opatrný .
- Cluster3 ukazuje nízky príjem a tiež nízke výdavky, takže ich možno kategorizovať ako rozumné.
- Cluster4 zobrazuje zákazníkov s nízkym príjmom s veľmi vysokými výdavkami, takže ich možno zaradiť do kategórie neopatrný .
- Cluster5 zobrazuje zákazníkov s vysokým príjmom a vysokými výdavkami, aby ich bolo možné kategorizovať ako cieľové, pričom títo zákazníci môžu byť pre majiteľa nákupného centra najziskovejšími zákazníkmi.